PostScriptでタイミングチャートを描くためのRubyを書いた

はじめに

筑波大学情報学群情報科学類では、2年次の必修科目として論理回路実験と呼ばれる1.5単位がある。これは2週間に一度、実験レポートを書かされるもので、「実験の手順の説明→実験結果→考察」というような流れの実験レポートを書く機会があまりない情報科学類生にとって、ひとつの試練とも言える。どこぞの大学と違って、「これを落とすと駒場から出られない!」なんて事態は起きないが、3コマ分の実験を再履修するのは大変なことだ。

ところでこの実験、普通のプログラミング課題ではない。ロジックトレーナーと呼ばれる機械の上で配線を行い、論理ゲートやフリップフロップをつなぎあわせて、組合せ回路や順序回路の実験を行い、レポートにまとめて提出するのだ。面倒くさい回路図やタイミングチャートを書かなければならず、レポート締め切り当日の朝には途方に暮れる*1

そこで私は、レポートを可能な限り楽しむために、タイミングチャートを生成するためのPostScriptを生成するためのRubyプログラムを作成した。楽をするための努力だ。初めてのPostScriptだったが、覚えることが少なくて割と楽だった。久しぶりにプログラミングを楽しむことができた。せっかくなのでその成果物をここに書いておこうと思う。

なぜ作ったのか

タイミングチャートを描くツールなど、探せば探すだけ見つかる。しかしWindows版だったり、GUIだったりで、複雑なものが多く、ちょっとしたタイミングチャートを、ちょっとしたテキスト入力から作りたかった私の要求を満たすものが見つからなかった。PostScriptを書きたかったからというのも理由の一つ。勉強になったし、自分が必要としているものは最低限作れたから、後悔はしていない。

使い方

標準入力から数字列を食わせるだけで、タイミングチャートを出力するためのPostScriptが出力される。入力と、出力されたPostScriptと、PostScriptの実行結果を以下にまとめて示す。

1 2 1 2 1

↑入力

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 500 150

/arr_of_arr [[1 2 1 2 1] ] def
/j 0 def
/y_origin 10 def
/y_margin 20 def
/scale 10 def
/h 1 scale mul def

0 1 arr_of_arr length 1 sub {
	% arr_of_arrを後ろから走査する
	/arr arr_of_arr arr_of_arr length 1 sub j sub get def
	/y0 y_origin j y_margin mul add def
	
	/x0 10 def
	
	/x x0 def
	/y y0 def
	/next x0 arr 0 get scale mul add def
	
	/i 0 def
	0 1 arr length 2 sub {
		% 横
		newpath
		x y moveto
		next y lineto
		stroke
	
		% 移動
		/x next def
		/next x arr i 1 add get scale mul add def
	
		% 縦
		newpath
		x y0 moveto
		x y0 h add lineto
		stroke
	
		% 移動
		/i i 1 add def
		y y0 eq {/y y0 h add def} {/y y0 def} ifelse
	} for
	
	% 最後の横棒
	newpath
	x y moveto
	next y lineto
	stroke

	/j j 1 add def
} for

↑出力


↑出力の実行結果

入力の説明

1 2 1 2 1 という入力のそれぞれの数字は、立上がり・立下りまでの時間を表す。「1」だけ時間が経ってから立ち上がり、「2」だけ時間が経ってから立下り……という具合。

その他の例

以下に他の実行例を示す。

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
2 2 2 2 2 2 2 2 2 2 2 2 2
4 4 4 4 4 4 4

↑入力


↑実行結果

動作環境

MacOS X 10.6で確認した。RubyとPostScriptが使える環境なら、どこでも動くはず。はず!

今後の展望

改善点はいくらでもある。Webアプリにしたら、便利かもしれない。完成度が上がったら、そういう公開の仕方をしてみてもいいかもしれない。ただし、私の熱意が続き、なおかつそのような需要があった場合に限る。

*1:とは言ってもレポートが20ページを超えたという話はあまり聞かない。情報科学類生は勉強しないのだ。