スクローラー(マーキー)






 JavaScriptが登場してからしばらくして、出てきたある意味で画期的?なスクリプトがこのスクローラー(マーキー)でした。ウィンドウの下にメッセージが流れるだけの物でしたが効果は絶大で、これによってJavaScriptという名前とJavaScriptが普及したとも言えます。
 元は海外のものですが、初期型と修正したものと2種類があり、初期の物はWin95では、長時間使用しているとメモリエラーで停止、Macではメッセージが出てこなくなると言う現象が発生していました。修正されたものでも、表示期間を短くすると同様のエラーになる事があります。

 自分用にメッセージを変更したい場合は、msg="〜"の中を変えて下さい。ただし、Netscape 2.0では255文字以上にするとエラーになってしまう事があります。Netscape 3.0では、そのような事はありません。
 また、日本語を表示させるとUNIXではNetscapeが停止してしまったり、英語版のWIn95などでは文字化けを起こすことがあります。これを防ぐためには、いくつかの解決方法があります。ここのライブラリに日本語専用のものが用意してありますので、それを使用するのが一番楽です。


■プログラム的なこととエラー停止の原因
 このスクローラーの原理を説明しましょう。要するにメッセージが、右から左へ(もしくは逆へ)流れてくるようにすればいいわけです。これをうまく実現するにはsubstringという命令を使用します。この命令は文字列の指定間の文字を抜き出します。つまり、この抜き出す文字列の位置を変更してやれば、文字が流れているように見えるのです。

 長時間使用した場合のエラー停止の原因について説明します。雑誌などではNetscape 2.0のメモリ管理がおかしいとされています。確かに配列を使用してもおかしな場合がありますし、わからない事もありません。ところが3.0でも同様の現象が発生します。
 これにはタイマー割り込みが関係しています。setTimeout('func();",100);のように割り込み(実際は正式な割り込みでないが)がかかると、指定された秒数をカウントし指定秒数が経過したら関数unc();を呼び出します。ここまでは問題ありません。そしてメッセージを表示するのですが、このメッセージの表示が遅いと次のタイマー割り込みが勝手にかかってしまいます(Macではボタンを押したまま処理を停止させると割り込みは発生しない)。すると、これが積み重なると次のような感じに処理するものがたまっていきます。

[0] func();
[1] func();
[2] func();
  :
[n] func();
-------------
 処理しなければならないものがたまっていくと、メモリの限界である[n]を超えてしまいます。この時にエラーが発生します。処理が高速であり割り込み間隔も十分長ければこのような事にはならないはずです。


■Netscape 3.0のステータス表示について
 Netscape 2.0と3.0とステータス行の表示を比べてみると、あきらかに3.0の方が遅くなっています。というのも3.0では、単語事に文字を表示させるという処理が入っているためです。日本語にはほとんど無効ですが、英文を表示させてみるとよくわかります。突如として単語が表示されます。この処理のために速度が低下しているというわけです。

 まだまだJavaScriptには不明な処理部分があります。バグを修正しても、すぐに拡張してくれるため、バグが絶えません(笑)。特に新機能にはバグと機種間の差異が多いようです。