Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Rubyで鍛える仕組み化プロヂュース力
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
muryoimpl
December 06, 2025
Programming
2.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rubyで鍛える仕組み化プロヂュース力
2025/12/06(土) に開催された 北陸Ruby会議01 でのトークスライド。
muryoimpl
December 06, 2025
More Decks by muryoimpl
See All by muryoimpl
人魚とたわむれる
muryoimpl
0
68
Kanzawa.rbのLT大会を支える技術の裏側を変更する Ruby on Rails + Litestream 編
muryoimpl
0
2.3k
Kanazawa.rb LT大会用/kzlt コマンドの説明 2024/01版
muryoimpl
0
3.1k
kzltコマンドの新たなソリューションについて
muryoimpl
0
3.1k
俺とTODOアプリ~Linearの変~
muryoimpl
0
2.9k
POSIX文字クラスでの躓き
muryoimpl
0
2.4k
/kzlt コマンドとは
muryoimpl
0
1.1k
meetup.kzrb.org の更新を考える 事前激闘編
muryoimpl
0
1.7k
meetup.kzrb.org の更新を 考える ゆるふわ編
muryoimpl
0
1.7k
Other Decks in Programming
See All in Programming
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
310
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
260
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
120
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
130
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
530
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
330
AWSに止められる覚悟してますか?
morizo_1984
0
150
すこし踏み込む CancellationToken
htkym
2
960
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
3
370
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
510
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
4
12k
Verilogで学ぶCPU自作入門.pdf
uyuki234
6
2.7k
Featured
See All Featured
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
A designer walks into a library…
pauljervisheath
211
25k
Discover your Explorer Soul
emna__ayadi
2
1.3k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
370
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
700
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Into the Great Unknown - MozCon
thekraken
41
2.7k
Typedesign – Prime Four
hannesfritz
42
3.2k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
430
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
820
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
550
Transcript
Rubyで鍛える仕組み化 プロヂュース力 2025/12/06 (Sat) 北陸 Ruby 会議 01 @ 石川県立図書館
muryoimpl
本日のおしながき - 自己紹介 - 私にとっての Ruby - 仕組み化どうやっている? - どうやって思いつくのか?
- 具体的な実装例
自己紹介 - 名 前: muryoimpl - 居住地: 石川県金沢市 - Kanazawa.rb
によく出没している - LT 大会向け Slack slash command 「kzlt」の創 造主兼管理者 - https://github.com/muryoimpl/kzlt-ruby
None
https://kzrb.doorkeeper.jp/events/193290
https://zenn.dev/muryoimpl
本日のおしながき - 自己紹介 - 私にとっての Ruby - 仕組み化どうやっている? - どうやって思いつくのか?
- 具体的な実装例
私にとっての Ruby - システムの第一言語 - 仕事でもプライベートでも使っている - 汎用的で多くの場面で使える - GitHub
Actions の image にもインストールされている - https://github.com/actions/runner-images
私にとっての Ruby - Monkey patch で上書き自在 - 直接 gems を書き換える必要がない
- リポジトリを fork せずとも変更可能 - クラス、モジュール、オブジェクトを抽出しやすい - 親クラスだけでなく、比較的簡単に子クラスも取得できる
Ruby で鍛える 仕組み化プロヂュース
本日のおしながき - 自己紹介 - 私にとっての Ruby - 仕組み化どうやっている? - どうやって思いつくのか?
- 具体的な実装例
普段、仕事では 趣味で仕組み化をしている
私のいう「仕組み化」とは 作業やその流れを 自分なりに、もしくは、チームとして定義し 、そ の作業が全自動、もしくは、半自動でスムーズに流れるようにす ること。 人のする作業であっても、システムが介在することでスムーズに なるならば、これもその範疇とする。
なぜ仕組み化する?
なぜ「仕組み化」するのか - 人の考えたり行動したりする負荷が減る💡 - 覚えておかなければいけない -> 不要になる - 確実に実施しなければいけない ->
不要になる - 暗黙知から形式知にできる - コード化することで共通認識を作ることができる - ヌケモレ防止、実行の一貫性確保
何を使って仕組み化する?
どのような手段で「仕組み化」するのか - Custom Cops - https://github.com/rubocop/rubocop - https://github.com/rubocop/rubocop-rails - Rake
tasks or Thor - https://github.com/rails/thor - GitHub Actions ( Rake tasksや Thor を実行する ) - (Ruby 以外だと) actions/github-script - https://github.com/actions/github-script
どう使い分けているか - Custom Cops - コードを書くうえで注意すべきこと - Rake tasks or
Thor - コード上だけではどうにもできないもの (例: DB) - Thor は引数オプションつけたいときに使う
どう使い分けているか - GitHub Actions - 全部この上で動かしている - step 上で Ruby
のワンライナー書いたりもしてる - ワークフロー自体に作用するものは + Slack 通知 - actions/github-script - GitHub 上の状態はほぼすべて取得できるので、状態の変化で 何かをさせたいときはこれを使う
何を対象にしている?
何を対象に仕組み化しているか - 開発のワークフローにある些事を対象にしている - できるだけ、さくっと実装できる範囲 - 時間かかるだけ利益の享受が遅れる - 簡易実装して時間を稼ぐ -
できれば複数人いるプロジェクトを対象にするのがよい - ニーズを自分以外からも獲得できる - 仕組み化した後の答え合わせができる
本日のおしながき - 自己紹介 - 私にとっての Ruby - 仕組み化どうやっている? - どうやって思いつくのか?
- 具体的な実装例
どうやったら思いつくのか - レビュー時に困ったことを解決できないか考える - 実はすでにみんな困り事には気づいている - だいたいこれ - ただし実装するとは言っていない =>
あとはやるだけ - 指示して AI に作ってもらう
どうやったら思いつくのか - 一発で格好よく解決しようという考えを捨てる - まず実利を得ることを考える - Custom Cop でAuto Correct
が難しいなら まず警告を出す - それも難しければ test を書いてひっかける - 指示して AI に作ってもらう
どうやったら思いつくのか - 具体的なものには個別・具体的な対策でもOK - まず問題の箇所に対して簡単に蓋をして塞ぐのが大事 - 蓋をして止めている間に、考え、実装する - 抽象度を高めて汎用的にする -
gem として適用範囲を拡大する
どうやったら思いつくのか - 法則をみつける or 法則をでっちあげる - 型( Object#is_a?, Object#kind_of? )
- ActiveSupport::DescendantsTracker.descendants - RuboCop::NodePattern::Macros#def_node_search, def_node_matcher
法則を見出す - 特定のクラスを抽出する場合 - 特定のクラスを継承したクラス Rails.application.eager_load! ApplicationRecord.descendants
法則を見出す - 特定のクラスを抽出する場合 - 特定のmodule を include したクラス Rails.application.eager_load! ObjectSpace.each_object(Class).select
do |klass| klass.included_modules.include?(module) end クラスの配列が返る
法則を見出す - 特定のクラスを抽出する場合 - 特定のmodule を extend したクラス Rails.application.eager_load! ObjectSpace.each_object(Class).select
do |klass| klass.singleton_class.ancestors.include?(module) end クラスの配列が返る
法則を見いだせたら もう勝ちに等しい
作るときに考えること
作るときに考えること - 早いの?うまいの?安いの? - さくっとできる?効果は十分?追加のインフラかかる? - Generator や Snippet はちょっと微妙…
- 最初は使われるが、慣れると皆他からコピペしてくる - AI さんはちゃんと実装したがる - 過剰に品質を気にしすぎる傾向があるので適度なところでやめ ておく
本日のおしながき - 自己紹介 - 私にとっての Ruby - 仕組み化どうやっている? - どうやって思いつくのか?
- 具体的な実装例
簡単な実装例( 1) 1. ApplicationRecord.ignored_columns に無視するカラムが登録さ れっぱなし、もしくは、宣言だけ残っていてカラムは削除されている ものがないかチェックする rake task -
ApplicationRecord.descendants を使ってテーブルに対応したモデ ルのみを抽出している - すぐカラム削除する PR 作っておけばいいじゃないって思うでしょ? それでも発生するから作った
None
簡単な実装例( 2) 2. CSVにいれる BOM の定数宣言があちこちに出てきたので 警告を出す Custom Cop を追加
- すべての BOM の宣言が生まれる前に消し去るために、Custom Cop 作って穴塞いだ後に他の宣言を消した
※対象のファイルについては、.rubocop.yml で指定している
簡単な実装例( 3) 3. 新しくリリースされた Ruby の image が公開されているかどうかを 確認する GitHub
Actions - renovate が Dockerfile の RUBY_VERSIONを更新する PR を作っ たときに、container image がリリースされていないとマージボタン 押せないようにするための仕組み
None
簡単な実装例( 4) 4. ActiveRecord のモデルに has_one/has_many が設定されて おり、かつ、dependent option 設定されているかチェック
するrake task - rubocop-rails の Rails/HasManyOrHasOneDependent は has_one/has_many を書かないとチェックできないので、 belongs_to だけ書かれていても引っ掛けられるようにした
簡単な実装例( 4) - ActiveSupport::DescendantsTracker.descendants の存在に気が ついていなかったため、ApplicationRecord.connection.tables で テーブル取得して table_name からモデルクラス名を組み立ててい
た - ↑を処理するクラスを作って、そのテストという建付けでチェックする ようにした(蓋をした)
簡単な実装例( 4) - モデル名とテーブル名が異なる(self.table_name=)場合や、関連の キーがテーブル名と不一致の場合があるため、それらに対応して gem 化した - https://github.com/muryoimpl/dependent_option_checker
簡単な実装例( 4) - 具体的な内容については、zenn.dev に暫定対応時の記事と、gem 化したときの記事があるのでこちらをみてください - https://zenn.dev/ashita_team/articles/36bc5e77651985 - https://zenn.dev/ashita_team/articles/ed08141e3110e2
まとめ
まとめ - (半) 自動化で人の負荷が減る、暗黙知から形式知にできる - 要求はあなたの中に既にある、一歩踏み出して実装すべし - 一発解決に時間かかるなら段階を踏んで解決してもいい - 法則を見出すと勝ち。見出せないならでっちあげよ
- 些事には意外と少ない行数で対応できるので、レビューの隙間を埋 めてみて