Slide 1

Slide 1 text

Rubicureに学ぶ
 メタプログラミング @tadsan / 2014-09-12

Slide 2

Slide 2 text

お前 is 誰よ うさみけんた / @tadsan スマートフォン向けのAPIとか、pixiv.netの
 細かいところの実装/修正を担当する屋さん PHPたのしい! 一番好きなテンプレートエンジンです 趣味ではRubyを書くことがあるよ! 最近社内ではGoとScalaの圧力が高まってつらい

Slide 3

Slide 3 text

_人人人人人人人人人人人人人人_ > たまには趣味の話をします <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

Slide 4

Slide 4 text

Rubyの文法 obj.meth と obj.meth() の意味は同じ PHPやPythonとは異なる振舞

Slide 5

Slide 5 text

Rubyの文法 クラスはオブジェクト class Obj
 def foo; :instance_foo; end
 def self.foo; :class_foo; end
 end

Slide 6

Slide 6 text

メタプログラミングとは 誤解をおそれずにざっくり説明すると、
 「プログラムを作るプログラムを作ること」 DRYを志向して重複を避け続けると、
 人類はいつしかメタプログラミングに至る 常に最適な抽象化手法であるとは限らない Ruby on RailsはRubyにおけるDSLと
 メタプログラミング技術の粋を集めた結晶

Slide 7

Slide 7 text

趣味 _人人人人人人人人人人人人人_ >  Rubyにおける代表的な  < >    プリキュア実装   <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

Slide 8

Slide 8 text

_人人人人人人人人人人人人人_ >  Rubyにおける代表的な  < >    プリキュア実装   <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

_人人人人人人人人人人_ >  プリキュア実装?!  <  ̄Y^Y^Y^Y^Y^Y^Y^Y ̄

Slide 11

Slide 11 text

Rubicureとは sue445氏が開発したRuby gemライブラリ gem install rubicure で導入できる 起源は別にある Perl/Acme::PrettyCure and Python/pycure APIはAcme::PrettyCureから強い影響を受けてる

Slide 12

Slide 12 text

経緯 昨年開催された「プリキュアハッカソン」で drillbitsさんがPythonで「Pycure」を実装 ハッカソン主催者のsue445氏がハッカソン後に Rubyで「Rubicure」を実装 今年のプリキュアハッカソン2で僕がPHPでry でも進捗でなかったので、とっととおうちに
 帰ってからRubicureにPull Requestを送った

Slide 13

Slide 13 text

Rubicureとは 今のプリキュアってなんだっけと思ったとする
 ruby -rubicure -e'p Precure.now' ドキドキ!プリキュアの名前を知りたいとする
 p Precure.dokidoki.girls.map(&:name) ピカリンじゃんけん
 Cure.peace.pikarin_janken

Slide 14

Slide 14 text

実装の特徴 データの処理は複雑なロジックを書かず、
 参照で解決できるものはYAML側で解決してる
 (エイリアスなど) プリキュア(Girlオブジェクト)はシングルトン
 としてキャッシュされる 新しいプリキュアはYAMLにデータを追加する

Slide 15

Slide 15 text

method_missing Rubyの代表的なメタプログラミング手法 Cure.peace と書くとキュアピースを取得できる が、def peace みたいな定義がコード上に存在 するわけではない オブジェクトにメソッドが存在しなかったとき
 method_missing(name, args) が呼ばれる

Slide 16

Slide 16 text

特異メソッド キュアピースとピカリンじゃんけんをしたい! オブジェクト固有のメソッドを定義できる プリキュアは全てGirlオブジェクトだが、
 キュアピースのインスタンスのみに
 pikarin_jankenメソッドを定義する

Slide 17

Slide 17 text

変身 変身はプリキュア/シリーズごとに異なる デュアルオーロラウェーブ、メタモルフォーゼ 前述の通りAcme::PrettyCureのAPIを継承してる ので、デフォルトの変身メッセージ(メソッド) は transform! である

Slide 18

Slide 18 text

_人人人人人人人人人人_ > トランスフォーム! <  ̄Y^Y^Y^Y^Y^Y^Y^Y ̄

Slide 19

Slide 19 text

変身 そんなプリキュアは存在しない プリキュア5はメタモルフォーゼさせたいし、
 フレッシュはチェインジさせたい プリキュアごとにYAMLで変身コールを定義 Girl#method_missing で呼ばれたメソッド名が 固有の変身コールと一致すればtransform!する

Slide 20

Slide 20 text

ruby -rubicure 普通は require "rubicure" で読み込む シェルからruby -rubicureやirb -rubicureで
 起動することができる ruby -r json で、JSONライブラリがロードさ れた状態になるので、ワンライナーに便利 -r jsonの間のスペースは省くことができる

Slide 21

Slide 21 text

ruby -rubicure あとは… わかるな? このアイディアは別に固有のものではない Ruby 2.1.0 - library un 標準的なUnix風ユーティリティ ruby -run -e rm './*.rb' 錯覚を利用した人間に対するメタプログラミング

Slide 22

Slide 22 text

むりやりなまとめ メタプログラミングで煩雑な避けられる …ことがある 検索性が低くなるので、ルールが掴めないと他 のひとがコードを読んだりしにくくなる ご利用は計画的に GitHubのプルリクエストには学びがある

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

   _    \ヽ, ,、      `''|/ノ       .|  _    |  \`ヽ、|    \, V       `L,,_       |ヽ、)      .|     /           ,、     /        ヽYノ    .|       r''ヽ、.|    |        `ー-ヽ|ヮ     |            `|    ヽ,    ,r      .|      ヽ,r'''ヽ!'-‐'''''ヽ、ノ  ,,,..---r'",r, , 、`ヽ、 ヾ  ヽ、__/ ./ハレハ i`ヽ、 `''r`ミ_    .レ//r,,,、 レ'レハヾ,  L,,_ `ヽ、     "レ, l;;;l   l;;;l`i.リレ' リ ̄~~      ヽ、 ワ `"/-'`'`'        `''''''''"      ┼ヽ  -|r‐、. レ |                  d⌒) ./| _ノ  __ノ 使用フォント セプテンバーM・L Migu 2M