[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00721] Re: FDclone 2.09f has been released



 しらいです。

In Message-Id <20071027185833.6CD2C40C638@yuka.unixusers.net>
        Takashi SHIRAI <shirai@unixusers.net>writes:
>  しらいです。

>  本日 fj.sources に FDclone 2.09f の patch を投稿しましたの
> でご案内申上げます。full package は以下の URL で順次公開され
> ていくと思います。

 3.00 もう少し待って下さい。そろそろβテストを始める予定で
す。で、その開発過程でまだまだバグが見つかります。その都度修
正していきますのでご容赦下さい。


> 	一部の環境でペースト文字列が文字化けすることがある点を修正。

 これはねー、話がややこしいんですよ。元を正せば NEWS-OS な
んですよね。こいつが「ラベル文字列」を登録すべきところに何故
か「キーシーケンス」を登録しちゃったんです。
 ファンクションキーの情報として、ラベル文字列だと例えば「F1」
とか「pf1」とかなんですが、キーシーケンスだと「\E[11~」とか
「\EOP」とかになります。
 で、NEWS-OS 上で「F1」が押されたことを知るためには、「F1」
用のラベル文字列を調べて、それをキーシーケンスだと見なして憶
えておく必要があります。

 さてこの ad-hoc な対応ですが、NEWS-OS 以外の環境だとどうな
るかと言うと、「pf1」とか「F1」とかいったラベル文字列を入力
すると F1 キーが押されたと勘違いしてしまいます。
 各文字の入力の間に結構短いタイムアウトを設けているので、余
程気合いを入れて素早く入力しない限りはこの勘違いが発生しない
のですが、コピペで入力すると簡単にこの素早さが実現出来ます。

 えーと前置きが長くなりましたが、そろそろ話に着いて行けない
人が大半かな?まだまだ話は続くので、無理だったら読み飛ばして
下さい :-)

 で、ここで修正したバグは「pf1」の代わりに「pfx」と入力した
際に「pf」までを見て保留していた入力文字を「x」の入力時点で
元に戻すという処理にありました。
 「pf1」ならファンクションキーなんですが「pfx」だと関係ない
シーケンスなので文字列「pfx」として扱わないといけません。そ
こで「x」を検知した時点で「fx」をキーバッファに戻します。
 その時、TIOCSTI という I/O 制御コマンドを使ってるんですが、
これはキーバッファの最後に追加するんです。

 もし入力文字が「pfx」だけなら、最後に戻しても次に読込む時
は「f」→「x」の順で拾って来ることが出来ます。
 しかしコピペの速度だと「pfx」まで読んだ時点で既に「pfx123」
とか入力されている場合があって、この時は「1」→「2」→「3」
→「f」→「x」の順で拾って来てしまうんですね。
 で、I/O 制御コマンドにはキーバッファの先頭に文字を返すとい
う機能は用意されていませんので、代わりに内部でバッファを用意
してやることで対処しました。

 ついでにですね、ラベル文字列としてキーシーケンスを登録して
ある環境なんてそう多くはないので、そういう環境は例外的に扱う
ことにしました。
 まず、ラベル文字列として拾ってきた文字列は、ESC で始まって
いない限りはキーシーケンスとは見なさないようにしました。これ
で「pf1」と入力してもそのまま「pf1」になります。
 更に、ラベル文字列の方が優先順位が高くなっていたので逆順に
しました。これでカスタマイザの「キーマップ」に「pf1」なんて
文字列が現れることは無くなったと思います。

 あーしんど。


> 	内部変数 TERM の動的変更時に入力できないキーが生じる点を修正。

 これも上のキーシーケンスに近いお話ですが、こっちは入力側で
はなくて出力側のお話です。
 画面上の文字に色を付けたりカーソル移動したりという機能は、
登録されているエスケープシーケンスを端末出力することで実現し
ています。
 このような機能の中の一つに「キーボード転送モードの on/off」
というのがあります。

 例えば多くの端末でカーソルキーは「\E[A」みたいなキーシーケ
ンスを吐きますが、このキーボード転送モードにすると「\EOA」を
吐くようになります。
 この on/off 用のエスケープシーケンスは端末毎に異なっている
ので、普通は環境変数 TERM の値を元に、その端末に合ったエスケ
ープシーケンスで on/off 制御を行ないます。
 登録されているシーケンスが実際にその機能を果たすかどうかは
ユーザが正しく TERM を設定しているかどうかにかかっている訳な
んですね。

 さて、キーボード転送モードを off にするエスケープシーケン
スが本当は「\Exxx」であるような端末で、ユーザが別の端末名に
変更したとします。
 この時、その別の端末名の端末では on/off 用シーケンスが登録
されていなかったら、端末名変更後はキーボード転送モードを off
にすることが出来ません。
 on/off 用シーケンスが登録されていない場合は常に off だと見
なしたキーシーケンスが登録されているので、例えばカーソルキー
だと「\E[A」が登録されていたりします。
 プログラム側はキーボード転送モードを off にしたと思い込ん
でいても、実際は on のままでカーソルキーは「\EOA」を吐きます。
でも登録されているのは「\E[A」の方です。
 これではカーソルキーを正しく認識することが出来ません。

 なので、変更される前の TERM の値でエスケープシーケンスが用
意されているうちにキーボード転送モードを off にしておいてか
ら、新しい TERM 値で登録情報を読み直すように修正しました。


> 	NFS 上の設定ファイルが反映されないことがある点を修正。

 ファイルに fcntl ロックをかけられない NFS の実装が多いので、
NFS 上ではロックファイルを作成してロックを実現するようにして
います。
 ファイル書込みの場合はそれで構わないのですが、読取りの場合
だとそのロックファイルの作成権がないディレクトリにもアクセス
することがあり得ます。
 そんな場合、ロックファイルを作成しようとして失敗するので、
その読取り自体を諦めてしまっていました。なので NFS 上でかつ
作成権の無いディレクトリ上の設定ファイルは反映されません。

 で、仕方ないのでロックファイルはファイル書込みの時だけ作成
することにしました。読取りの際は既存ロックファイルがあれば諦
めますが、誰も未ロックの場合はロックせずに読取りを始めます。
 このため、誰かが既に読取りを開始したファイルを他の誰かが上
書きで書込みをし始めてしまうという危険性が新たに生じてしまい
ました。

 ただ、一般的には読むスピードを越えて書き進むことは難しいし、
他の条件を考え合わせてもなかなかそう頻繁に発生し得ることでも
ないので、この危険性は放置してあります。
 これがサーバであれば、ロックファイル用の専用ディレクトリを
用意してでもロックをかけるんですけど、単なるユーザアプリ用に
そこまでするのはユーザ側の管理の手間も増えますしねー。


> 	非対話シェルで一部の組込みコマンドが終了できない点を修正。

 組込みコマンドの中には getkey とか yesno とかいった非カノ
ニカルモードを使ったものが幾つかあります。非カノニカルとは、
Enter の入力前にキー入力を検知出来るモードです。
 このモードを使用するには起動時に端末状態の初期化が必要なん
ですが、script から読込む時とか -c オプションで起動された時
とか非対話シェルの場合に初期化していませんでした。
 非対話シェルだと対向にユーザがいないから端末なんて使わない
だろうと勝手に思い込んでいたようです。無駄になるかも知れない
けど必ず端末の初期化をするようにしました。


> 	~ に後続する変数が展開されない点を修正。

 コマンドライン上の「~」はホームディレクトリを表すメタ文字
なので、その後ろがユーザ名じゃないかとか、「~」単独で起動ユ
ーザ名を示してないかとかチェックします。
 その際、ユーザ名じゃないと判断したら「~」の後ろの構文解析
をすっ飛ばしてしまっていたので、例えば「~$USER」なんて位置に
ある変数が展開されないまま残ってしまっていました。

 因みに「~$USER」ですけど、「ls ~$USER」としてもユーザ USER
のホームディレクトリを ls することは出来ません。これは POSIX
シェルとしても仕様になっています。
 期待される結果は「eval ls ~$USER」で得られる筈なので、お試
しあれ。

                                               しらい たかし