ふなばです。

>> いや、ここでの話に NTP は関係ないですよ。Marshal などで、Time を書き出
>> しだときに、それってポータブルだって保証できるか、できないならばそう書
>> いておいたほうがいいんじゃないかってことですから。
>
>私はその前提がわかっていませんでした。どうもすみません。もう一度
>元の投稿を読み直してきました。「ポータブルでないシステムもないと
>は言い切れないが、普通はポータブルだ」ではいかんということなので
>しょうか。

ポータブルでないシステム、といういいかたよいかはべつにして、およそ、そ
ういうことはいえると思うので、そう書いておけば親切だと思いますし、僕は
よいんじゃないかと思いますよ。

# Mashal 自体がそういうことを保証しているのかどうか、なんか怪しような気
# がしてきたので、この話をするにはよくなかったかもしれません。でも、Time
# の時刻が一般的なものでないということは確かですよね。

>うるう秒をきちんと管理するマシンを相手にしても保証されるような
>「ポータビリティ」を提供する(……保証されるような場合でなければ
>「ポータブル」という言葉を使わない)ことがRubyの使命とも思えない
>のですが……。あるいはそれを使命とするかどうか決定することが

使命ではないでしょう :-)
今現在の Ruby の仕様が閏秒をあつかうことを許しているので、
それについて忘れないで書いておいてほしいという希望ですよ。

>ええっと、私の言いたいことは、
>  「うるう秒が原因でポータビリティーが得られなくて文句を言うとし
>    たら、相手は自分のサイト(あるいはターゲットシステム)のシステ
>    ム管理者であるべきで、Rubyの開発者やマニュアルライターではな
>    い」
>ということです。

んー、システム管理者にあるとはいえないと思います。ただ、Ruby が保証し
てないだけ。それだけでよいんじゃないかしら。その場合は、責任はプログラ
マにあるとは思いますけど。

保証できないんなら、そのことはハッキリいったほうがよいといっているのは、
いわないと誤解されるかもしれないからです。

なんとなく、1970年1月1日0時0分0秒からの経過秒、といったことを書いてあ
ると、判ったような気分になるんじゃないかと思います。実は判らないことが
あるのに、読み手は勝手に、「Perl と同じなんだ」とか、「もちろん閏秒が
含まれている」など思いこんでしまう可能性があると思います。実際にそう思っ
ている人はいたと思います。僕もお気楽に、そんなことは言わんでもよい、と
思ってきましたが、やっぱりいっておいたほうがよいと思うんです。

>う〜ん、もうちょっとよく考えます。
>    ある時刻の演算において、Timeの定義域全域で加減算を矛盾なく定
>    義するためには、未来のうるう秒は無視せざるを得ない(うるう秒
>    がいつ入るかは予測できないから)。次に、ある時刻定数AとBに対
>    するA-Bが、すべての時刻において同一の値となるためには、過去
>    のうるう秒も無視せざるを得ない(さもないと、1999年元日直前の
>    うるう秒がシステムに登録された瞬間に、上の例の引き算の結果が
>    1.0から2.0になってしまう。この「登録された瞬間」は実際のうる
>    う秒の前かもしれないし後かもしれない)。Timeの加減算を保証す
>    るなら、うるう秒を含まないことを保証しなければならない。
>「Timeの加減算を定義するために、うるう秒はすべて無視する」として
>よろしいのではないでしょうか。これで処理系の問題もなくなったので
>はないでしょうか。処理系によってうまくいかない場合、「その処理系
>にRubyがうまく移植できていない」という問題に還元されることになり
>ます(NTPが云々というのは私の誤解として全部忘れてください)。

僕も現実的には閏秒を無視するのがラクでよいとは思っています。

今現在の  Ruby ではそういうことになっていないのですが、 閏秒を含まない
と宣言するには、Ruby が要求する環境とはそうなっているべきである。 そう
なっていない場合は Rubyをつかわないでほしい、というものもあるし、 たと
え閏秒があっても、あえてムシする汎用的な仕掛があって、閏秒を含まないこ
とを保証する、あるいは前田さんがいうように、そのように移植してほしい。
そうなっていない場合は移植に失敗していると考えるべきである、といったよ
うにいろいろありそうです。

この件で、 Ruby の方針に立ち入るつもりはないんで、作者がそうしたほうが
よいと思えばそうしてもよいと思うんですけど、どっちにするにしてもハッキ
リさせるのはよいことだと思います。

現実には Ruby はシステムに合せるというのが方針だと思うので、とりあえず
は、その方針を明らかにしておくということで、よいんじゃないかなあと思い
ます。

>epochが1970年かどうかは別の問題として残ります(MacOSでは1904年だ
>ということです(伝聞))。ちなみに、Timeの解説に関して言えば、1970
>年以前の時刻(負の時刻)が扱えない旨は書くべきでしょうね。

その点はマニュアルに書いてあるので、そうだと信じてよいのだと解釈してい
ます。そうでなかったら、それはバグでしょう。そのようになっていないのは、
移植に失敗したと考えてもよいと思います。

# 大抵は UNIX との互換性があるようにライブラリがつくられているとは思いま
# すが。

time(2) そのままということなら、エポックについてもあえて触れないのがよ
いと思います。エポックについて触れるなら、誤解のないように、閏秒のあつ
かいについての方針を明らかにしたほうがよいと思います。

# 仕様じゃないかもしれないけど、記憶では Ruby では負の時刻もつかえちゃっ
# たような気がする。偶然?

--Tadayoshi Funaba