Upload
ryuichi-ueda
View
8
Download
1
Embed Size (px)
DESCRIPTION
間違いがあったら教えてください。
Citation preview
やわらかマッドサイエンティスツのプログラミング入門
はじめてのソフトウェア工学 状態遷移図の巻
USP友の会 会長・上田隆一
2011年10月9日USP友の会勉強会
Oct. 9, 2011 USP友の会勉強会 2
今日のおみやげ
• 状態を意識せよ
以上。
Oct. 9, 2011 USP友の会勉強会 3
自己紹介
• facebook: Ryuichi UEDA
• twitter: @ryuichiueda
• あとは、以下に経歴が晒してあります・・・– http://www.slideshare.net/ryuichiueda/linuxusp– 恥ずかしい
Oct. 9, 2011 USP友の会勉強会 4
状態とは Wikipediaより
状態(じょうたい、英: state)とは、その事物が見てどのようであるか判断できるもの。
状態に名前をつける(定義する)ことで、世の中が今どのようになっているかを言葉で識別可能になる。
現実世界
言葉(記号)の世界 生きている 死んでいる
Oct. 9, 2011 USP友の会勉強会 5
状態とプログラム
• 何の関係があるの??→オオアリ– コンピュータ(計算機)の動き方に関係
• オートマトン
– 知らないで言語を覚えると迷走• (実際にはそんなことは絶対ないが)こっちが先!
– ということで、特定の言語は出てきません。
• きれいなプログラムを書いている人は、状態の概念をなんとなく体得しているはず。
Oct. 9, 2011 USP友の会勉強会 6
プログラムを簡単にする鍵:マルコフ性
• 状態をうまく定義すると、過去にあったことが将来起こることに無関係になる。
– 式で書くと st+1 = f (st, at)s: 状態、a: 入力(外部刺激)、f: 遷移ルール
• 例:– 古典物理では、世界のスナップショットと物理法則で
次の瞬間の世界が決まる。• 振り子の運動
– 計算機のメモリ配置は、ひとつ前のクロックのメモリ配置と入力で決定される。
• そもそも、過去のメモリ配置など計算機は記憶していない。
Oct. 9, 2011 USP友の会勉強会 7
例1:単振り子の例
状態 角度と角速度の数値
パラメータ(不変量) 腕の長さ、質量、重力加速度…
角速度ω
角度θ
ωt+1 = ωt – Δt g/l sinθt
θt+1 = ωtΔt + θt
ある時刻tからΔt後の時刻t+1に状態がどうなっているか
Oct. 9, 2011 USP友の会勉強会 8
ダメな例 角度しか考えない 右の絵を見て、次にどうなるか
予想がつくだろうか?
ちょっと前の角度を確認すれば角速度が求まり、次の状態が分かる。 まどろっこしい
• プログラムする対象をよく知らないとマルコフ性が保てない。
角度θ
Oct. 9, 2011 USP友の会勉強会 9
例2:計算機の動きにもマルコフ性• メモリのイチゼロが数GHzという高速周期で変わる(遷移する)
– この場合のメモリ:CPUのレジスタやHDDもすべて含む
– メモリの一部はプログラム
• 普段は自動的に遷移、たまに入力が入って条件分岐
• 遷移すると人間が喜ぶ1010010101011010101011010101010101
0110101010110010101010101010101011
1010101011001101010101010010101010
1010101001101010010101011001010101
0101010110110101010101010101010101
0110101010101010101010110101010101
キーボード
ネットワーク
金属バット
Oct. 9, 2011 USP友の会勉強会 10
ここまでのまとめ
• 実世界も計算機の世界も、以下の要素で成り立っていると考えてよい– 状態 s、外部刺激(入力) a、プログラム f、観測者の目
– この見方を身に付ければ大抵のことは解釈可能
• 状態の定義が適切なら、過去の状態を無視できる。– 今の状態と入力で次の状態が決まる
– 状態遷移図は、この理屈によって成立
Oct. 9, 2011 USP友の会勉強会 11
状態を意識したプログラミング• やること
– 状態を定義(起こりうることを数パターンにまとめる)
– 各状態で起こる入力を定義(これも数パターンにまとめる)
– 状態と入力の対から、次の状態に線を引く
– ちゃんと遷移するようにコードを書く
図:最も簡単な自動ドアのモデル
閉まっている状態
開いている状態
センサ反応センサ反応
センサ無反応
センサ無反応
↑機械を作って、この絵の通りモータを制御してやればとりあえず動く。
Oct. 9, 2011 USP友の会勉強会 12
これは禁止
• フローチャートを書く– 行為に注目→状態がよく分からない
• 上から下まで読まないと分からない– 脳に負荷がかかる。
• 最悪:スイカ割りプログラミング– ・・・して、・・・して、・・・すると、
スイカが割れるはずだ。• 複雑なUIを持つものは、まず予想通りにならない
– 類似:料理の本• 鍋の状態がよく分からないので
上手く行く気がしない(単なる八つ当たり)
センサを確かめる
ドアを開く
反応あり
YES
NO
センサを確かめる
反応ありYES
NO
スタート
ダァを閉める
ゴール図:最も簡単な自動ドアのモデル
Oct. 9, 2011 USP友の会勉強会 13
さあ始めよう
• 何を???どうやって???– ここまで風呂敷広げると、着地するのは無理
• 以下のお題を準備したのでヤる– 自動ドア
–正規表現
– csvの処理
–大変難しい問題
Oct. 9, 2011 USP友の会勉強会 14
書き方
• 何でもよいが、以下を守る。– 状態を書き、そこから矢印を引っ張る。
• 矢印が場合分け。入力などで分岐。(「など」が曲者)
• 場合分けが全ての事を網羅
• 状態の定義が場合分けに対して適切
• 場合によっては終端状態を置く– 受理・不受理
状態1
状態2
状態3
xの場合
xでない場合
yの場合
yでもzでもないzの場合 ダメ
OK
Oct. 9, 2011 USP友の会勉強会 15
リアパッド(スイッチ、衝突防止)
課題0:自動ドア変化形
• 日本にはあまりありませんが、扉になっている一方通行タイプの自動ドアがあります。このタイプのドアの状態遷移図を書いてみましょう。– 余談:水道橋にあった。
– 出展:M. Sipser著:計算理論の基礎,共立出版.
フロントパッド
(スイッチ)
図:自動ドアを上から見たところ
Oct. 9, 2011 USP友の会勉強会 16
答え
閉まっている状態
開いている状態
前
前前後後
反応なし
前後反応なし後
• 以下を網羅する。– 状態の場合分け:2通り
– 入力の場合分け:4通り
Oct. 9, 2011 USP友の会勉強会 17
課題1:正規表現を使って練習• 正規表現
– ここでは、grepで使うものを取り上げます。• こんなやつですね
– ^ab*c$
• わからなくても言葉で説明するので大丈夫
• 正規表現は、文字列に関する状態遷移を文字で表現したもの– 状態遷移図に落とせる
– grepに入る文字列が入力
Oct. 9, 2011 USP友の会勉強会 18
状態遷移図を書いてみる
q1
a
q2b
それ以外
q3c
それ以外 それ以外
改行
ダメな状態
マッチした状態
Oct. 9, 2011 USP友の会勉強会 19
やること
• 次の正規表現を状態遷移図にしてみる。– ^[^、。] [^ 、 。]*な、[^ 、 。] [^ 、 。]*は、[^ 、 。] [^ 、 。]*だ。$
– 正規表現になじみのない人向け• 一文字以上文字が続き、つぎに「な、」が来て、
その後、一文字以上文字が続き、「は、」が来て、その後、一文字以上文字が続き、「だ。」で終わる。ただし、「。」は最後だけ。「、」も二箇所だけ。
– できたら、以下もトライ• urlのフィルタ
• e-mailのフィルタ(←完璧は無理)
Oct. 9, 2011 USP友の会勉強会 20
ダメ
q1
他
な q2
な
、
他
「。」 「。」
q3
他
は q4
は
他
「。」 「。」
、 q5
他
だ q6
だ
他
「。」 「。」
。 q7改行
他
Oct. 9, 2011 USP友の会勉強会 21
課題2:状態遷移図+仕事
• excelが入出力するcsvをスペース区切りに直す• excelのcsv(・・・実は定かではありませんが、これを定義としましょう。)
– カンマ区切りのデータ• 例) a,b,c -> 「a」と「b」と「c」
– カンマがデータに入る場合、データを""で囲む• 例)"a","b,c","d" : 「a」と「b,c」と「d」
– 改行が入るときも""で囲む
– "を入れたいときは""と書く(データを""で囲んだ上で)
Oct. 9, 2011 USP友の会勉強会 22
この変換ができればOKとしましょう
• ...というのは本当はよくない態度です。
a,b,c1,2,3"""","""""","""""""""""a""","""b","c""""あい",う,え,,
a b c1 2 3" "" """"a" "b c"あ\nい\n う え_ _ _
Oct. 9, 2011 USP友の会勉強会 23
やること
• 状態遷移図を書く
• 書いた上で、どうすれば出力が得られるか思考
• その後、私がコーディングします。– 自信なし。
Oct. 9, 2011 USP友の会勉強会 24
状態遷移図を書く
改行
カンマダブルクォート
他
改行,カンマ
他
ダブルクォート
ダブルクォート
他 ダブルクォート
他
ダブルクォート 他
改行,カンマ
ダメ
ダメ
Oct. 9, 2011 USP友の会勉強会 25
仕事をさせる
改行
カンマダブルクォート
他
改行,カンマ
他
ダブルクォート
ダブルクォート
他 ダブルクォート
他
ダブルクォート 他
改行,カンマ
ダメ
ダメ
出力
出力
バッファ
出力
バッファ
エラー
エラー何もしない
バッファ
バッファ
何もしない
何もしないバッファ
出力
01
2
3
4
Oct. 9, 2011 USP友の会勉強会 26
コーディング(書くだけ)
1 #!/usr/bin/python 2 #encoding: utf-8 3 #状態遷移図を見て何も考えずに打ったコード 4 #written by 脊髄 in 上田 5 6 import os,sys 7 8 buffer = "" 9 def printBuffer(ret): 10 global buffer 11 if ret: print buffer.encode("utf_8") 12 else: print buffer.encode("utf_8"), 13 buffer = "" 14 15 def stateTrans(ch,state): 16 global buffer 17 if state == 0: 18 if ch == "\n": print "_" 19 elif ch == ",": print "_", 20 elif ch == '"': state = 2 21 else: 22 buffer += ch 23 state = 1
Oct. 9, 2011 USP友の会勉強会 27
24 elif state == 1: 25 if ch == "\n": 26 printBuffer(True) 27 state = 0 28 elif ch == ",": 29 printBuffer(False) 30 state = 0 31 elif ch == '"': sys.exit(1) 32 else: buffer += ch 33 elif state == 2: 34 if ch == "\n": 35 buffer += "\\n" 36 state = 3 37 elif ch == '"': state = 4 38 else: buffer += ch 39 elif state == 3: 40 if ch == '"': state = 4 41 elif ch == "\n": buffer += "\\n" 42 else: buffer += ch 43 elif state == 4: 44 if ch == '"': 45 state = 2 46 buffer += ch 47 elif ch == "\n": 48 printBuffer(True) 49 state = 0 50 elif ch == ",": 51 printBuffer(False) 52 state = 0 53 else: sys.exit(1) 54 55 return state 56 57 if __name__ == "__main__": 58 state = 0 59 for line in sys.stdin: 60 line = line.decode("utf_8") 61 for ch in line: 62 state = stateTrans(ch,state)
Oct. 9, 2011 USP友の会勉強会 28
課題3:鉄道経路検索
• 以下のようにサービスの質を細かくしていくと、状態の定義はどうなっていくか?– 待ち時間なし、駅内の移動時間なしとして駅から駅へ移動する最短時間を求める。
– ホーム間の移動時間を考慮
– 時刻表に基いて待ち時間を考慮
– 移動者の年齢を考慮してホーム間の移動時間を調整
– ・・・
• 難しいので答えは用意していません。一緒に悩みましょう。
Oct. 9, 2011 USP友の会勉強会 29
まとめ
• 状態について考えた
• 課題を行った– 自動ドア → ごく簡単な組み込み
–正規表現 → きれいな理論の世界の状態遷移
– csv解析 → 状態遷移+仕事
– 経路検索の問題 → 実際のシステム
Oct. 9, 2011 USP友の会勉強会 30
発展
• やっていないこと– 「どう状態を定義すればよいのか」の正解
• 王道なし、パターンはありそう。
– プログラミング言語• なにか作りたくなったら、覚えましょう。
– フォーマルな書き方• 次回へ
Oct. 9, 2011 USP友の会勉強会 31
もっと勉強したい人にお勧め• 理論
– Sipser 著, 渡辺・太田 約: 計算理論の基礎 ―1.オートマトンと言語,共立出版, 2008.
• 書き方– Fowler 著, 羽生田 約, UML モデリングのエッセンス 第三版, 翔泳社, 2005.
• 業務– 飯泉, 大槻: ずっと受けたかったソフトウェア設計の授業 ―構造化・モジュール化・仕様化の原理, 翔泳社, 2011.