[IT]WinDIAについて

今日は越美北線でも乗りに行こうかと思っていたのですが、事前に天気予報を調べたところかなりの冷え込みと雨や雪の予報がなされていたので中止しました。中止してみると、昼過ぎにはすっかりいい天気になって全く旅行に問題なさそうになっているのが困ったものです。これなら行けばよかったといったところ。
かわりに自室でこれまでの旅行で集めたパンフレット類の整理。ちゃんとスクラップブック(クリアブック)に整理していなかった分が溜まっていたので、チェックしながら順に整理しました。さらにこれからの旅行の計画。別に行くつもりはなくても計画を立てるだけで楽しいので、私のPCには実行されないプランがたくさんあります。こうした計画を立てる上で、しばしば私が行うのが時刻表のデータを元にダイヤを書き起こしてみるということ。もちろん使うのはダイヤ表示のデファクトスタンダードとなっているWinDIA。都市部の複線区間とかだとあまりやらないのですけど、地方の鉄道で単線区間だとしばしば行き違いの場所を調べるために使います。対向列車とどこでであって、どれくらい待避時間があるのか、旅行行程を考える上では私にとっては重要な要素なのです。
さて、重宝するWinDIAなのですけど、欠点もあります。もともとはWindows 3.1時代に開発されたソフトで、1998年くらいに最後のバージョンアップが行われた後ずっと放置されているということ。Windows 3.1用だったので、コードがWin16で動いているのです。Windows 2000/XPはNTカーネルなのでWin32環境がネイティブであり、Win16アプリケーションは互換性のために用意されたWindows on Windowsと呼ばれるバーチャルマシン(エミュレータと言った方がよいのか?)の上で動く仕組みです。実際、WinDIAを実行してタスクマネージャの「プロセス」タブを見てみると、windia.exeのプロセス名は少しインデントされて表示されており、その1つ上にwowexec.exeというプログラムが動いているのが分かるはずです。wowexec.exeがWin16用のバーチャルマシンなわけです。まぁ、この過程はユーザに対して透過的に行われる(wowexecが起動されてエミュレーションされることはユーザが知る必要がない)わけですし、動作上特に不具合もないので問題ないといえば問題ないです。Windows 3.1で開発されたがゆえの古い形式のファイルを開くダイアログボックスなどが気になるくらいでしょうか。
具体的な問題点はスクロールバーについて。現在のアプリケーションに使われているスクロールバーは、バーの全体領域が表示すべき全体の幅/高さを示し、タブの長さが現在表示されている領域の幅/高さに対応しています。つまり、ウィンドウの幅や高さが本来表示したい領域のちょうど半分なら、タブの長さはスクロールバーの領域全体の半分になります。これに対してWindows 3.1時代の古い仕様では、スクロールバーのタブは常に一定サイズで画面の比を反映していません。これがどうにも古臭くみえます。これだけなら見栄えの問題ですけど、このタブをドラッグしてスクロールさせる時に、スクロール中は画面の再描画をせずにタブを離した瞬間に再描画します。私も486SX 25MHzのマシン上で実行しているWindows 3.1環境でWinDIAを実行したことがあり、その時には非常に描画が重たくでたまらなかったことはよく覚えているのですけど、現代のPCでは時刻表やダイヤの描画くらい何でもないことです。列車番号や列車名をダイヤの線に合わせて斜めに書き込むと、何度の角度で書かなければならないかを計算するためにアークタンジェントの計算が必要で、さらにそれを基にしてフォントのGDIオブジェクトを生成しなければならないので、非常に重い処理になるかのように思えるのですけど、現代のPCの能力は本当に高くてスクロールさせながらこの処理をリアルタイムで行わせてもストレスなく動くはずなのです。以前似たようなプログラムを実装したことがあるのでこのあたりはよく分かっています。自分が実装したプログラムは同様の処理を全くストレスなくこなします。これに加えて、マウスのホイールに対応していないのもストレスが溜まるところです。全てにおいてWindows 3.1時代のやり方でコードが実装されているがゆえに、現代のスクロール処理の基準になっていないということが原因であると思います。
まだスクロールの問題は使い勝手の問題であるとしても、根本的な機能の問題としては登録できる列車の本数に制限があるというところ。私も弄繰り回していてようやく気付いたのですけど、上り/下りの列車それぞれについて最大で512本までしか登録できない仕様になっています。以前、とある鉄道会社のウェブサイトに置いてあったHTMLファイル形式の時刻表(テーブルタグでえんえんと入力されていたもの)をPerlの自作プログラムでWinDIA形式にコンバートして表示させてみたことがある(HTMLのテーブルタグは横方向に記述していって右端へ行くと次の行を左から書くやり方なのに、駅が縦に並んでいる時刻表の書き方をしているので同一列車の各駅の時刻がHTMLファイル上で遠く離れた位置にあって、変換プログラムは結構面倒なものでした。上り列車は駅の順番をひっくり返して出力しなければならないですし。)のですけど、あまりに列車本数の多い区間ではうまく表示されなくなりました。その原因を探ったところ列車本数の制限に行き当たったというわけです。なお、制限を上回る数の列車をファイルに書いていてもWinDIAは前から順番に制限一杯まで読み込んでその後を無視するだけですが、その状態で時刻表形式の画面から列車を追加しようとすると一般保護違反でクラッシュします。試していないですけどこの分だと駅の数にも制限があるかもしれません。駅の方はある程度大きな値に設定されていれば問題になることはないでしょうけど。
私がプログラムを書く時は固定長のバッファを使うことがほとんどなくて、その時に必要なだけ動的にメモリを確保して使うのが標準的になっており、このように列車数に上限が設定されているという仕様はほとんどありえないことです。C++でSTLを常用している人間にとっては列車クラスのオブジェクトをvectorに突っ込むだけですからね。そういう動的な仕組みに改造するのは手間が掛かるので無理としても、上限列車数はおそらくマクロで定義されているだけでしょうから、これを拡張してリコンパイルしたものを配布して欲しいものです。
調べてみると、WinDIA形式のファイルをLinuxで表示させるためのydiakunというプログラムや、もっと機能を拡張して新しいものを作ろうというdiagraphというプロジェクトなどもあるようです。どちらもちょっと更新が滞っていますけど。私の友人が作ったプログラムを見せてもらったこともあるのですけど、そちらは現在は公開されていないようです。えらく高機能なのですけど使い方にクセがあって本人でなければ使いこなせないという…。おまけにアセンブラからプログラミングに入ったためかソースがえらいことになっていました。鉄道ファンはコンピュータにも強い人間が多いので、おそらくまだたくさんこの手のプログラムは散在しているかと思います。ただそれでもWinDIAがデファクトを維持しているのは、既に公開されている膨大なダイヤデータが存在しているということと、機能が絞られていて使い方を覚えやすい、単純な操作性などといったことによるのではないでしょうか。
WinDIAのファイルフォーマットは割と単純なので、ちょっと頑張れば上記の欠点だけを直したクローンを作ることができそうに思えます。ちょっとやってみることでしょうか。




この記事へのコメント

この記事へのトラックバック