Google SoC のメンター組織募集が始まった。募集期間は数日しかないのね。
思い立って読んでみる。なかなか興味深い。
非営利組織の経営 (ドラッカー名著集 4), P. F. ドラッカー, ダイヤモンド社
Debian GNU/Linux #519230 - telldir(3) and seekdir(3) describes they uses off_t.
そういえば、GNU/Linux のマニュアルの upstream ってどこにあるのか知らない。
調べてみると、kernel.org にあるようだ。
<URL:http://www.kernel.org/doc/man-pages/index.html>
Debian でのバグレポートに返事をくれたひとはこっちのメンテナのようだ。どっちも見ているらしい。
即座に upstream で直ってとてもよろしい。
Time の拡張の話が出たのでちょっと考えてみる。
現在 Time は中に time_t を常に持っているので time_t の範囲外は表現できない。また、タイムゾーンはシステムが提供するものしか扱えない。
さて、ときに (ファイルのタイムスタンプを設定するときなど) time_t は必要になるが、それは必要になったときに求めればよく、そのときに範囲外だったらエラーにすれば良い。
というわけで、time_t は必要に応じて求めるようにすれば、Time の範囲を拡張できるかもしれない。
ここで、time_t のかわりに bignum を、というのはうまくいかない。bignum にすれば time_t (32bit ないし 64bit) の範囲を越えられるが、越えた範囲の値に対応する日付を得るなどの操作ができない。タイムゾーンの情報を自前で持つのであれば対処できるかもしれないが、それはしないものとしよう。
というわけで、Time の内部には、年、月、日、時、分、秒、時差の 7つ組を記録することを考えよう。つまり、2009-03-15T15:23:43+09:00 みたいな表現をそのまま内部で扱うという感じである。なお、時差は UTC との差で Time オブジェクトごとに記録することによって異なる地方時を扱う。あと、秒は有理数とする。この表現であれば、(グレゴリオ歴で) 任意の時刻を表現できる。
しかし、これですべて解決、とはいかない。表現できるだけでは十分ではない。ある時刻の 1秒後の時刻を求めるなど、いろんな操作が必要である。
操作によっては、zoneinfo が必要になるかもしれない。zoneinfo には、あるタイムゾーンにおいて、各時刻について時差の情報が記録されている。(現時点の日本というタイムゾーンでの時差は1年を通して一定であるが、夏時間があると、時刻が決まらないと時差は求められない) あと、閏秒の情報も入っている。
たとえば UTC の時刻とあるタイムゾーンの zoneinfo があると、その時刻における時差が分かり、その時差を UTC の表現に加えるとそのタイムゾーンにおける時刻の表現が求められる。また、閏秒の情報があるので、ある時刻が epoch から何秒後かということもわかる。
zoneinfo が使用可能であれば、7つ組から time_t が得られるので、今までの Time と同じ情報が得られる。従って、今まで可能だったことはそのままできるわけであるが、ここで興味があるのは、そうはいかない場合である。つまり、time_t の範囲外であるか、システムのタイムゾーン以外のタイムゾーンを扱う場合である。
そういうときになにが起きるかというと、無理な操作が出てくる。たとえば、Time.at(秒, マイクロ秒) という操作があり、これは Unix epoch からの秒数を指定して、システムのタイムゾーンで表現した時刻を返すものである。秒数から内部表現 (7つ組) への変換は localtime で処理可能であるが、秒数が time_t に納まらなければ localtime は使えない。
そういうように無理な操作がある一方、問題ない操作もある。たとえば Time#sec は内部に記録されている秒を返すだけで、なんの問題もなく実装できる。
また、地方時 -> UTC の変換は時差を減じればよいので zoneinfo 不要であるが、UTC -> 地方時は、ある時刻におけるあるタイムゾーンでの時差を得るのに zoneinfo が必要である。
というわけで各メソッドを分類してみると以下のようになる。
zoneinfo 不要:
zoneinfo 必要:
7つ組では足りない:
7つ組ではちょっと足りなかったか。まぁ、足りないのは足せば済む感じである。
zoneinfo が必要なのはかなりある。そういう操作がうまくいかなくても嬉しいのかというのが問題である。
zoneinfo が不要なインスタンスメソッドは、内部の値を取り出すものをのぞけば、大小比較、UTC への変換、フォーマット、wday, yday だけである。これだけで嬉しいか?
あと、グレゴリオ歴という仮定がいくつか出てくるが、これをどうにかできるか。ユリウス歴だけなら改暦のタイミングで済むが、とりあえず日本ではグレゴリオ歴の前は天保暦だったわけで、扱うとしたら「閏三月」とかどうやって引数で表現すんのか、という話になる。3.5 とか? あるいは文字列? まぁ、旧暦 (ユリウス歴、天保暦、他) は扱わないとするのはひとつのやりかたであろう。
ところで、現実世界の閏秒はタイムゾーンに依存しない。
そうすると、閏秒の情報は、システムのタイムゾーンから取り出して使うというのは妥当であろう。そうやって得た情報を他のタイムゾーンに適用しても問題ない。
ただし、閏秒は実際のところ Unix であまり運用されていない。だが、世の中あまり困っていないようである。
また、どうせ正確さは保証できないという点では、未来の閏秒は直前にならないと決まらないという問題もある。なので、閏秒に依存する計算は、未来のことに関して正しいと限らないのはしょうがない。(さらにいえば、時差は国が決定するものなので、変わるかもしれない。日本でいえば、夏時間の導入がくすぶっている。)
というわけで、zoneinfo が必要とした中で、閏秒の情報だけで済む (時差に依存しない) 操作は、個々のタイムゾーンの情報にアクセスしなくても現実的には実装可能であろう。システムが閏秒を運用していなければ情報は得られないが、それによる誤差は許容可能と仮定しよう。
zoneinfo が必要な操作を分類してみると以下のようになる。
閏秒だけで十分:
時差が必要:
うぅむ。閏秒だけで十分なのはあまり多くないか。
time + sec で、時差が必要なのは最後の「UTC -> 地方時」である。この変換をあきらめて UTC のままで残しておけば、時差は不要になる。失敗したらあきらめることも考えられる。
Time.at(秒数) も同様かもしれない。
だが、local と名前に入っているのは UTC のままってわけにはいかないだろうなぁ。
時差がなくてもそれなりに動く:
時差が必要:
time + sec で結果の時刻における時差の取得に失敗したら元の時差を使うという手はあるか。
いや、そもそもシステムのタイムゾーン以外で時差を得るというインターフェースがないから、元の時差を使わざるを得ない?
腹痛により一回休み
しかし、システムの提供する以外のなにかを使いたいとして、それがタイムゾーンと時差のどちらなのか、という話はあるかもしれない。
まぁ、Web application で、(ログインしている) ユーザの設定にしたがって時刻を表示するというならタイムゾーンだろうな。
単に時差つきの時刻を保存したり通信するだけなら時差でいいかもしれない。
タイムゾーンを扱う基盤として、任意の時差を扱うというのはあるかもな。
FSIJ は Google SoC のメンター組織として採用されたようである。
「File 10 new bugs of Free Software」には早速問い合わせが来たようである。
私は Ruby 関係としてなにかバインディングライブラリを作って公開するというもアイデアを出してみたが、やってくれる学生はいるだろうか。
PHP のタイムゾーンに関する議論を探していて、イスラエルとブラジルが夏時間を毎年決めているという話があった。
が、今はもう規則が決まっているようだ。
イスラエルは 2005年まで、ブラジルは 2007年まで毎年いちいち決めていたらしい。
Google SoC 2009 の学生の応募期間が始まった。
日本時間では 4/4 04:00 まで。
やりたいひとはどうぞ。
ロンドンは、5年ほどずっと夏時間だったことがあるらしい。
% zdump -v Europe/London ... Europe/London Sun Feb 25 01:59:59 1940 UTC = Sun Feb 25 01:59:59 1940 GMT isdst=0 gmtoff=0 Europe/London Sun Feb 25 02:00:00 1940 UTC = Sun Feb 25 03:00:00 1940 BST isdst=1 gmtoff=3600 Europe/London Sun May 4 00:59:59 1941 UTC = Sun May 4 01:59:59 1941 BST isdst=1 gmtoff=3600 Europe/London Sun May 4 01:00:00 1941 UTC = Sun May 4 03:00:00 1941 BDST isdst=1 gmtoff=7200 Europe/London Sun Aug 10 00:59:59 1941 UTC = Sun Aug 10 02:59:59 1941 BDST isdst=1 gmtoff=7200 Europe/London Sun Aug 10 01:00:00 1941 UTC = Sun Aug 10 02:00:00 1941 BST isdst=1 gmtoff=3600 Europe/London Sun Apr 5 00:59:59 1942 UTC = Sun Apr 5 01:59:59 1942 BST isdst=1 gmtoff=3600 Europe/London Sun Apr 5 01:00:00 1942 UTC = Sun Apr 5 03:00:00 1942 BDST isdst=1 gmtoff=7200 Europe/London Sun Aug 9 00:59:59 1942 UTC = Sun Aug 9 02:59:59 1942 BDST isdst=1 gmtoff=7200 Europe/London Sun Aug 9 01:00:00 1942 UTC = Sun Aug 9 02:00:00 1942 BST isdst=1 gmtoff=3600 Europe/London Sun Apr 4 00:59:59 1943 UTC = Sun Apr 4 01:59:59 1943 BST isdst=1 gmtoff=3600 Europe/London Sun Apr 4 01:00:00 1943 UTC = Sun Apr 4 03:00:00 1943 BDST isdst=1 gmtoff=7200 Europe/London Sun Aug 15 00:59:59 1943 UTC = Sun Aug 15 02:59:59 1943 BDST isdst=1 gmtoff=7200 Europe/London Sun Aug 15 01:00:00 1943 UTC = Sun Aug 15 02:00:00 1943 BST isdst=1 gmtoff=3600 Europe/London Sun Apr 2 00:59:59 1944 UTC = Sun Apr 2 01:59:59 1944 BST isdst=1 gmtoff=3600 Europe/London Sun Apr 2 01:00:00 1944 UTC = Sun Apr 2 03:00:00 1944 BDST isdst=1 gmtoff=7200 Europe/London Sun Sep 17 00:59:59 1944 UTC = Sun Sep 17 02:59:59 1944 BDST isdst=1 gmtoff=7200 Europe/London Sun Sep 17 01:00:00 1944 UTC = Sun Sep 17 02:00:00 1944 BST isdst=1 gmtoff=3600 Europe/London Mon Apr 2 00:59:59 1945 UTC = Mon Apr 2 01:59:59 1945 BST isdst=1 gmtoff=3600 Europe/London Mon Apr 2 01:00:00 1945 UTC = Mon Apr 2 03:00:00 1945 BDST isdst=1 gmtoff=7200 Europe/London Sun Jul 15 00:59:59 1945 UTC = Sun Jul 15 02:59:59 1945 BDST isdst=1 gmtoff=7200 Europe/London Sun Jul 15 01:00:00 1945 UTC = Sun Jul 15 02:00:00 1945 BST isdst=1 gmtoff=3600 Europe/London Sun Oct 7 01:59:59 1945 UTC = Sun Oct 7 02:59:59 1945 BST isdst=1 gmtoff=3600 Europe/London Sun Oct 7 02:00:00 1945 UTC = Sun Oct 7 02:00:00 1945 GMT isdst=0 gmtoff=0 ...
ロンドンの標準時は GMT であるが、1940年から 1945年の間、冬でも GMT には戻らず、BST (British Summer Time) と BDST (British Double Summer Time) をいったりきたりしている。
また 1947年には、1年の中で、GMT -> BST -> BDST -> BST -> GMT と 2段階な夏時間をやったことがあるらしい。
... Europe/London Sun Mar 16 01:59:59 1947 UTC = Sun Mar 16 01:59:59 1947 GMT isdst=0 gmtoff=0 Europe/London Sun Mar 16 02:00:00 1947 UTC = Sun Mar 16 03:00:00 1947 BST isdst=1 gmtoff=3600 Europe/London Sun Apr 13 00:59:59 1947 UTC = Sun Apr 13 01:59:59 1947 BST isdst=1 gmtoff=3600 Europe/London Sun Apr 13 01:00:00 1947 UTC = Sun Apr 13 03:00:00 1947 BDST isdst=1 gmtoff=7200 Europe/London Sun Aug 10 00:59:59 1947 UTC = Sun Aug 10 02:59:59 1947 BDST isdst=1 gmtoff=7200 Europe/London Sun Aug 10 01:00:00 1947 UTC = Sun Aug 10 02:00:00 1947 BST isdst=1 gmtoff=3600 Europe/London Sun Nov 2 01:59:59 1947 UTC = Sun Nov 2 02:59:59 1947 BST isdst=1 gmtoff=3600 Europe/London Sun Nov 2 02:00:00 1947 UTC = Sun Nov 2 02:00:00 1947 GMT isdst=0 gmtoff=0 ...
こういう状況では、mktime に与える isdst で時差を同定するのは難しい。
GNU/Linux の mktime がどのように動作するかみてみよう。
% cat tst.c #include <stdlib.h> #include <stdio.h> #include <time.h> int main(int argc, char *argv[]) { time_t t; struct tm arg, tm, *tmp, tl, tu; arg.tm_year = atoi(argv[1]) - 1900; arg.tm_mon = atoi(argv[2]) - 1; arg.tm_mday = atoi(argv[3]); arg.tm_hour = atoi(argv[4]); arg.tm_min = atoi(argv[5]); arg.tm_sec = atoi(argv[6]); arg.tm_isdst = atoi(argv[7]); tm = arg; t = mktime(&tm); if (t == (time_t)-1) { fprintf(stderr, "mktime error\n"); exit(1); } tmp = localtime(&t); if (tmp == NULL) { fprintf(stderr, "localtime error\n"); exit(1); } tl = *tmp; tmp = gmtime(&t); if (tmp == NULL) { fprintf(stderr, "gmtime error\n"); exit(1); } tu = *tmp; printf("%d-%02d-%02d %02d:%02d:%02d %s -> ", arg.tm_year + 1900, arg.tm_mon + 1, arg.tm_mday, arg.tm_hour, arg.tm_min, arg.tm_sec, arg.tm_isdst > 0 ? "dst" : arg.tm_isdst == 0 ? "std" : "unknown"); printf("%d-%02d-%02d %02d:%02d:%02d %s %s (%ld) : ", tl.tm_year + 1900, tl.tm_mon + 1, tl.tm_mday, tl.tm_hour, tl.tm_min, tl.tm_sec, tl.tm_isdst > 0 ? "dst" : tl.tm_isdst == 0 ? "std" : "unknown", tl.tm_zone, tl.tm_gmtoff); printf("%d-%02d-%02d %02d:%02d:%02d %s %s (%ld)\n", tu.tm_year + 1900, tu.tm_mon + 1, tu.tm_mday, tu.tm_hour, tu.tm_min, tu.tm_sec, tu.tm_isdst > 0 ? "dst" : tu.tm_isdst == 0 ? "std" : "unknown", tu.tm_zone, tu.tm_gmtoff); return 0; } % gcc -Wall tst.c
ここで、1944年の夏時間の中の夏時間から普通の夏時間へ戻るところを試してみよう。そういうタイミングでは、(普通の夏時間から標準時に戻るときと同様に) 時差の指定のない時刻表記があいまいになる。夏時間と標準時であれば isdst でそのあいまいさを解決できるが、どちらも夏時間となると、そうはいかない。
1944年は
Europe/London Sun Apr 2 00:59:59 1944 UTC = Sun Apr 2 01:59:59 1944 BST isdst=1 gmtoff=3600 Europe/London Sun Apr 2 01:00:00 1944 UTC = Sun Apr 2 03:00:00 1944 BDST isdst=1 gmtoff=7200 Europe/London Sun Sep 17 00:59:59 1944 UTC = Sun Sep 17 02:59:59 1944 BDST isdst=1 gmtoff=7200 Europe/London Sun Sep 17 01:00:00 1944 UTC = Sun Sep 17 02:00:00 1944 BST isdst=1 gmtoff=3600
というわけなので、1944-09-17 02:30:00 はあいまいな時刻である。isdst を 0 にして mktime に食わせてみると以下のようになる。
% TZ=Europe/London ./a.out 1944 9 17 2 30 0 0 1944-09-17 02:30:00 std -> 1944-09-17 03:30:00 dst BST (3600) : 1944-09-17 02:30:00 std GMT (0)
ふーん。GMT 側が 02:30 な時刻が返ってくるのか。まぁ、標準時と指定したのだから、それはそれで正しいか。
もうちょっといろいろ試してみる。
1944-09-17 00:30:00 unknown -> 1944-09-17 00:30:00 dst BDST (7200) : 1944-09-16 22:30:00 std GMT (0) 1944-09-17 01:30:00 unknown -> 1944-09-17 01:30:00 dst BDST (7200) : 1944-09-16 23:30:00 std GMT (0) 1944-09-17 02:30:00 unknown -> 1944-09-17 02:30:00 dst BST (3600) : 1944-09-17 01:30:00 std GMT (0) 1944-09-17 03:30:00 unknown -> 1944-09-17 03:30:00 dst BST (3600) : 1944-09-17 02:30:00 std GMT (0) 1944-09-17 00:30:00 dst -> 1944-09-17 00:30:00 dst BDST (7200) : 1944-09-16 22:30:00 std GMT (0) 1944-09-17 01:30:00 dst -> 1944-09-17 01:30:00 dst BDST (7200) : 1944-09-16 23:30:00 std GMT (0) 1944-09-17 02:30:00 dst -> 1944-09-17 02:30:00 dst BST (3600) : 1944-09-17 01:30:00 std GMT (0) 1944-09-17 03:30:00 dst -> 1944-09-17 03:30:00 dst BST (3600) : 1944-09-17 02:30:00 std GMT (0) 1944-09-17 00:30:00 std -> 1944-09-17 02:30:00 dst BDST (7200) : 1944-09-17 00:30:00 std GMT (0) 1944-09-17 01:30:00 std -> 1944-09-17 02:30:00 dst BST (3600) : 1944-09-17 01:30:00 std GMT (0) 1944-09-17 02:30:00 std -> 1944-09-17 03:30:00 dst BST (3600) : 1944-09-17 02:30:00 std GMT (0) 1944-09-17 03:30:00 std -> 1944-09-17 04:30:00 dst BST (3600) : 1944-09-17 03:30:00 std GMT (0)
ふむ。BDST な 02:30 という指定はできないようだ。
一日の最初の時刻はふつう 00:00 である。
夏時間のやりかたによっては 01:00 になったりするかもしれない。
では、それ以降になることはあるか?
調べてみると、あるようだ。
% zdump -v Antarctica/Syowa Antarctica/Syowa Fri Dec 13 20:45:52 1901 UTC = Fri Dec 13 20:45:52 1901 SYOT isdst=0 gmtoff=0 Antarctica/Syowa Sat Dec 14 20:45:52 1901 UTC = Sat Dec 14 20:45:52 1901 SYOT isdst=0 gmtoff=0 Antarctica/Syowa Mon Jan 28 23:59:59 1957 UTC = Mon Jan 28 23:59:59 1957 SYOT isdst=0 gmtoff=0 Antarctica/Syowa Tue Jan 29 00:00:00 1957 UTC = Tue Jan 29 03:00:00 1957 SYOT isdst=0 gmtoff=10800 Antarctica/Syowa Mon Jan 18 03:14:07 2038 UTC = Mon Jan 18 06:14:07 2038 SYOT isdst=0 gmtoff=10800 Antarctica/Syowa Tue Jan 19 03:14:07 2038 UTC = Tue Jan 19 06:14:07 2038 SYOT isdst=0 gmtoff=10800
1957年1月29日より前は UTC だったのが、それ以降は +03:00 になったため、その日の最初の時刻は 03:00 である。
これは南極の昭和基地のタイムゾーンなのだが、昭和基地ができた (命名された?) のがその日だからということのようだ。
まぁ、極地では人間がいなければタイムゾーンもないということか。
03:00 は昭和基地の他にふたつみつかった。America/Danmarkshavn と Asia/Kashgar である。
Danmarkshavn はグリーンランドにある小さな気象観測所らしい。
% zdump -v America/Danmarkshavn ... America/Danmarkshavn Sun Sep 24 00:59:59 1995 UTC = Sat Sep 23 22:59:59 1995 WGST isdst=1 gmtoff=-7200 America/Danmarkshavn Sun Sep 24 01:00:00 1995 UTC = Sat Sep 23 22:00:00 1995 GMT isdst=0 gmtoff=-10800 America/Danmarkshavn Mon Jan 1 02:59:59 1996 UTC = Sun Dec 31 23:59:59 1995 GMT isdst=0 gmtoff=-10800 America/Danmarkshavn Mon Jan 1 03:00:00 1996 UTC = Mon Jan 1 03:00:00 1996 GMT isdst=0 gmtoff=0 America/Danmarkshavn Mon Jan 18 03:14:07 2038 UTC = Mon Jan 18 03:14:07 2038 GMT isdst=0 gmtoff=0 America/Danmarkshavn Tue Jan 19 03:14:07 2038 UTC = Tue Jan 19 03:14:07 2038 GMT isdst=0 gmtoff=0
1996年以降 GMT になっちゃっているのだが、人間がいなくなっちゃったのだろうか?
Kashgar は中国 (新疆ウイグル自治区) にある都市のようだ。
% zdump -v Asia/Kashgar ... Asia/Kashgar Sun Dec 31 18:30:00 1939 UTC = Sun Dec 31 23:30:00 1939 CST isdst=0 gmtoff=18000 Asia/Kashgar Wed Apr 30 18:59:59 1980 UTC = Wed Apr 30 23:59:59 1980 CST isdst=0 gmtoff=18000 Asia/Kashgar Wed Apr 30 19:00:00 1980 UTC = Thu May 1 03:00:00 1980 CST isdst=0 gmtoff=28800 Asia/Kashgar Sat May 3 15:59:59 1986 UTC = Sat May 3 23:59:59 1986 CST isdst=0 gmtoff=28800 Asia/Kashgar Sat May 3 16:00:00 1986 UTC = Sun May 4 01:00:00 1986 CDT isdst=1 gmtoff=32400 Asia/Kashgar Sat Sep 13 14:59:59 1986 UTC = Sat Sep 13 23:59:59 1986 CDT isdst=1 gmtoff=32400 ...
中国なので、公式なタイムゾーンは北京のしかないが、以前は違うのを使っていたとか?
なお、3時間はこの3つしか見当たらなかったが、2時間はけっこうあるようだ。
4時間以上もいくつかあって、最大は 12時間であるが、これらはどれも南極な模様。
最大の 12時間は Antarctica/South_Pole と Antarctica/McMurdo で、南極点とMcMurdo基地のようだ。
% zdump -v Antarctica/South_Pole Antarctica/South_Pole Fri Dec 13 20:45:52 1901 UTC = Fri Dec 13 20:45:52 1901 NZST isdst=0 gmtoff=0 Antarctica/South_Pole Sat Dec 14 20:45:52 1901 UTC = Sat Dec 14 20:45:52 1901 NZST isdst=0 gmtoff=0 Antarctica/South_Pole Sat Dec 31 23:59:59 1955 UTC = Sat Dec 31 23:59:59 1955 NZST isdst=0 gmtoff=0 Antarctica/South_Pole Sun Jan 1 00:00:00 1956 UTC = Sun Jan 1 12:00:00 1956 NZST isdst=0 gmtoff=43200 Antarctica/South_Pole Sat Nov 2 13:59:59 1974 UTC = Sun Nov 3 01:59:59 1974 NZST isdst=0 gmtoff=43200 Antarctica/South_Pole Sat Nov 2 14:00:00 1974 UTC = Sun Nov 3 03:00:00 1974 NZDT isdst=1 gmtoff=46800 Antarctica/South_Pole Sat Feb 22 13:59:59 1975 UTC = Sun Feb 23 02:59:59 1975 NZDT isdst=1 gmtoff=46800 Antarctica/South_Pole Sat Feb 22 14:00:00 1975 UTC = Sun Feb 23 02:00:00 1975 NZST isdst=0 gmtoff=43200 Antarctica/South_Pole Sat Oct 25 13:59:59 1975 UTC = Sun Oct 26 01:59:59 1975 NZST isdst=0 gmtoff=43200 Antarctica/South_Pole Sat Oct 25 14:00:00 1975 UTC = Sun Oct 26 03:00:00 1975 NZDT isdst=1 gmtoff=46800 ...
1956年1月1日は 12:00 からはじまるようだ。
ふむ。南極点の1956年はアムンゼン・スコット基地ができて、人間が常駐するようになった年か。基地ができたのは11月らしいのがなんだが。
あと、なんで極地で夏時間やってんの、と思ったが、ニュージーランドとあわせてあるようだな。
HP PA-RISC な Linux では EAGAIN != EWOULDBLOCK らしい。
flock, FAGAIN, and FWOULDBLOCK
そして、それは HP-UX がそうだから、だという。
VxWorks もそうらしい。
[latest]