<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>ズンドコ節 on akky@サイボウズラボ・ブログ</title>
		<link>https://labs.cybozu.co.jp/blog/akky/tags/%E3%82%BA%E3%83%B3%E3%83%89%E3%82%B3%E7%AF%80/</link>
		<description>Recent content in ズンドコ節 on akky@サイボウズラボ・ブログ</description>
		<generator>Hugo</generator>
		<language>ja</language>
		
		
		
		
			<lastBuildDate>Fri, 18 Mar 2016 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://labs.cybozu.co.jp/blog/akky/tags/%E3%82%BA%E3%83%B3%E3%83%89%E3%82%B3%E7%AF%80/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>ズンドコキヨシ問題をPHPとFSMで解く</title>
				<link>https://labs.cybozu.co.jp/blog/akky/2016/03/zundoko-kiyoshi-in-php-and-fsm/</link>
				<pubDate>Fri, 18 Mar 2016 00:00:00 +0000</pubDate>
				<guid>https://labs.cybozu.co.jp/blog/akky/2016/03/zundoko-kiyoshi-in-php-and-fsm/</guid>
				<description>&lt;p&gt;先週&lt;a href=&#34;http://qiita.com/shunsugai@github/items/971a15461de29563bf90&#34;&gt;一部で流行していた&lt;/a&gt;、&lt;a href=&#34;https://twitter.com/kumiromilk/status/707437861881180160&#34;&gt;ズンドコキヨシ問題&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから&lt;br&gt;「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた&lt;/p&gt;&amp;mdash; TCM (@kumiromilk) &lt;a href=&#34;https://x.com/kumiromilk/status/707437861881180160?ref_src=twsrc%5Etfw&#34;&gt;March 9, 2016&lt;/a&gt;&lt;/blockquote&gt;&#xA;&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;&#xA;&#xA;&#xA;&lt;p&gt;ランダムな結果の中から特定のシーケンスが出たら「キヨシ」を出し、終了する、という要件で、解き方はいくらでもあると思いますが、&lt;a href=&#34;https://github.com/akky/Zundoko&#34;&gt;自分が考えたのは有限オートマトンを使ったもの&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;まずはPHPでFSMを扱っているパッケージを探します。&lt;a href=&#34;https://packagist.org/&#34;&gt;Packagist&lt;/a&gt; で&lt;a href=&#34;https://packagist.org/search/?q=FSM&#34;&gt;FSM で検索&lt;/a&gt;。ダウンロード数が多いパッケージをいくつか見てみて、使い方が好みなものを選びます。今回は &lt;a href=&#34;https://github.com/piece/stagehand-fsm&#34;&gt;Stagehand_FSM&lt;/a&gt; を選びました。業務ならここでパッケージの中を精査するんでしょうけど、まあここでは省略します。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;{ &amp;quot;require&amp;quot;: { &amp;quot;piece/stagehand-fsm&amp;quot;: &amp;quot;2.4.*&amp;quot; } }&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Composer で持ってきて呼び出します。楽ちんですね。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;require &#39;vendor/autoload.php&#39;; use Stagehand\FSM\StateMachine\StateMachineBuilder;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;ドキュメントにありますが、ステートマシンのインスタンスを作り、状態と遷移と開始(や終了)を与えて動かすだけ。&lt;/p&gt;&#xA;&lt;p&gt;ということで、与えるデータを作るために、次はズンドコキヨシ問題の遷移図を考えます。&amp;ldquo;online FSM editor&amp;quot;で検索すると、&lt;a href=&#34;http://madebyevan.com/fsm/&#34;&gt;ブラウザで遷移図を描けるページ&lt;/a&gt;が見つかりました。これは便利。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://labs.cybozu.co.jp/blog/akky/2016/03/zundoko-kiyoshi-in-php-and-fsm/zundokokiyoshi_FSM-3.png&#34;&gt;&lt;picture&gt;&#xA;  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://labs.cybozu.co.jp/blog/akky/2016/03/zundoko-kiyoshi-in-php-and-fsm/zundokokiyoshi_FSM-3_hu_c53033b460525ea3.webp 480w, https://labs.cybozu.co.jp/blog/akky/2016/03/zundoko-kiyoshi-in-php-and-fsm/zundokokiyoshi_FSM-3_hu_2c27388b11506b70.webp 768w, https://labs.cybozu.co.jp/blog/akky/2016/03/zundoko-kiyoshi-in-php-and-fsm/zundokokiyoshi_FSM-3_hu_a596bdf23bf27f5a.webp 800w&#34; sizes=&#34;(max-width: 56rem) 100vw, 54rem&#34;&gt;&#xA;  &lt;img src=&#34;https://labs.cybozu.co.jp/blog/akky/2016/03/zundoko-kiyoshi-in-php-and-fsm/zundokokiyoshi_FSM-3.png&#34; width=&#34;800&#34; height=&#34;600&#34; alt=&#34;zundokokiyoshi_FSM&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&#xA;&lt;/picture&gt;&lt;/a&gt; (間違いがあり、画像を差し替えました。@qckanemoto さんありがとうございました。)&lt;/p&gt;&#xA;&lt;p&gt;あとは図を基に状態と遷移を与え、それぞれの状態で「ズン」や「ドコ」、あるいは「ドコキヨシ」を表示させれば&lt;a href=&#34;https://github.com/akky/Zundoko&#34;&gt;完成&lt;/a&gt;です。&lt;/p&gt;&#xA;&lt;h3 id=&#34;fsmを使う意味&#34;&gt;FSMを使う意味&lt;/h3&gt;&#xA;&lt;p&gt;今回のチャレンジを最短の手数で解くだけなら、必ずしもFSMみたいなものを使う必要はないでしょう。ただ、遷移図や遷移表みたいなものを書いて、それをただコードに落とし込む、というのは、抜けを減らせる安心感があります。&lt;/p&gt;&#xA;&lt;p&gt;# 図を間違うこともありますし、コード化するときに間違うこともありますけどね。テスト書いてないので、業務レベルなら失格です&lt;/p&gt;&#xA;&lt;p&gt;もし、キヨシが出る条件が頻繁に変わるとか、ズンとドコを使って新しい曲を作りたいとか、同じコードのデータ(遷移表)だけをさまざまに切り替えて別の動作をさせたいとか、そういう方向に仕様の変化が予想される場所なら、使うといいのではないかなと思います。ゲーム系のプログラマーはたぶんこういうの日常的に使ってるのでは。&lt;/p&gt;&#xA;&lt;p&gt;あとは、描いた遷移図や遷移表からそのままJSONなりの定義が出力できて、それを直接食わせたら動くライブラリ、みたいなものがあると、もっと楽で間違いもないんだろうなあ、と思いました。さらに手間を掛けるならそういうツールやライブラリを探すか、作るかするんでしょうね。&lt;/p&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/c0H_qGSJKzE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;&#x9;&#x9;&lt;/div&gt;</description>
			</item>
	</channel>
</rss>
