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
Rubicureに学ぶメタプログラミング
Search
USAMI Kenta
September 12, 2014
Technology
240
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
AIに任せた品質は、誰が見立てるのか - AI時代のテストマネジメント
nakanao
3
2.1k
AIを活用するために決めた "やらないこと" - 価値に注目する / Not betting on AI
soudai
PRO
2
550
EventBridge に「合流」はない ― サーバーレスのワークフローを育てるということ / No Join in EventBridge
yusukeshimizu
2
110
白金鉱業Meetup Vol.25 アウトカムが二値のデータに対するCausal Impact
brainpadpr
0
230
beyond jj: config & tools ecosystem
indirect
0
3.1k
目の前の楽しいが人生を変える - コミュニティの螺旋の歩き方と楽しむコツ / change your life
soudai
PRO
5
640
Minecraft JavaのMODをSwiftで作る
1mash0
0
180
すぐできる衛星通信対応 あとは山奥に行くだけ
tatetate55
0
130
事業課題から技術的負債に向き合う
sansantech
PRO
2
1.9k
Railsのように考える: See through the Master
snoozer05
PRO
4
1k
安心して変更できるWebフロントエンドの作り方
pirosikick
5
2.7k
ADKで始める業務改善 - AIエージェント開発時の考えと設計
harappa80
2
180
Featured
See All Featured
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
460
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
530
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.8k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
It's Worth the Effort
3n
188
29k
GitHub's CSS Performance
jonrohan
1033
470k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
420
Building Adaptive Systems
keathley
44
3.2k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
Chasing Engaging Ingredients in Design
codingconduct
0
310
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
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