Successfully reported this slideshow.
Your SlideShare is downloading. ×

Rubyでオートマトン

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 19 Ad

Rubyでオートマトン

Download to read offline

How to use FSM library in ruby & ActiveRecord

How to use FSM library in ruby & ActiveRecord

Advertisement
Advertisement

More Related Content

Slideshows for you (20)

Similar to Rubyでオートマトン (20)

Advertisement

Recently uploaded (20)

Advertisement

Rubyでオートマトン

  1. 1. 「安心・安全・安定・信頼」できるインターネットサービスを 株式会社クルウィット 井澤 志充 Rubyでオートマトン 2015/1/17 (Sat) Kanazawa.rb #29 @DMM.comラボ
  2. 2. 「安心・安全・安定・信頼」できるインターネットサービスを じこしょうかい • (株)クルウィットの取締役  兼  北北陸陸⽀支社⻑⾧長   • 博⼠士(情報科学) 2 • ネットワークの委託研究・⾃自社サービス開発など   • 井澤  志充  (いざわゆきみつ) @Yukimitsu_Izawa
  3. 3. 「安心・安全・安定・信頼」できるインターネットサービスを オートマトンとは • 機械⼈人形・⾃自動⼈人形のこと。   • 18世紀から19世紀にかけてヨーロッパで盛んにつくられ た。   • 動⼒力力は時代により様々だが、古くは古代ギリシアで、⽔水 ⼒力力を⽤用いた機械仕掛けなどが有名。   • ⼈人形を動かすという試み⾃自体は⼈人形の起源にまでさかの ぼり、ヒトガタを動かすことで魂が⼊入っているかのごと く⾒見見せることで、宗教的にも深く意味を持つものであっ た。 3
  4. 4. 「安心・安全・安定・信頼」できるインターネットサービスを オートマトンの例 (日本の場合) • からくり⼈人形
 (茶茶運び⼈人形)
 国⽴立立科学博物館所蔵   • 錦天満宮
 からくりみくじ 4 wikipediaより
  5. 5. 「安心・安全・安定・信頼」できるインターネットサービスを オートマトンとは • 情報科学の分野では、   • 「状態」「⼊入⼒力力」「出⼒力力」   • をもつシステムを指すことば。   • 種類   • 有限オートマトン   • 決定性有限オートマトン   • ⾮非決定性有限オートマトン   • チューリングマシン   • オートマトンが受理理する⾔言語と形式⽂文法によって導出される⾔言語には対 応関係がある   • 有限オートマトン  ―  正規⽂文法  ―  正規表現:  正規⾔言語を記述できる   • チューリングマシン  ―  句句構造⽂文法:  句句構造⾔言語を記述できる 5
  6. 6. 「安心・安全・安定・信頼」できるインターネットサービスを 有限オートマトンとは • Finite  State  Automaton(FSM)   • 有限個の状態から構成されるシステム   • 各状態をイベントや条件によって遷移する   • UML・状態遷移図などで表現される。 6 図はwikipediaより
  7. 7. 「安心・安全・安定・信頼」できるインターネットサービスを 決定性有限オートマトン • Deterministic  Finite-‐‑‒state  Automaton(DFA)   • 「状態」と「⼊入⼒力力」によって次の遷移先が⼀一意に定ま る。→決定性   • ⇔  Nondeterministic  Finite-‐‑‒state  Automaton(NFA)   • 決定性有限オートマトンを作ってみましょう。 7
  8. 8. 「安心・安全・安定・信頼」できるインターネットサービスを StateMachine記述用のgem 8
  9. 9. 「安心・安全・安定・信頼」できるインターネットサービスを state_machine gem • https://github.com/pluginaweek/state_̲machine 9
  10. 10. 「安心・安全・安定・信頼」できるインターネットサービスを インストール 10 % gem install state_machine or Gemfile: gem “state_machine”
  11. 11. 「安心・安全・安定・信頼」できるインターネットサービスを 簡単な例 • 以下の決定性有限オートマトンを実装してみる。 11
  12. 12. 「安心・安全・安定・信頼」できるインターネットサービスを ソースコード 12 require 'state_machine' class DFA state_machine :state, :initial => :first do state :first state :second state :third event :up do transition :first => :second transition :second => :third end event :down do transition :third => :second transition :second => :first end end end
  13. 13. 「安心・安全・安定・信頼」できるインターネットサービスを ソースコード2 13 require 'state_machine' class DFA state_machine :state, :initial => :first do state :first do transition :on => :up, :to => :second end state :second do transition :on => :up, :to => :third transition :on => :down, :to => :first end state :third do transition :on => :down, :to => :second end event :up event :down end end
  14. 14. 「安心・安全・安定・信頼」できるインターネットサービスを 実行結果 14 dfa = DFA.new p dfa.state #=> "first" p dfa.state_events #=> [:up] p dfa.up #=> true p dfa.state #=> "second" p dfa.state_events #=> [:up, :down] p dfa.up #=> true p dfa.state #=> "third" p dfa.state_events #=> [:down] p dfa.up #=> false p dfa.state #=> "third"
  15. 15. 「安心・安全・安定・信頼」できるインターネットサービスを Activerecordと組み合わせる • Userクラスの課⾦金金ステート管理理をしてみる 15
  16. 16. 「安心・安全・安定・信頼」できるインターネットサービスを app/model/user.rb 16 class User < ActiveRecord::Base attr_accessible :status state_machine :status, :initial => :free do event :normal_charge do transition :free => :normal transition :premium => :normal end event :premium_charge do transition :normal => :premium transition :free => :premium end end end
  17. 17. 「安心・安全・安定・信頼」できるインターネットサービスを 実行結果 17 % bundle exec rails c Loading development environment (Rails 3.2.21) irb(main):001:0> u = User.create (0.0ms) begin transaction SQL (11.7ms) INSERT INTO "users" ("created_at", "status", "updated_at") VALUES (?, ?, ?) [["created_at", Fri, 16 Jan 2015 15:49:47 UTC +00:00], ["status", "free"], ["updated_at", Fri, 16 2015 15:49:47 UTC +00:00]] (1.6ms) commit transaction => #<User id: 7, status: "free", created_at: "2015-01-16 15:49:47", updated_at: "2015-01-16 15:49:47"> irb(main):002:0> u.status => "free" irb(main):003:0> u.premium_charge (0.0ms) begin transaction (0.3ms) UPDATE "users" SET "status" = 'premium', "updated_at" = '2015-01-16 15:50:04.353940' WHERE "users"."id" = 7 (2.3ms) commit transaction => true irb(main):004:0> u.status => "premium" irb(main):005:0> u.status_events => [:normal_charge] irb(main):006:0>
  18. 18. 「安心・安全・安定・信頼」できるインターネットサービスを まとめ • 「状態」を「遷移」するようなものはFSMで管理理するの もいいかもね。   • state_̲machine  gem  はActiverecordでも使えるよ。 18
  19. 19. 「安心・安全・安定・信頼」できるインターネットサービスを • Thank  You!   • If  you  have  any  comments,   • please  send  to:   • Mail:  izawa@izawa.org  /  izawa@clwit.co.jp   • Twitter:  @Yukimitsu_̲Izawa 19

×