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
Rubicureに学ぶメタプログラミング
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
USAMI Kenta
September 12, 2014
Technology
230
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rubicureに学ぶメタプログラミング
Rubyにおけるメタプログラミングの概要について
USAMI Kenta
September 12, 2014
More Decks by USAMI Kenta
See All by USAMI Kenta
学ばないDSL (渋谷.rb)
zonuexe
0
180
Other Decks in Technology
See All in Technology
Agile and AI Redmine Japan 2026
hiranabe
4
510
MySQL & MySQL HeatWave Report - June 2026
freshdaz
0
220
スタートアップにAmazon EKSは早すぎる? マルチプロダクト戦略を加速する Platform Engineeringの実践 / Is Amazon EKS Too Soon for Startups? Practical Platform Engineering to Accelerate a Multi-Product Strategy
elmodev09
1
1.9k
Multi-Agent並列開発を 安全に回すための技術 / Technology for Safely Multi-Agent Parallel Development
tooppoo
0
220
When Platform Engineering Meets GenAI
sucitw
0
200
次世代ランサムウェア対策の考察 / 20260704 Mitsutoshi Matsuo
shift_evolve
PRO
2
370
アラート調査向けAIエージェントの本番導入とその後/AI Agents for Alert Investigation: Production Deployment and After
taddy_919
1
260
Microsoft のサポートとフィードバック総まとめ
murachiakira
PRO
0
120
40代で“やっとエンジニアになれた”――閉じた学びを開き、空の青さを知る / 20260628 Naoki Takahashi
shift_evolve
PRO
4
1.3k
どうして今サーバーサイドKotlinを選択したのか
nealle
0
130
Text-to-SQLをAgentCoreで実現し、生成されるSQLの精度を定量的に評価する
yakumo
2
160
デジタル・デザイン:次の50年を描く「進化する青写真」
y150saya
0
160
Featured
See All Featured
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
A designer walks into a library…
pauljervisheath
211
24k
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Music & Morning Musume
bryan
47
7.2k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
620
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
230
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
Discover your Explorer Soul
emna__ayadi
2
1.1k
Transcript
Rubicureに学ぶ メタプログラミング @tadsan / 2014-09-12
お前 is 誰よ うさみけんた / @tadsan スマートフォン向けのAPIとか、pixiv.netの 細かいところの実装/修正を担当する屋さん PHPたのしい! 一番好きなテンプレートエンジンです
趣味ではRubyを書くことがあるよ! 最近社内ではGoとScalaの圧力が高まってつらい
_人人人人人人人人人人人人人人_ > たまには趣味の話をします <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
Rubyの文法 obj.meth と obj.meth() の意味は同じ PHPやPythonとは異なる振舞
Rubyの文法 クラスはオブジェクト class Obj def foo; :instance_foo; end def self.foo;
:class_foo; end end
メタプログラミングとは 誤解をおそれずにざっくり説明すると、 「プログラムを作るプログラムを作ること」 DRYを志向して重複を避け続けると、 人類はいつしかメタプログラミングに至る 常に最適な抽象化手法であるとは限らない Ruby on RailsはRubyにおけるDSLと メタプログラミング技術の粋を集めた結晶
趣味 _人人人人人人人人人人人人人_ > Rubyにおける代表的な < > プリキュア実装 <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
_人人人人人人人人人人人人人_ > Rubyにおける代表的な < > プリキュア実装 <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
None
_人人人人人人人人人人_ > プリキュア実装?! <  ̄Y^Y^Y^Y^Y^Y^Y^Y ̄
Rubicureとは sue445氏が開発したRuby gemライブラリ gem install rubicure で導入できる 起源は別にある Perl/Acme::PrettyCure and
Python/pycure APIはAcme::PrettyCureから強い影響を受けてる
経緯 昨年開催された「プリキュアハッカソン」で drillbitsさんがPythonで「Pycure」を実装 ハッカソン主催者のsue445氏がハッカソン後に Rubyで「Rubicure」を実装 今年のプリキュアハッカソン2で僕がPHPでry でも進捗でなかったので、とっととおうちに 帰ってからRubicureにPull Requestを送った
Rubicureとは 今のプリキュアってなんだっけと思ったとする ruby -rubicure -e'p Precure.now' ドキドキ!プリキュアの名前を知りたいとする p Precure.dokidoki.girls.map(&:name) ピカリンじゃんけん
Cure.peace.pikarin_janken
実装の特徴 データの処理は複雑なロジックを書かず、 参照で解決できるものはYAML側で解決してる (エイリアスなど) プリキュア(Girlオブジェクト)はシングルトン としてキャッシュされる 新しいプリキュアはYAMLにデータを追加する
method_missing Rubyの代表的なメタプログラミング手法 Cure.peace と書くとキュアピースを取得できる が、def peace みたいな定義がコード上に存在 するわけではない オブジェクトにメソッドが存在しなかったとき method_missing(name,
args) が呼ばれる
特異メソッド キュアピースとピカリンじゃんけんをしたい! オブジェクト固有のメソッドを定義できる プリキュアは全てGirlオブジェクトだが、 キュアピースのインスタンスのみに pikarin_jankenメソッドを定義する
変身 変身はプリキュア/シリーズごとに異なる デュアルオーロラウェーブ、メタモルフォーゼ 前述の通りAcme::PrettyCureのAPIを継承してる ので、デフォルトの変身メッセージ(メソッド) は transform! である
_人人人人人人人人人人_ > トランスフォーム! <  ̄Y^Y^Y^Y^Y^Y^Y^Y ̄
変身 そんなプリキュアは存在しない プリキュア5はメタモルフォーゼさせたいし、 フレッシュはチェインジさせたい プリキュアごとにYAMLで変身コールを定義 Girl#method_missing で呼ばれたメソッド名が 固有の変身コールと一致すればtransform!する
ruby -rubicure 普通は require "rubicure" で読み込む シェルからruby -rubicureやirb -rubicureで 起動することができる
ruby -r json で、JSONライブラリがロードさ れた状態になるので、ワンライナーに便利 -r jsonの間のスペースは省くことができる
ruby -rubicure あとは… わかるな? このアイディアは別に固有のものではない Ruby 2.1.0 - library un
標準的なUnix風ユーティリティ ruby -run -e rm './*.rb' 錯覚を利用した人間に対するメタプログラミング
むりやりなまとめ メタプログラミングで煩雑な避けられる …ことがある 検索性が低くなるので、ルールが掴めないと他 のひとがコードを読んだりしにくくなる ご利用は計画的に GitHubのプルリクエストには学びがある
None
None
None
_ \ヽ, ,、 `''|/ノ .|
_ | \`ヽ、| \, V `L,,_ |ヽ、) .| / ,、 / ヽYノ .| r''ヽ、.| | `ー-ヽ|ヮ | `| ヽ, ,r .| ヽ,r'''ヽ!'-‐'''''ヽ、ノ ,,,..---r'",r, , 、`ヽ、 ヾ ヽ、__/ ./ハレハ i`ヽ、 `''r`ミ_ .レ//r,,,、 レ'レハヾ, L,,_ `ヽ、 "レ, l;;;l l;;;l`i.リレ' リ ̄~~ ヽ、 ワ `"/-'`'`' `''''''''" ┼ヽ -|r‐、. レ | d⌒) ./| _ノ __ノ 使用フォント セプテンバーM・L Migu 2M