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
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エージェントを雇う前に決める5つのこと
knishioka
1
140
AI駆動開発を組織で促すために
lycorptech_jp
PRO
7
9.2k
プロダクトエンジニアに必要な「いい感じ」に作る能力 〜たくさん作れる時代に、どこまで作るかの決め方〜
jnishime_dresscode
1
470
Introduction to Sansan Meishi Maker Development Engineer
sansan33
PRO
0
470
多摩川(.dev)ランニング入門 / Tamagawa.dev#3
fujiwara3
3
190
20260903 Tokyo Jazug Night #62 | Azure エンジニアよ、 その環境は本当にセキュアか?
olivia_0707
1
370
Data Hubグループ 紹介資料
sansan33
PRO
0
3.2k
いま好きなこと 最初はそんなに好きじゃなかった #tamagawadev
nishiuma
1
190
Kiro Crewしか勝たん!?
miu_crescent
PRO
0
140
GuardDuty 検知対応を DevOps Agent で効率化しようとしている話 / GuardDuty Investigations with DevOps Agent
masahirokawahara
1
120
Level Up Your CDK DX: 5 Tools I’ve Been Building
gotok365
2
170
Kiro5兄弟のいまどきのセキュリティ基礎知識
kentapapa
0
500
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Evolving SEO for Evolving Search Engines
ryanjones
0
270
A better future with KSS
kneath
240
18k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
390
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
590
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
260
Agile that works and the tools we love
rasmusluckow
331
22k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
640
A Modern Web Designer's Workflow
chriscoyier
698
190k
It's Worth the Effort
3n
188
29k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
First, design no harm
axbom
PRO
2
1.3k
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