T time

プログラミングや電子工作、各種ガジェットに関するブログです。

プログラマーの気持ちになって自動改札を通る

f:id:tatur0u:20150618144130p:plain ぱくたそ - フリー写真素材・無料ダウンロード

プログラマーの気持ちになると、駅の自動改札をスムーズに通れる。という話しです。

自動改札。 便利ですよね。 特にSuicaをはじめとするIC乗車券が導入されてからは、切符やカードを鞄からを取り出す必要もなくなり、とても便利になりました。 携帯電話でも通れますしね*1。 タッチアンドゴー万歳!

しかし、スムーズに通れるようになると少しの遅延が気になりますよね。

特に、Suicaのタッチに失敗して改札を通れない場合、その人の対応によってはなかなか混雑が解消しないことがあります。

そんなときは、プログラマーの気持ちになってみましょう。

なぜ?

なぜプログラマーの気持ちになってみるのでしょう? それは自動改札もプログラミングにより制御されているからです。

自動改札はコンピューターとセンサー、モーターやアクチュエーター*2の塊で、「Suicaがタッチされたら改札を開ける」という命令を受けて動いています。 自動改札に命令するのはプログラマー*3です。 つまり、プログラマーの気持ちがわかると自動改札の動きを予測でき、自動改札をスムーズに通れるようになります。

状態遷移

プログラマーは自動改札に命令するとき様々なことを考えますが、その一つが「状態遷移」です。

状態とは何でしょう。 国語辞書にはこうあります。

人や物事の、ある時点でのありさま。
じょうたい【状態/情態】の意味 - 国語辞書 - goo辞書

これを自動改札に置き換えると「人が居ることを認識している」「改札が開いている」などが "状態" と呼べそうです。

プログラマーは、自動改札に関する状態を考え、その状態に合わせて命令を出します。 例えば

「人が居ることを認識している」状態のときは、自動改札を閉じろ。

という具合です。

初期状態

では、まずは一番初めの状態を考えましょう。 物事には始まりがあります。 これを「初期状態」と言います。

自動改札の初期状態は何でしょう? 自動改札には人がひっきりなしに通っています。 改札も開いたり閉じたりしています。 Suicaがタッチされたり切符が挿入されたりします。 どの状態が「初期」と言えるのでしょうか。

それは、電源を入れたときです。

自動改札の電源を入れるところを見たことがありますか? 私はありません。 電源ボタンがあるかあるかどうかすら知りません。
でも、おそらく電源を入れたときには、自動改札の中に人は居ないと思います。Suicaもタッチされていないと思います。 なぜならお客さんが居ないですからね。

なので、初期状態は「人が居ない事を認識している」状態でしょう。 ちょっと長いので「人が居ない」状態としましょう。 これを図に表すとこんな感じです。

http://www.plantuml.com:80/plantuml/png/YzQALT3LjLDuiclNuyQUfnjR7pUkUjpO0W00

これは 状態遷移図 と言います。 ●から始まり無条件で「人が居ない」状態になります。

「人が居る」状態

「人が居ない」状態があれば「人が居る」状態がありますね。

http://goo.gl/6Fm6uc

「人が居ない」から「人が居る」に移る条件は "人が居る" ことですね。当たり前です。

人間は目で見て「人が居る」事を認識しますが、コンピューターは人感センサーを使って認識します。

あと、自動改札は改札を開閉しなきゃいけないので、それも書き加えておきましょう。
「人が居ない」状態になったら*4は改札を開け、「人が居る」状態になったら改札を閉じます。 開閉が逆な気がしますが、(Suicaをタッチせずに)単純に人が入ると改札は閉じますよね。

Suicaでタッチすると開く

閉じたままだと通過できないので、Suicaでタッチしたときの状態を追加します。

http://www.plantuml.com/plantuml/png/YzQALT3LjLDuiclNuyQUfnjR7pUkUjpOmeN6HrFJrArW1U8-Qvd_k6dtu-RDZvksFcxUu-_7XQ86Yy7OzRcvSN5XAapDAocgLD1NU3PbvxCvQnytJNevhVjnuqIWoLnSnIM99QceBghcYePwvcN3h9UDVNxkN306agY_Dz3auDBCv4IWWO-RzZzkRdxStCW5bmIf19h3LSk5q0rqIaLc2QfBEXytpW2v1CbKJ4LGvm80

「人が居る」状態の中にさらに状態が出てきました。 「通過NG」と「通過OK」です。人が居る状態の中でもさらに細かい状態があることを表しています。

「人が居る」状態になったときは「通過NG」で改札は閉じています。 Suicaでタッチすると「通過OK」となり改札が開いて通れるようになります。

やりました。 これで改札の状態遷移がわかりましたね。

料金不足だと改札は開かない

ちょっと待ってください。

忘れてましたが、元々の話は「Suicaのタッチに失敗して改札を通れない場合」にスムーズに通りたい。ということでした。 改札を通れない場合を考えましょう。

http://www.plantuml.com/plantuml/png/YzQALT3LjLDuiclNuyQUfnjR7pUkUjpOmeN6HrFJrArW1U8-Qvd_k6dtu-RDZvksFcxUu-_7XQ86Yy7OzRcvSN5XAapDAocgLD1NU3PbvxCvQnytJNevhVjnuqIWoLnSnIM99QceBghcYePwvcN3h9UDVNxkN306agY_Dz3auDBCv4IWWO-RzZzkRdxStAWG_MpQp9Vj4q6czJO-xMYBvO8h1-a5cepDC207Zs5FTlI-sBOvbgkMYmj9EHPVTJvkd07o5P8BKoioIx1w7G00

Suicaの料金が不足していたときは「通過NG」状態のままとなり、改札は開きません。

「待機」状態

あれ?

状態遷移図はこれで完璧なように見えますが、何かおかしいです。

Suicaのタッチに失敗して改札を通れない場合」は何故スムーズに通れないのでしょう?

それは、しばらくの間はSuicaをタッチしても、全然「ピッ」となってくれないからです。
その状態が足りなさそうです。

http://www.plantuml.com/plantuml/png/YzQALT3LjLDuiclNuyQUfnjR7pUkUjpOmeN6HrFJrArW1U8-Qvd_k6dtu-RDZvksFcxUu-_7XQ86Yy7OzRcvSN5XAapDAocgLD1NU3PbvxCvQnytJNevhVjnuqIWoLnSnIM99QceBghcYePwvcN3h9UDVNxkN306agY_Dz3auDBCv4IWWO-RzZzkRdxStAWG_MpQp9Vj4q6czJO-xMYBvO8h1-bzkg_rsShvgEP1nF2PzcH7xujjcsEve2gHdGRKPfESdvDVPAMSbcO017PFTZGyNJVhsSocbzCcFz_Q0rHbemzMOSTLoyM5f0zBi7G-Rfm12XOaBwPMP9PW3Ji0

新しく「待機」状態が増えました。
Suicaの料金が不足しているとココに移ります。 さらに「通過OK」からも「待機」状態に移っています。

「待機」状態になると一定時間後に「通過NG」に移ります。 つまり状態が変わる条件は "時間" ですね。 今までの条件は「人感センサー」「Suicaをタッチ」など "誰かが何かをした" ときに状態が変わっていましたが、今回は何もしなくても時間が経てば状態が変わります。

これで、料金が不足していたときにしばらく改札が閉じたままであることが表現できました。

とはいえ、この「待機」状態を状態遷移図を描くために無理やり追加したのでは本末転倒です。 なぜ「待機」状態が必要なのでしょうか。

Suicaの料金が十分で「通過OK」となったとき、実際に人が歩いて改札を通過し終わるまでには時間がかかりますよね。 その間に「通過NG」状態になると改札が閉じてしまうので一定時間「待機」します。

料金不足のときはどうでしょう。
そのまま「通過NG」状態だと、次の人がSuicaをタッチできてしまいます。そして料金が十分だと改札が開いてしまいます。 つまり料金不足の人も次の人と一緒に改札を通れてしまいますね。
それを防ぐために「待機」状態が役立ちます。 「待機」状態のあいだはSuicaを受け付けないため、次の人と一緒に改札を通ることはありません。

自動改札をスムーズに通る方法

「待機」状態が存在することが分かると、「Suicaのタッチに失敗して改札を通れない場合」にスムーズに通る方法が分かりませんか?

そうです。
「待機」状態から「通過NG」状態に、状態を移せばいいわけです。
でも、一定時間経たないと状態が移らないんですよね?
実はもう一つ状態を移す方法があるんです。

それは「自動改札の中から出る」ことです。

自動改札の中から出ると、人感センサーがOFFとなり「人が居ない」状態に移ります。 そうすると、自動改札の中に入りなおしたときに「人が居る」→「通過NG」状態となり、Suicaをタッチできるようになるわけです。

やりました!

これで、Suicaのタッチに失敗しても、後ろからの嫌な視線を一心に受けたまま自動改札の中でぢっと手を見る必要はなくなりました。

あとがき

状態遷移を考えることで、プログラマーが自動改札をどのように動かしているかがわかり、それに対処する方法もわかりました。

実は、今回の状態遷移図は、実際の自動改札のそれとは比べ物ならないほど簡略化していますし、間違ったところもあります。
たとえば実際の自動改札機は二人以上が同時に入ってもちゃんと処理しますし、Suicaをピッとするのは人が入る前でもOKです。 しかも、私は自動改札の開発知識はゼロなので根本的に間違っている可能性もあります。

しかし、このように考えると「Suicaのタッチに失敗した」ときの対処について考えることができますし、案外それが当たっていたりするものです。

今の世の中は全てがコンピューターシステムで動いています。 そしてコンピューターはプログラムで動いています。 そのため、プログラムがどのように動いているか、プログラマーが何を考えているか、を理解できると、世の中が少し便利になるかもしれません。

皆さんも、たまにプログラマーの気持ちになってみてはいかがでしょうか。


組込みエンジニアのための状態遷移設計手法―現場で使える状態遷移図・状態遷移表の記述テクニック― (MBD Lab Series)

組込みエンジニアのための状態遷移設計手法―現場で使える状態遷移図・状態遷移表の記述テクニック― (MBD Lab Series)

*1:iPhoneも対応してほしいです

*2:物を動かす駆動装置のこと

*3:よく知らない人のために、ここではシステム要求検討からコードを書くまでの全工程の担当者を「プログラマー」に丸め込みます

*4:その状態になった時の動作を "entry / 動作" で表します