短絡的に作るRuby DSL 公開版

83

description

短絡的に作るRuby DSL 公開版

Transcript of 短絡的に作るRuby DSL 公開版

Page 1: 短絡的に作るRuby DSL 公開版
Page 2: 短絡的に作るRuby DSL 公開版

@bash0C7 こしば としあき

日本Ruby会議2010実行委員

IDE派Ruby,PHPユーザ

Page 3: 短絡的に作るRuby DSL 公開版

モバイルショッピング事業室

Page 4: 短絡的に作るRuby DSL 公開版

11/20(土)PMRailsDevCon

Page 5: 短絡的に作るRuby DSL 公開版

2/4(金)夜東京Ruby会議05

(予定)

Page 6: 短絡的に作るRuby DSL 公開版

お品書き

menu

Page 7: 短絡的に作るRuby DSL 公開版

Ruby

PowerPoint

DSL

Page 8: 短絡的に作るRuby DSL 公開版

DSL

ドメイン特化言語

Page 9: 短絡的に作るRuby DSL 公開版

Domain Specific Language

Page 10: 短絡的に作るRuby DSL 公開版

汎化

特化

Page 11: 短絡的に作るRuby DSL 公開版

汎化

Page 12: 短絡的に作るRuby DSL 公開版

Java

Perl

Ruby

COBOL

Fortran

PHP

Page 13: 短絡的に作るRuby DSL 公開版

特化

Page 14: 短絡的に作るRuby DSL 公開版

JCL

make

shell

rake

rspec

sinatra

Page 15: 短絡的に作るRuby DSL 公開版

外部

内部

Page 16: 短絡的に作るRuby DSL 公開版

独自文法

汎用言語の文法

Page 17: 短絡的に作るRuby DSL 公開版

外部DSL内部DSL

Page 18: 短絡的に作るRuby DSL 公開版

外部DSL

Page 19: 短絡的に作るRuby DSL 公開版

http://www.coplus.jp/download/m/GC88-6578-09(c8865789).pdf

//INIT JOB 'accounting_info',MSGLEVEL=1

//JESDS OUTPUT JESDS=ALL,OUTDISP=(PURGE,WRITE)

//INIT EXEC INIT

//DD1 DD DSN=SYSTEM.ACCOUNT.DATA,DISP=SHR

//*

By TreyGeek (talk) 18:52, 16 May 2008 (UTC).TreyGeek at en.wikipedia [Public domain], from Wikimedia Commons

Page 20: 短絡的に作るRuby DSL 公開版

内部DSL

Page 21: 短絡的に作るRuby DSL 公開版

rake

rspec

sinatra

Page 22: 短絡的に作るRuby DSL 公開版

rake

rule '.o' => '.c' do |t|

sh "cc -c -o #{t.name} #{t.source}"

end

file 'hello' => ['hello.o'] do

sh 'cc -o hello hello.o'

end

http://ja.wikipedia.org/wiki/Rake

Page 23: 短絡的に作るRuby DSL 公開版

rspec

describe Array, "when empty" do

before do

@empty_array = []

end

it "should be empty" do

@empty_array.should be_empty

endhttp://jp.rubyist.net/magazine/?0021-Rspec

Page 24: 短絡的に作るRuby DSL 公開版

sinatra

get '/hi' do

"Hello World!"

end

http://www.sinatrarb.com/

Page 25: 短絡的に作るRuby DSL 公開版

いつ作る?

どう作る?

Page 26: 短絡的に作るRuby DSL 公開版
Page 27: 短絡的に作るRuby DSL 公開版

プレゼン準備

Page 28: 短絡的に作るRuby DSL 公開版
Page 29: 短絡的に作るRuby DSL 公開版

Ruby

DSL

PowerPoint

Page 30: 短絡的に作るRuby DSL 公開版

DSL

Page 31: 短絡的に作るRuby DSL 公開版

初期スケッチ

presentation do

slides do

slide {……}

slide {……}

end

end

Page 32: 短絡的に作るRuby DSL 公開版

実装したDSL

theme "theme.potx"

title "短絡的に作るRubyDSL"

text "Domail Specitific Language"

text "特定の領域にのみ特化"

division "DSL世界の2軸"

section "Generic⇔Specitific"

Page 33: 短絡的に作るRuby DSL 公開版

ロード

評価

実行

Page 34: 短絡的に作るRuby DSL 公開版

>pptgen.rb [DSL file]

Page 35: 短絡的に作るRuby DSL 公開版

PresentationDSLProcesser.new(ARGF.read)

def initialize(dsl_string)

@app = WIN32OLE.new('Powerpoint.application')

@presentation = @app.Presentations.Add

eval(dsl_string)

@presentation.saveas('aaa.pptx')

@presentation.close

@app.quit

end

Page 36: 短絡的に作るRuby DSL 公開版

eval(dsl_string)

動けばええねん!

Page 37: 短絡的に作るRuby DSL 公開版

theme "theme.potx"

title "短絡的に作るRubyDSL"

text "Domail Specitific Language"

text "特定の領域にのみ特化"

division "DSL世界の2軸"

section "Generic⇔Specitific"

Page 38: 短絡的に作るRuby DSL 公開版

スライド追加

スライド枚数++

レイアウト設定

文字列を設定

Page 39: 短絡的に作るRuby DSL 公開版

title "短絡的に作るRubyDSL"

Page 40: 短絡的に作るRuby DSL 公開版

title "短絡的に作るRubyDSL" → title(param)

def title(param)

add_slide(1)

set_title(param)

end

Page 41: 短絡的に作るRuby DSL 公開版

title(param) → add_slide(1)

def add_slide(layout)

@current_slide =

@presentation.Slides.AddSlide(@presentation.Slides.Count + 1,@presentation.SlideMaster.

CustomLayouts(1))

@current_slide.layout = layout

end

Page 42: 短絡的に作るRuby DSL 公開版

title "短絡的に作るRubyDSL" → title(param)

def title(param)

add_slide(1)

set_title(param)

end

Page 43: 短絡的に作るRuby DSL 公開版

title(param) → set_title(param)

def set_title(param)

@current_slide.Shapes.Placeholders(1).TextFrame.TextRange.Text = param

end

Page 44: 短絡的に作るRuby DSL 公開版

スライド追加

スライド枚数++

レイアウト設定

文字列を設定

Page 45: 短絡的に作るRuby DSL 公開版

title "短絡的に作るRubyDSL"

Page 46: 短絡的に作るRuby DSL 公開版

一言title(文字列)

Page 47: 短絡的に作るRuby DSL 公開版
Page 48: 短絡的に作るRuby DSL 公開版

PowerPoint

Page 49: 短絡的に作るRuby DSL 公開版

Win32OLE標準添付ライブラリ

Page 50: 短絡的に作るRuby DSL 公開版

WIN32OLE.new('Powerpoint.application')

PowerPointをRubyから

Page 51: 短絡的に作るRuby DSL 公開版

Interaction.CreateObject("Powerpoint.application")

PowerPointをxxxから

Page 52: 短絡的に作るRuby DSL 公開版

CreateObject("Powerpoint.application")

PowerPointをVBA/VBSから

Page 53: 短絡的に作るRuby DSL 公開版

VBA/VBS→pptRuby→ppt

Page 54: 短絡的に作るRuby DSL 公開版

def initialize(presen)

@app = WIN32OLE.new('Powerpoint.application')

@presentation = @app.Presentations.Add

eval(presen)

@presentation.saveas('aaa.pptx')

@presentation.close

@app.quit

end

Page 55: 短絡的に作るRuby DSL 公開版

VBA≒Office付属VB

VBAライブラリ

Interactionモジュール

CreateObject関数

Page 56: 短絡的に作るRuby DSL 公開版

Ruby

標準添付ライブラリ

Win32OLEクラス

Page 58: 短絡的に作るRuby DSL 公開版
Page 59: 短絡的に作るRuby DSL 公開版
Page 61: 短絡的に作るRuby DSL 公開版

まとめ

Page 62: 短絡的に作るRuby DSL 公開版

Rubyの文法

特定用途特化

Page 63: 短絡的に作るRuby DSL 公開版

Ruby DSL

Page 64: 短絡的に作るRuby DSL 公開版

title "短絡的に作るRubyDSL"

欲しいものを端的に表現

Page 65: 短絡的に作るRuby DSL 公開版

いつ作る?

Page 66: 短絡的に作るRuby DSL 公開版

設計書生成

ビジネス文章生成

テストケース生成

ソースコード生成

Page 67: 短絡的に作るRuby DSL 公開版

どう作る?

Page 68: 短絡的に作るRuby DSL 公開版

eval(dsl_string)

動けばええねん!

Page 69: 短絡的に作るRuby DSL 公開版

Win32OLE

erb

他色々!

Page 70: 短絡的に作るRuby DSL 公開版
Page 71: 短絡的に作るRuby DSL 公開版

Happy DSLing!

ご清聴ありがとうございました

Page 72: 短絡的に作るRuby DSL 公開版

おまけ

Page 73: 短絡的に作るRuby DSL 公開版

VBA DSL

preview版

Page 74: 短絡的に作るRuby DSL 公開版
Page 75: 短絡的に作るRuby DSL 公開版

DSLクラス

Public Sub text(param As String)

collection.Add "テキスト:" & param

End Sub

Public Sub title(param As String)

collection.Add "タイトル:" & param

End Sub

Page 76: 短絡的に作るRuby DSL 公開版

解釈・実行

Dim dsl As New dsl

Dim r As Range

For Each r In ActiveSheet.UsedRange.Rows

CallByName dsl, r.Columns(2),

VbMethod, r.Columns(3)

Next r

dsl.disp

Page 77: 短絡的に作るRuby DSL 公開版
Page 78: 短絡的に作るRuby DSL 公開版

PHP DSL

no sample

Page 79: 短絡的に作るRuby DSL 公開版
Page 80: 短絡的に作るRuby DSL 公開版

one more thing...

Page 81: 短絡的に作るRuby DSL 公開版

即興DSL

Page 82: 短絡的に作るRuby DSL 公開版

方眼紙ExcelDSL

Page 83: 短絡的に作るRuby DSL 公開版