言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

インチキプログレスバーの怪

Squeak でプロジェクトを保存したり読み込むときに、不思議なプログレスバーが現れる。普通、プログレスバーは現在コンピュータがどれくらい仕事を終えたのかを表示し、固まらずちゃんと動いている事をユーザに知らせる為にあるのだが、どうもこの保存のときのバーは無茶苦茶な動きをして全然参考にならないのだ。そこで、テストコードを書いて動きを試してみた。

ComplexProgressIndicator new 
	targetMorph: nil;
	historyCategory: 'hello';
	withProgressDo: [
		1 to: 10 do: [:i |
			ProgressNotification signal: i asString, ':TEST proceed'.
			(Delay forMilliseconds: 1000) wait.]
]

ここで、1から10の数字をプログレスバーに知らせて1秒待つという事をしているのだが、実はこのコードは驚くべき挙動を示す。初め、表示されるプログレスバーは滅茶苦茶な動きをする。しかし、なんと回数を重ねるうちに、正しく動き始めるのだ。ちなみに、プログレスバーに表示される数字は、残り秒数である。

プログレスバーは historyCategory の値を参考に、過去に行った仕事にかかった時間を覚えていて、その平均経過時間を元にバーを進ませる。凄い!賢すぎ!しかし、実はこのような挙動は Squeak プロジェクトにとっては全く良いところ無しなはずだ。

  1. プロジェクトは大抵作品によって大きく保存時間が違う。その為過去の記録は役に立たない。
  2. 典型的なプロジェクト保存の使い方としては、Squeak を起動してプロジェクトを保存すると、Squeakの過去の記録自体は保存せず終了してしまう。つまり、過去の記録はそもそも保存されない。

果たして、何でこんな滅茶苦茶なプログレスバーSqueak etoys の標準なのか理解に苦しむ。もう少し注意深くコードを読む必要があるとは思うが、ProgressInitiationException のようにまともに動作するプログレスバーがあるのにわざわざこういった物を作ったからには何らかの理由があるに違いない。