Slide 1

Slide 1 text

RubyのWAFコードリーディング   勉強会を開いてみた 2012/05/16   shibuya.rb  [:20120516]     生井智司(@ainame)  

Slide 2

Slide 2 text

自己紹介 •  名前   –  生井智司(Satoshi  NAMAI)   –  @ainame   •  職業   –  Webプログラマ(新卒)/  Rubyに似た何かを書く仕事   •  Ruby歴   –  3年前に卒研で簡単なスクリプト書いた所から   –  本格的に勉強したのは昨年から   •  成果物   –  hDps://github.com/ainame/rixi

Slide 3

Slide 3 text

RubyのWAFコードリーディング   勉強会とは •  きっかけ   –  思いつき   •  目標   –  オレオレ   フレームワーク   を作る   じゃあ,とりあえず   読んでみよう!!  

Slide 4

Slide 4 text

予定 •  Sinatra     –  Rack/Rackアプリの作り方:低レイヤーな部分   –  DSLの実装方法:黒魔術   –  テンプレートエンジン:gemのTilt  ← イマココ   •  Padrino   –  Helperメソッド:テンプレートに提供するためには   –  モジュラー化:機能をモジュールに切り分ける方法   •  Ramaze   –  シンプルな実装:黒魔術少ない/コア(innate)は   2000行くらいらしい   •  Rails  3.X :目標

Slide 5

Slide 5 text

予定について •  あくまでも予定なので仮   •  良いWAFや、WAFの気になる箇所があれば   教えてください   •  WAFを作ることが目標なのであって   言語はあくまでも手段   •  ということでRubyでなくても可  

Slide 6

Slide 6 text

Sinatraについて •  せっかくなので   •  コードリーディングしてきた成果を   •  さくっと紹介します  

Slide 7

Slide 7 text

ファイル構成について •  main.rb   –  Classic  Styleの   起動部分   –  32行   •  base.rb   –  Sinatra::*を定義   –  1773  行   •  showexcepXons.rb   –  エラー画面実装   –  Rack::ShowExcepXons   を継承  

Slide 8

Slide 8 text

main.rb •  Classic  styleで         という感じで起動するための処理   •  extend  Sinatra::Delegetor  でDSLをmainの特異メソッドにして   トップレベルでget  ,  post,  … のDSLを実現   –  Classic  Sinatra  が定義するトップレベルメソッドの話    $  ruby  app.rb  –p  4567  –e  development  

Slide 9

Slide 9 text

base.rb •  Sinatra::Requestクラス,    Sinatra::Responseクラス   –  Rack::Request,  Rack::Responseを継承   •  Sinatra::Baseクラス   –  Rackアプリ部分(iniXalize,  call,  call!)   –  以下のモジュールをinclude   •  Sinatra::Helpersモジュール   –  ルーティングやフィルター、view定義周りのメソッド   •  Sinatra::Templatesモジュール   –  GemのTiltとのやり取りをする部分  

Slide 10

Slide 10 text

黒魔術その1 •  Sinatra::Base#set メソッド   – 設定をセットするDSL(アプリ書くときも使う)   – 第1引数の名前のgeDer,  seDerを定義する   – Procオブジェクトも設定可能  

Slide 11

Slide 11 text

動的な特異メソッドの定義

Slide 12

Slide 12 text

設定の参照方法 seengs.hoge  → self.class.seengs.self.hoge()

Slide 13

Slide 13 text

黒魔術(?)その2 •  Sinatra::Base#invokeメソッド  

Slide 14

Slide 14 text

invokeメソッド •  ブロックで渡された中の処理で   throw  :halt されたら大域脱出するメソッド   •  エラー時にhaltメソッドthrow  :haltする   •  返り値をresponseのbodyにセットする  

Slide 15

Slide 15 text

まだまだあります!! •  ルーティングの処理   •  Tiltにインスタンス変数を受け渡す処理   •  etc….  

Slide 16

Slide 16 text

続きはWebで!!! 詳しくは後でブログにまとめます…   現在、研修の課題で忙殺されております…  

Slide 17

Slide 17 text

コードリーディングのコツ •  黒魔術が多いので事前にメタプロRubyで予習   •  SinatraはRackアプリであるためRackの知識が必要 Rack::XXXを継承しているため,時にはRackを読む •  HTTPのステータスコードやヘッダーの扱いについて, いつでも調べられるようにRFC2616を開いておく   •  refe  や  pry  でいつでも挙動を確認できるようにする

Slide 18

Slide 18 text

告知 •  第2回について   –  日時   •  5月26日(土) 13:00〜18:00   –  場所   •  株式会社ミクシィ 7階 セミナールーム715   –  定員   •  30人(現在12名)   –  備考   •  電源,ネット環境あり   –  参加方法   •  RubyのWAFコードリーディング勉強会 第2回 on  Zusaar

Slide 19

Slide 19 text

今日は   この辺り ミクシィは   こちら

Slide 20

Slide 20 text

  よろしくお願いします