Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
「安心・安全・安定・信頼」できるインターネットサービスを
株式会社クルウィット
井澤 志充
Rubyでオートマトン
2015/1/17 (Sat)
Kanazawa.rb #29
@DMM.comラボ
「安心・安全・安定・信頼」できるインターネットサービスを
じこしょうかい
• (株)クルウィットの取締役  兼  北北陸陸⽀支社⻑⾧長  
• 博⼠士(情報科学)
2
• ネットワークの委託研究・⾃自社サービス開発など  
• 井澤  志充  (いざわゆきみつ)
@Yukimitsu_Izawa
「安心・安全・安定・信頼」できるインターネットサービスを
オートマトンとは
• 機械⼈人形・⾃自動⼈人形のこと。  
• 18世紀から19世紀にかけてヨーロッパで盛んにつくられ
た。  
• 動⼒力力は時代により様々だが、古くは古代ギリシアで、⽔水
⼒力力を⽤用いた機械仕掛けなどが有名。  
• ⼈人形を動かすという試み⾃自体は⼈人形の起源にまでさかの
ぼり、ヒトガタを動かすことで魂が⼊入っているかのごと
く⾒見見せることで、宗教的にも深く意味を持つものであっ
た。
3
「安心・安全・安定・信頼」できるインターネットサービスを
オートマトンの例 (日本の場合)
• からくり⼈人形

(茶茶運び⼈人形)

国⽴立立科学博物館所蔵  
• 錦天満宮

からくりみくじ
4
wikipediaより
「安心・安全・安定・信頼」できるインターネットサービスを
オートマトンとは
• 情報科学の分野では、  
• 「状態」「⼊入⼒力力」「出⼒力力」  
• をもつシステムを指すことば。  
• 種類  
• 有限オートマトン  
• 決定性有限オートマトン  
• ⾮非決定性有限オートマトン  
• チューリングマシン  
• オートマトンが受理理する⾔言語と形式⽂文法によって導出される⾔言語には対
応関係がある  
• 有限オートマトン  ―  正規⽂文法  ―  正規表現:  正規⾔言語を記述できる  
• チューリングマシン  ―  句句構造⽂文法:  句句構造⾔言語を記述できる
5
「安心・安全・安定・信頼」できるインターネットサービスを
有限オートマトンとは
• Finite  State  Automaton(FSM)  
• 有限個の状態から構成されるシステム  
• 各状態をイベントや条件によって遷移する  
• UML・状態遷移図などで表現される。
6
図はwikipediaより
「安心・安全・安定・信頼」できるインターネットサービスを
決定性有限オートマトン
• Deterministic  Finite-‐‑‒state  Automaton(DFA)  
• 「状態」と「⼊入⼒力力」によって次の遷移先が⼀一意に定ま
る。→決定性  
• ⇔  Nondeterministic  Finite-‐‑‒state  Automaton(NFA)  
• 決定性有限オートマトンを作ってみましょう。
7
「安心・安全・安定・信頼」できるインターネットサービスを
StateMachine記述用のgem
8
「安心・安全・安定・信頼」できるインターネットサービスを
state_machine gem
• https://github.com/pluginaweek/state_̲machine
9
「安心・安全・安定・信頼」できるインターネットサービスを
インストール
10
% gem install state_machine
or
Gemfile:
gem “state_machine”
「安心・安全・安定・信頼」できるインターネットサービスを
簡単な例
• 以下の決定性有限オートマトンを実装してみる。
11
「安心・安全・安定・信頼」できるインターネットサービスを
ソースコード
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
「安心・安全・安定・信頼」できるインターネットサービスを
ソースコード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
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"
「安心・安全・安定・信頼」できるインターネットサービスを
Activerecordと組み合わせる
• Userクラスの課⾦金金ステート管理理をしてみる
15
「安心・安全・安定・信頼」できるインターネットサービスを
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
% 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>
「安心・安全・安定・信頼」できるインターネットサービスを
まとめ
• 「状態」を「遷移」するようなものはFSMで管理理するの
もいいかもね。  
• state_̲machine  gem  はActiverecordでも使えるよ。
18
「安心・安全・安定・信頼」できるインターネットサービスを
• Thank  You!  
• If  you  have  any  comments,  
• please  send  to:  
• Mail:  izawa@izawa.org  /  izawa@clwit.co.jp  
• Twitter:  @Yukimitsu_̲Izawa
19

More Related Content

Rubyでオートマトン