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
Active Directory と Entra ID のむむむな関係
murachiakira
PRO
0
490
Software Engineering in an AI-Driven World
erikjhordan_rey
0
110
「作れる」と「リリースできる」の間にあったもの── PdMを外して見えた、PdMがやるべき仕事/Buildable ≠ Shippable: What Removing the PM Taught Me About the PM’s Job
yappli_developers
0
440
OneLakeをデータソースにした AI Search(Foundry IQ)の ライフサイクル管理
ryuseiiida
0
220
現場を動かすAIエージェント#2_製造業現場でのAI活用から見た、ハマる罠と実践知
kintotechdev
1
130
Copilot Coworkで「みのるん式」やってみた
minorun365
PRO
2
1.5k
AIコーディングはじめました
miso
0
150
AI AgentによるEmbedded SREの取り組み
tgidgd
1
330
1週間、Opus封印でお願いします
kintotechdev
1
440
新卒エンジニア、 介護士になる
ryu1013
1
680
Claude Codeから見る、エンジニアの世界の変容とその先
oikon48
8
5.3k
増え続けるプロダクトの品質をどう担保するか。ProductSpecとTypeScriptによる取り組み
joere
3
370
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3.1k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
350
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
The browser strikes back
jonoalderson
0
1.9k
Mobile First: as difficult as doing things right
swwweet
225
10k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Balancing Empowerment & Direction
lara
6
1.4k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
480
Rails Girls Zürich Keynote
gr2m
96
14k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
470
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
350
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