すのものの「いろいろ」(その22)

HTML 文書の背景(bgcolor)に使えそうな色を探すための表(TABLE)

次の表(TABLE)は、 HTML 文書の背景(bgcolor)に使えそうな色を探すために作ったものだ。 明るいほうが望ましいだろうから、 一枚目は赤が、二枚目は緑が、三枚目は青が FF で固定されている。 残りの二色は、背景になりそうな(=明るい)範囲で動かしている。

FFBFBF FFBFC3 FFBFC7 FFBFCB FFBFCF FFBFD3 FFBFD7 FFBFDB FFBFDF FFBFE3 FFBFE7 FFBFEB FFBFEF FFBFF3 FFBFF7 FFBFFB FFBFFF
FFC3BF FFC3C3 FFC3C7 FFC3CB FFC3CF FFC3D3 FFC3D7 FFC3DB FFC3DF FFC3E3 FFC3E7 FFC3EB FFC3EF FFC3F3 FFC3F7 FFC3FB FFC3FF
FFC7BF FFC7C3 FFC7C7 FFC7CB FFC7CF FFC7D3 FFC7D7 FFC7DB FFC7DF FFC7E3 FFC7E7 FFC7EB FFC7EF FFC7F3 FFC7F7 FFC7FB FFC7FF
FFCBBF FFCBC3 FFCBC7 FFCBCB FFCBCF FFCBD3 FFCBD7 FFCBDB FFCBDF FFCBE3 FFCBE7 FFCBEB FFCBEF FFCBF3 FFCBF7 FFCBFB FFCBFF
FFCFBF FFCFC3 FFCFC7 FFCFCB FFCFCF FFCFD3 FFCFD7 FFCFDB FFCFDF FFCFE3 FFCFE7 FFCFEB FFCFEF FFCFF3 FFCFF7 FFCFFB FFCFFF
FFD3BF FFD3C3 FFD3C7 FFD3CB FFD3CF FFD3D3 FFD3D7 FFD3DB FFD3DF FFD3E3 FFD3E7 FFD3EB FFD3EF FFD3F3 FFD3F7 FFD3FB FFD3FF
FFD7BF FFD7C3 FFD7C7 FFD7CB FFD7CF FFD7D3 FFD7D7 FFD7DB FFD7DF FFD7E3 FFD7E7 FFD7EB FFD7EF FFD7F3 FFD7F7 FFD7FB FFD7FF
FFDBBF FFDBC3 FFDBC7 FFDBCB FFDBCF FFDBD3 FFDBD7 FFDBDB FFDBDF FFDBE3 FFDBE7 FFDBEB FFDBEF FFDBF3 FFDBF7 FFDBFB FFDBFF
FFDFBF FFDFC3 FFDFC7 FFDFCB FFDFCF FFDFD3 FFDFD7 FFDFDB FFDFDF FFDFE3 FFDFE7 FFDFEB FFDFEF FFDFF3 FFDFF7 FFDFFB FFDFFF
FFE3BF FFE3C3 FFE3C7 FFE3CB FFE3CF FFE3D3 FFE3D7 FFE3DB FFE3DF FFE3E3 FFE3E7 FFE3EB FFE3EF FFE3F3 FFE3F7 FFE3FB FFE3FF
FFE7BF FFE7C3 FFE7C7 FFE7CB FFE7CF FFE7D3 FFE7D7 FFE7DB FFE7DF FFE7E3 FFE7E7 FFE7EB FFE7EF FFE7F3 FFE7F7 FFE7FB FFE7FF
FFEBBF FFEBC3 FFEBC7 FFEBCB FFEBCF FFEBD3 FFEBD7 FFEBDB FFEBDF FFEBE3 FFEBE7 FFEBEB FFEBEF FFEBF3 FFEBF7 FFEBFB FFEBFF
FFEFBF FFEFC3 FFEFC7 FFEFCB FFEFCF FFEFD3 FFEFD7 FFEFDB FFEFDF FFEFE3 FFEFE7 FFEFEB FFEFEF FFEFF3 FFEFF7 FFEFFB FFEFFF
FFF3BF FFF3C3 FFF3C7 FFF3CB FFF3CF FFF3D3 FFF3D7 FFF3DB FFF3DF FFF3E3 FFF3E7 FFF3EB FFF3EF FFF3F3 FFF3F7 FFF3FB FFF3FF
FFF7BF FFF7C3 FFF7C7 FFF7CB FFF7CF FFF7D3 FFF7D7 FFF7DB FFF7DF FFF7E3 FFF7E7 FFF7EB FFF7EF FFF7F3 FFF7F7 FFF7FB FFF7FF
FFFBBF FFFBC3 FFFBC7 FFFBCB FFFBCF FFFBD3 FFFBD7 FFFBDB FFFBDF FFFBE3 FFFBE7 FFFBEB FFFBEF FFFBF3 FFFBF7 FFFBFB FFFBFF
FFFFBF FFFFC3 FFFFC7 FFFFCB FFFFCF FFFFD3 FFFFD7 FFFFDB FFFFDF FFFFE3 FFFFE7 FFFFEB FFFFEF FFFFF3 FFFFF7 FFFFFB FFFFFF

BFFFBF C3FFBF C7FFBF CBFFBF CFFFBF D3FFBF D7FFBF DBFFBF DFFFBF E3FFBF E7FFBF EBFFBF EFFFBF F3FFBF F7FFBF FBFFBF FFFFBF
BFFFC3 C3FFC3 C7FFC3 CBFFC3 CFFFC3 D3FFC3 D7FFC3 DBFFC3 DFFFC3 E3FFC3 E7FFC3 EBFFC3 EFFFC3 F3FFC3 F7FFC3 FBFFC3 FFFFC3
BFFFC7 C3FFC7 C7FFC7 CBFFC7 CFFFC7 D3FFC7 D7FFC7 DBFFC7 DFFFC7 E3FFC7 E7FFC7 EBFFC7 EFFFC7 F3FFC7 F7FFC7 FBFFC7 FFFFC7
BFFFCB C3FFCB C7FFCB CBFFCB CFFFCB D3FFCB D7FFCB DBFFCB DFFFCB E3FFCB E7FFCB EBFFCB EFFFCB F3FFCB F7FFCB FBFFCB FFFFCB
BFFFCF C3FFCF C7FFCF CBFFCF CFFFCF D3FFCF D7FFCF DBFFCF DFFFCF E3FFCF E7FFCF EBFFCF EFFFCF F3FFCF F7FFCF FBFFCF FFFFCF
BFFFD3 C3FFD3 C7FFD3 CBFFD3 CFFFD3 D3FFD3 D7FFD3 DBFFD3 DFFFD3 E3FFD3 E7FFD3 EBFFD3 EFFFD3 F3FFD3 F7FFD3 FBFFD3 FFFFD3
BFFFD7 C3FFD7 C7FFD7 CBFFD7 CFFFD7 D3FFD7 D7FFD7 DBFFD7 DFFFD7 E3FFD7 E7FFD7 EBFFD7 EFFFD7 F3FFD7 F7FFD7 FBFFD7 FFFFD7
BFFFDB C3FFDB C7FFDB CBFFDB CFFFDB D3FFDB D7FFDB DBFFDB DFFFDB E3FFDB E7FFDB EBFFDB EFFFDB F3FFDB F7FFDB FBFFDB FFFFDB
BFFFDF C3FFDF C7FFDF CBFFDF CFFFDF D3FFDF D7FFDF DBFFDF DFFFDF E3FFDF E7FFDF EBFFDF EFFFDF F3FFDF F7FFDF FBFFDF FFFFDF
BFFFE3 C3FFE3 C7FFE3 CBFFE3 CFFFE3 D3FFE3 D7FFE3 DBFFE3 DFFFE3 E3FFE3 E7FFE3 EBFFE3 EFFFE3 F3FFE3 F7FFE3 FBFFE3 FFFFE3
BFFFE7 C3FFE7 C7FFE7 CBFFE7 CFFFE7 D3FFE7 D7FFE7 DBFFE7 DFFFE7 E3FFE7 E7FFE7 EBFFE7 EFFFE7 F3FFE7 F7FFE7 FBFFE7 FFFFE7
BFFFEB C3FFEB C7FFEB CBFFEB CFFFEB D3FFEB D7FFEB DBFFEB DFFFEB E3FFEB E7FFEB EBFFEB EFFFEB F3FFEB F7FFEB FBFFEB FFFFEB
BFFFEF C3FFEF C7FFEF CBFFEF CFFFEF D3FFEF D7FFEF DBFFEF DFFFEF E3FFEF E7FFEF EBFFEF EFFFEF F3FFEF F7FFEF FBFFEF FFFFEF
BFFFF3 C3FFF3 C7FFF3 CBFFF3 CFFFF3 D3FFF3 D7FFF3 DBFFF3 DFFFF3 E3FFF3 E7FFF3 EBFFF3 EFFFF3 F3FFF3 F7FFF3 FBFFF3 FFFFF3
BFFFF7 C3FFF7 C7FFF7 CBFFF7 CFFFF7 D3FFF7 D7FFF7 DBFFF7 DFFFF7 E3FFF7 E7FFF7 EBFFF7 EFFFF7 F3FFF7 F7FFF7 FBFFF7 FFFFF7
BFFFFB C3FFFB C7FFFB CBFFFB CFFFFB D3FFFB D7FFFB DBFFFB DFFFFB E3FFFB E7FFFB EBFFFB EFFFFB F3FFFB F7FFFB FBFFFB FFFFFB
BFFFFF C3FFFF C7FFFF CBFFFF CFFFFF D3FFFF D7FFFF DBFFFF DFFFFF E3FFFF E7FFFF EBFFFF EFFFFF F3FFFF F7FFFF FBFFFF FFFFFF

BFBFFF BFC3FF BFC7FF BFCBFF BFCFFF BFD3FF BFD7FF BFDBFF BFDFFF BFE3FF BFE7FF BFEBFF BFEFFF BFF3FF BFF7FF BFFBFF BFFFFF
C3BFFF C3C3FF C3C7FF C3CBFF C3CFFF C3D3FF C3D7FF C3DBFF C3DFFF C3E3FF C3E7FF C3EBFF C3EFFF C3F3FF C3F7FF C3FBFF C3FFFF
C7BFFF C7C3FF C7C7FF C7CBFF C7CFFF C7D3FF C7D7FF C7DBFF C7DFFF C7E3FF C7E7FF C7EBFF C7EFFF C7F3FF C7F7FF C7FBFF C7FFFF
CBBFFF CBC3FF CBC7FF CBCBFF CBCFFF CBD3FF CBD7FF CBDBFF CBDFFF CBE3FF CBE7FF CBEBFF CBEFFF CBF3FF CBF7FF CBFBFF CBFFFF
CFBFFF CFC3FF CFC7FF CFCBFF CFCFFF CFD3FF CFD7FF CFDBFF CFDFFF CFE3FF CFE7FF CFEBFF CFEFFF CFF3FF CFF7FF CFFBFF CFFFFF
D3BFFF D3C3FF D3C7FF D3CBFF D3CFFF D3D3FF D3D7FF D3DBFF D3DFFF D3E3FF D3E7FF D3EBFF D3EFFF D3F3FF D3F7FF D3FBFF D3FFFF
D7BFFF D7C3FF D7C7FF D7CBFF D7CFFF D7D3FF D7D7FF D7DBFF D7DFFF D7E3FF D7E7FF D7EBFF D7EFFF D7F3FF D7F7FF D7FBFF D7FFFF
DBBFFF DBC3FF DBC7FF DBCBFF DBCFFF DBD3FF DBD7FF DBDBFF DBDFFF DBE3FF DBE7FF DBEBFF DBEFFF DBF3FF DBF7FF DBFBFF DBFFFF
DFBFFF DFC3FF DFC7FF DFCBFF DFCFFF DFD3FF DFD7FF DFDBFF DFDFFF DFE3FF DFE7FF DFEBFF DFEFFF DFF3FF DFF7FF DFFBFF DFFFFF
E3BFFF E3C3FF E3C7FF E3CBFF E3CFFF E3D3FF E3D7FF E3DBFF E3DFFF E3E3FF E3E7FF E3EBFF E3EFFF E3F3FF E3F7FF E3FBFF E3FFFF
E7BFFF E7C3FF E7C7FF E7CBFF E7CFFF E7D3FF E7D7FF E7DBFF E7DFFF E7E3FF E7E7FF E7EBFF E7EFFF E7F3FF E7F7FF E7FBFF E7FFFF
EBBFFF EBC3FF EBC7FF EBCBFF EBCFFF EBD3FF EBD7FF EBDBFF EBDFFF EBE3FF EBE7FF EBEBFF EBEFFF EBF3FF EBF7FF EBFBFF EBFFFF
EFBFFF EFC3FF EFC7FF EFCBFF EFCFFF EFD3FF EFD7FF EFDBFF EFDFFF EFE3FF EFE7FF EFEBFF EFEFFF EFF3FF EFF7FF EFFBFF EFFFFF
F3BFFF F3C3FF F3C7FF F3CBFF F3CFFF F3D3FF F3D7FF F3DBFF F3DFFF F3E3FF F3E7FF F3EBFF F3EFFF F3F3FF F3F7FF F3FBFF F3FFFF
F7BFFF F7C3FF F7C7FF F7CBFF F7CFFF F7D3FF F7D7FF F7DBFF F7DFFF F7E3FF F7E7FF F7EBFF F7EFFF F7F3FF F7F7FF F7FBFF F7FFFF
FBBFFF FBC3FF FBC7FF FBCBFF FBCFFF FBD3FF FBD7FF FBDBFF FBDFFF FBE3FF FBE7FF FBEBFF FBEFFF FBF3FF FBF7FF FBFBFF FBFFFF
FFBFFF FFC3FF FFC7FF FFCBFF FFCFFF FFD3FF FFD7FF FFDBFF FFDFFF FFE3FF FFE7FF FFEBFF FFEFFF FFF3FF FFF7FF FFFBFF FFFFFF

利用したプログラムは以下のとおりである。 定数を変えれば、色の間隔や範囲が変わる。

#include <stdio.h>

#define MIN(X,Y)    ((X)<(Y)?(X):(Y))
#define MAX(X,Y)    ((X)>(Y)?(X):(Y))
#define NOR(X)      MAX(MIN((X),255),0)     /* 0 以上 255 以下に規格化する */

#define START       191     /* この値から */
#define END         255     /* この値まで */
#define DIFF        4       /* これだけずつ増やしてゆく */
#define DEFAULT     255     /* 動かさない色はこの値に */

main() {
    int i, j;

    printf("<P>\n");
    printf("<TABLE>\n");
    for (i=START; i<=END; i+=DIFF) {
        printf("<TR>\n");
        for (j=START; j<=END; j+=DIFF) {
            printf("<TD bgcolor=\"#%02X%02X%02X\">", DEFAULT, NOR(i), NOR(j));
            printf("%02X%02X%02X\n", DEFAULT, NOR(i), NOR(j));
        }
    }
    printf("</TABLE>\n");
    printf("</P>\n");

    printf("<P>\n");
    printf("<TABLE>\n");
    for (i=START; i<=END; i+=DIFF) {
        printf("<TR>\n");
        for (j=START; j<=END; j+=DIFF) {
            printf("<TD bgcolor=\"#%02X%02X%02X\">", NOR(j), DEFAULT, NOR(i));
            printf("%02X%02X%02X\n", NOR(j), DEFAULT, NOR(i));
        }
    }
    printf("</TABLE>\n");
    printf("</P>\n");

    printf("<P>\n");
    printf("<TABLE>\n");
    for (i=START; i<=END; i+=DIFF) {
        printf("<TR>\n");
        for (j=START; j<=END; j+=DIFF) {
            printf("<TD bgcolor=\"#%02X%02X%02X\">", NOR(i), NOR(j), DEFAULT);
            printf("%02X%02X%02X\n", NOR(i), NOR(j), DEFAULT);
        }
    }
    printf("</TABLE>\n");
    printf("</P>\n");
}

256 × 256 × 256 の立方体で、 (RR, GG, BB) の位置にある単位立方体の色が #RRGGBB のものを考えると、 上の三つの表はその立方体の面のうち明るい三つの面(の一部)と思うことができる。

2001-01-10 (3) 02:43:30 +0900

2001-01-06 (6) の日記 --- 怪しい募金の手紙、チョコレート爆食

休みだが、職場に行く。

書類受けに差出人名のない封筒がはいっていた。 宛名には、私の名前がプリンタで打ち出されたシールが貼られている。 このような手紙は開封しないほうが無難なのだが、 外部から郵送されてきたものではなさそうだし、 透かしてみると紙しかはいっていないようなので、開けてみた。 中味は他学科の教授の退官記念募金だった。 慣例ではこのような手紙は縦書きで印刷屋に頼むところを、 横書きでプリンタで打ち出している。 宛先の「各位」を先頭ではなく下のほうにもってきているのは、 ものを知らないやつが縦書きの手紙を見本にして丸写ししたものか?  また、発起人の一人の教授の名前は「郎」を「朗」と誤っている。 振込先は全国どこからでも便利なように郵便局にするのが慣例なのに近くの銀行とし、 振込用紙の口座名・口座番号は手書きだ。 なんだか怪しい。 偽造ではないか。 そうでないとしても、 差出人名を封筒に書かないのはなぜか?  書いたら受取拒否されるような教授だと発起人たちが自覚しているのだろうか?  即座にごみ箱に叩き込んだ。

たまり部屋のようなところに、 チョコレートがおいてあった。 内祝だそうだ。 少し食べだしたら止まらなくなり、 全部たいらげてしまった。 二十個ぐらいあっただろうか。

夜になったら持病の頭痛がでそうな感じで、早めに寝た。

2001-01-10 (3) 02:15:05 +0900

渡されたアドレスに値を返す関数は、実引数がダミーで重複していたら危険

ちょっと前に書いた void unzeller(long days, int* year, int* month, int* day); のように三つ以上のポインタを渡してそこに値を返させる関数は、 複数の実引数に同一のダミー変数のアドレスを渡すと誤りが生じる可能性がある。

わざわざ関数にするはずのないような例だが、 下の例では“自分は最後のだけが必要だから”と第一、 第二引数に同一の変数 dummy のアドレスを与えて呼び出したため結果がおかしくなっている。

#include <stdio.h>

void f(int a, int *p2, int *p3, int *p5);

main() {
    int a, b;
    int dummy;

    a = 3;
    f(a, &dummy, &dummy, &b);
    printf("%d の五倍は %d です.\n", a, b);
}

/* a の二倍、三倍、五倍を *p2, *p3, *p5 に返す */
void f(int a, int *p2, int *p3, int *p5) {
    *p2 = 2*a;
    *p3 = 3*a;
    *p5 = *p2 + *p3;
}
引数のポインタが指すメモリを“一時変数” として使うのはそれらが同一のアドレスを指している場合に危険、 ということだ。 そういう呼び出し方はできないとコメントに書いておくか、 そういう呼び出し方をされてもいいようにプログラムを書くか、 どちらかが必要だろう。

unzeller() はこのような呼び出し方をされても正しい値を返すが、 そのうち直しておこう。

2001-01-08 (1) 17:40:50 +0900

この書き直しは行なわなかった。 jul2jd.c の中の 「ユリウス日からユリウス暦への換算」を行なう jd2jul() および greg2jd.c の中の 「ユリウス日からグレゴリウス暦への換算」を行なう jd2greg() がそれに代わるものである。

2002-09-07 (6) 22:37:35 +0900

例外的にうるう年でない年をまたぐと 12 年でカレンダーが元に戻る

二三日前、 「(international) week number で第 53 週まである年はどのように分布する?  (2000-12-31 (0) 01:54:40 +0900)」 の表をぼんやりと見ていたら、 1800 年などの例外的にうるう年でない年をまたぐと 40 年後が全く同じカレンダーになることに気づいた。 だから、 例えば 1760 年 3 月 1 日から 1800 年 2 月 28 日までの期間に生まれた人は、 生まれた日と 40 歳の誕生日とが同じ曜日になる。

それよりも、そこをまたぐと 12 年で元に戻るほうが面白いか。 干支(えと)も戻るし。 「このカレンダーはとっておくと次の巳年にまた使えます」などなど。

(例外をまたがないとカレンダーは 28 年で元に戻るので、 12 年で戻るなら 12 + 28 = 40 年で戻るのは当然なのだ。)

2001-01-08 (1) 15:13:00 +0900

上のリンクはいまはった。 もとは a href タグをおいていなかった。

2004-05-04 (2) 20:07:01 +0900

冗談提案>「4 で割り切れる年はうるう年で 128 で割り切れる年は例外」

広辞苑によれば太陽年は 365.24219... 日だそうだ。 4 年ごとにうるう日をいれると一年あたり 365.25 日でやや多すぎる。 そこで現行では 100 年ごとにうるう日をやめる。これで 365.24 日。 今度は少なすぎるので 400 年ごとにうるう日をやめるのをやめる。 これで一年あたり 365.2425 日となり、太陽年との差は 0.0003 日ほどになる。 もしも 2 のベキである 128 年ごとにうるう日をやめたら、 一年あたり (365 * 128 + 31) / 128 = 365.24218... 日で、 差は 0.00001 日となる。 これは現行の差の約 30 分の 1 だ。

規則は『西暦の「年」が 4 で割り切れる年はうるう年とするが 128 で割り切れる年は例外とする』となろうか。 現行よりも規則が短くて済み、かつ精度がよいという利点がある。 しかし、いまからこれに乗り換えて 2048 年を平年に、というのはきっと無理だ。

この暦での 128 年は 46751 日で、「四万六千日」に近い。 6678 週と 5 日なので 128 年では曜日は元に戻らず、 曜日までこめた周期は 128 * 7 = 896 年となる。 (現行暦では 400 年で曜日も元に戻る。)

2001-01-05 (5) 02:57:10 +0900

1989 年の旧正月は、元号では何年の正月だったのか? 平成元年?

3日づけ朝日新聞大阪本社版「天声人語」に 《旧暦では、まだ去年の十二月九日》 とあったが、ほんとうに「去年」なのだろうか?

私が聞いたところでは、旧暦から新暦への変更は “明治5年12月3日をもって明治6年1月1日とする” というようなおふれが出て実施された。 その後は旧暦は公的には作られていないそうだが、 「旧暦がそれ以降も作られつづけたとしたときの (旧暦の)明治5年の(旧暦での)次の年」 は新暦の明治6年とほぼ重なるはずだ。 よって、それを「旧暦の明治6年」と呼んでもよいだろう。 こうやってゆけば、それ以降も、 新暦の年と旧暦の年とを対応づけることができると思われる。

ところが、「平成」は 1989 年 1 月 8 日に始まった。 この日は冬至から 20 日も経っていないので、 冬至を含む月を 11 月と定義する旧暦ではまだ昭和 63 年のはずだ。 ここで「平成」に改元されたので、 旧暦では「昭和」は 63 年までしかなく、 平成元年は 1989 年の春に終わっている ---。 もしもこう考えるなら、それ以降は旧暦のほうが一年近く進んでいるのだ。 天声人語にあったのは《旧暦では、もう今年の十二月九日》 でなければならない。 (ちなみに、「明治」から「大正」、「大正」から「昭和」の改元には、 その日付から判断して、 このような現象は起きていないと思われる。)

ここまでを聞いたある人いわく、 干支で同定するのではないか、と。 そうだ。そのはずだ。 そういえば、理科年表にはその年の干支が載っている。

そこで新たな疑問。 (新暦)1989 年の春にあった旧暦の新年は、 元号で言えば何年の新年だったのだろうか?  「平成元年」という答えは「元年の新年はない」という“伝統”に反する。 「昭和 64 年」? 新暦ではもう元号が変わっているのに。

2001-01-05 (5) 02:15:16 +0900

Win95 付属の telnet でログファイルを上書きしてしまったようだ

既存ファイルをログファイルに選ぶと上書きされるのは知っていたが、 既存のファイル名一覧にアイコンが出るので、 そのアイコンをクリックしたらそのファイルが開いて中を確かめられると思い違いをしてしまった。 デフォルト名の telnet.log だから、おそらく大事なものははいっていない。 メモ帳で確認後、全内容を廃棄してサイズ 0 だった可能性大だ。 そうだ、きっとそうだ(と思おう)。

それにしても、アイコンを見るとすぐクリックするのは悪いくせ。

2001-01-05 (5) 00:58:35 +0900

朝日新聞>初もうでの記事>「新世紀は短め」って何が?

3日づけ朝日新聞大阪本社版1面に 「みんなお疲れ? 新世紀は短め」という記事が出ているが、 何が短いのか本文を読んでもわからない。 確かに今世紀は前世紀よりも1日だけ短いが、そのことではあるまい。 初もうで客の出足が少し鈍い、とあるので人の列かもしれない。

2001-01-04 (4) 22:50:20 +0900

朝日新聞の文字がまた大きくなるそうだ --- どこまで大きくなるのか?

3日づけ朝日新聞大阪本社版1面によると、 4月からさらに字が大きくなるそうだ。 こうやってどんどん大きくなってゆくと、 二十一世紀の終わりには1面につき1文字しか書かれていなかったりして。

ちなみに、そのお知らせには「活字」という言葉はたった一度、 《もともと小さかった新聞活字をいかに大きく見せるか、先人の工夫が……》 と過去を振り返るところに一度使われているだけだ。

2001-01-04 (4) 22:46:03 +0900

福袋ならぬ禍袋(わざわいぶくろ)があったら

お金がなくて福袋が買えなかった人が夜道をとぼとぼ歩いてゆくと、 暗闇から男が 「どうです、これ。5000 円でいかがです」 と声をかけ、福袋のような袋を突き出す。 「そんなお金ありません」 「そうでしょうね。知っていますよ、 さっきそこでお金がなくて福袋をあきらめたのを。 でも、5000 円、あなたが払うんじゃないんです。 私が差し上げるんです。そのうえにこの袋も」 「そんなバカな、お金ももらえて福袋ももらえるなんて」 「福袋じゃないんです。 これは禍袋(わざわいぶくろ)といって、 中には 8000 円から 10000 円相当のわざわいがはいっているんです。 お望みならば、こちらに 50000 円の禍袋もありますよ」…… なんて話はとっくに誰かが考えているんだろうな。

2001-01-04 (4) 22:40:24 +0900

Zeller の公式の“逆”を 10000 年分チェックするプログラム

Zeller の公式の“逆”--- 通算日数から「年」 「月」「日」を計算する関数 (2001-01-04 (4) 01:21:06 +0900)」 で書いた unzeller() を、さらにチェックした。 通算第 1 日から第 3652425 日(= 10000 年 2 月 29 日)まで、 unzeller() の返した結果と、 0 年 3 月 1 日から次々と翌日を求めていったものとを比較する。

その後、unzeller() で century と year を別々に返すのをやめ、 チェックルーチンもそれに合わせて書き換えた。 下に示すのはそれである。 なお、 二重配列の書き方を調べるため K&R2 の §5.7 を見たついでに、 うるう年かどうかの判定をするマクロ isleap を同書にならって (本質的にではないが)書き改めた。

#include <stdio.h>

#define isleap(X) (!((X)%4) && (X)%100 || !((X)%400))   /* うるう年? */

void unzeller(long days, int* year, int* month, int* day);

int main() {
    long i;
    int year = 0;   /* 紀元 0 年 */
    int month = 3;  /* 3 月 */
    int day = 1;    /* 1 日 */
    int y, m, d;    /* これらは返り値用 */

    printf("このテストには少々時間がかかります. ");
    printf("「:」が 100 個印字されるまでお待ちください.\n");
    for (i=1; i<=3652425L; i++) {
        static char days[2][13] = {
            { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
            { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
        };

        unzeller(i, &y, &m, &d);
        if (year != y || month != m || day != d) {
            printf("error: %ld\n", i);
        }
        if (++day > days[isleap(year)][month]) {    /* 明日を捜せ! */
            day = 1; month++;
            if (month == 13) {
                month = 1; year++;
            }
        }
        if (i%36524L == 0) {                        /* 途中のメッセージ */
            printf(":");
        }
    }
    printf("\n");
    printf("テストは完了しました.\n");
    return 0;
}

/* zeller() の逆。通算日数 days を渡すと year に(十進の)「年」を、month に */
/* 「月」(一月が 1, ……, 十二月が 12)を、day に「日」を入れて返す。   */

void unzeller(long days, int* year, int* month, int* day) {
    int century;    /* (十進の)「年」を右に二桁だけシフトしたもの */

    century = (4 * days - 1)/ 146097L;
    days -= 146097L * century / 4;
    *year = (4 * days - 1) / 1461;
    days -= 1461L * *year / 4;
    *year += 100 * century;
    *month = (5 * days - 3) / 153 + 3;
    days -= (153 * *month - 457) / 5;
    if (*month > 12) {
        *month -= 12; (*year)++;
    }
    *day = days;
}

※ 「明日を捜せ!」はウルトラセブン第23話のタイトルでもある。

※ 最初は『「.」が 100 個印字されるまでお待ちください.』としていたが、 これでは「ください」 のあとのピリオドも数に含まれるのかどうかあいまいなのでコロンに改めた。

2001-01-04 (4) 22:34:20 +0900

上のリンクはいまはった。 もとは a href タグをおいていなかった。

2004-05-04 (2) 20:02:16 +0900

「仰ぎ希(こいねがわ)くは」を思い出せば「願わくば」ではないと気づく

金沢の教会の牧師さんが礼拝の最後に 「仰ぎ希(こいねがわ)くは……」 と言っていたような気がする。 これをもし「あおぎこいねがわくば」と言うと非常におかしく感じる。 「願わくは」だったか「願わくば」だったかわからなくなったら、 これを思い出せばいい。

2001-01-04 (4) 19:45:00 +0900

外国語の翻訳で「願わくば」とあるのは希求法の言い間違いを訳したもの?

4日づけ朝日新聞大阪本社版国際面に、 米連邦最高裁長官の発言として 「願わくば……」 と書かれているが、元来の形は「願わくは」だ。 もしかして希求法の間違いをこう訳したのかな、 と思ったが違うようだ。 なお、広辞苑第五版は「願わくば」も江戸時代からあるとしている。

2001-01-04 (4) 19:37:37 +0900

辞書の「死別」の説明 --- 「甲が乙に死別」といったら死んだのはどちら?

4日づけ朝日新聞大阪本社版社会面の桂三木助氏死去の記事に 《幼いころ父と死別し》とあったのを見て “落語に出てくる人物には 「どっちが亡くなって“死別”したんだ?」” などと聞き返すのがいそうだな、と思ったので辞書をひいてみた。

新明解国語辞典第五版で「死別」を見ると「死に別れ」と言い換えてあるので 「死に別れる」をひくと 《〔血縁・夫婦関係にある〕一方の人が死に、永久に会えなくなる》 とある。 この定義では 「AはBに死に別れる」でどちらが死んだのかわからないではないか。

広辞苑第五版は「死に別れる」を 《(親子・夫婦・きょうだいなどの間で)その人が死んだために別れることになる。 永訣する》 と説明しているが、 これでも「その人」が誰を指すのかやや不明。 岩波国語辞典第四版もほぼ同様。

芝居などでは死者の霊がものを言うことがあるが、 自分が死んで別れたことを「死に別れた」というだろうか?  また、もしも生き返ることになったとすると、 死者の国で再会した人と別れることになるが、 それは「死に別れ」だろうか「生き別れ」だろうか?

2001-01-04 (4) 19:31:31 +0900

最後の文が 《それは「死に別れ」だろうか「行き別れ」だろうか?》 となっていたのは誤変換とみなし、直した。 (「みなし」としたのは、 当時どういうつもりで書いたかはもう思い出せないからだ。)

2004-11-23 (2) 20:56:47 +0900

昔は「文書」を送るべき郵便で「音声」を送った(かも知れない)が今は逆だ

おじいちゃんおばあちゃんに、孫の声をテープに吹き込んで郵便で送る、 などしていた人が昔はいたと思う。 「文書」を送るための郵便で「音声」を送っていたわけだが、 いまは本来「音声」を送るための電話で「文書」を送る時代だ。

2001-01-04 (4) 18:59:10 +0900

Zeller の公式の“逆”--- 通算日数から「年」「月」「日」を計算する関数

Zeller の公式を改造して

long zeller(int year, int month, int day) {
    if (month < 3) {
        year--; month+=12;
    }
    return 365L * year + year / 4 - year / 100 + year / 400 \
                            + (153 * month - 457) / 5 + day;
}
とするとグレゴリウス暦 0 年 3 月 1 日からの通算日数を返すのだった。 それを次のように変形する。
long zeller(int year, int month, int day) {
    int century;

    if (month < 3) {
        year--; month+=12;
    }
    century = year / 100; year %= 100;
    return 36525L * century - century + century / 4 + 365L * year + year / 4 \
                            + (153 * month - 457) / 5 + day;
}
year を(十進表記で)右に二桁だけシフトしたものを century とし、 year の(十進表記での)下二桁を year とした。 (よって、century は一般には「世紀」とは異なる。)

上のプログラムで、 たとえば 1947 年 5 月 3 日の通算日数を調べる場合、 century を含む項は 1900 年 2 月末日(= 1899 年 14 月末日)までの日数、 year を含む項は 1900 年 3 月 1 日から 1947 年 2 月末日(= 1946 年 14 月末日) までの日数になる。 36525 は、うるう年の入れ方に 100 の倍数および 400 の倍数の年の例外がなかったとした場合の 100 年間の日数である。

上のプログラムの 36525L * century - century + century / 4 は (4 * (36525L - 1) + 1) * century / 4 に等しいし、 365L * year + year / 4 は (365L * 4 + 1) * year / 4 に等しいから、 さらに次のように変形できる。

long zeller(int year, int month, int day) {
    int century;

    if (month < 3) {
        year--; month+=12;
    }
    century = year / 100; year %= 100;
    return 146097L * century / 4 + 1461L * year / 4 \
                                + (153 * month - 457) / 5 + day;
}
146097 は 400 年間の日数、 1461 は(うるう年を含む)4 年間の日数である。

さて、y = (a * x + b) / c の“逆関数”は x = (c * y + d) / a の形だろうと想像できる。 そうやって、 通算日数から century, year, month, day を順に復元する関数 unzeller() を書いてみた。

#include <stdio.h>

#define isleap(X) (!((X)%4) && (((X)%100) || !((X)%400)))   /* うるう年? */

long zeller(int year, int month, int day);
void unzeller(long days, int* century, int* year, int* month, int* day);

int main() {
    long days;
    int i, century, year, month, day;

    /* 0 年、100 年、200 年、300 年の 03-01 の century をチェック */

    for (i=0; i<400; i+=100) {
        days = zeller(i, 3, 1);
        unzeller(days, &century, &year, &month, &day);
        if (century != i/100) {
            printf("century for %04d-03-01 is NG.\n", i);
        }
    }

    /* 100 年、200 年、300 年の 02-28 の century をチェック */

    for (i=100; i<=300; i+=100) {
        days = zeller(i, 2, 28);
        unzeller(days, &century, &year, &month, &day);
        if (century != i/100) {
            printf("century for %04d-02-28 is NG.\n", i);
        }
    }

    /* 400 年の 02-29 の century をチェック */

    days = zeller(400, 2, 29);
    unzeller(days, &century, &year, &month, &day);
    if (century != 4) {
        printf("century for 0400-02-29 is NG.\n");
    }

    /* 以上で century のチェックは終了 */

    /* 1600 年から 1999 年までの 03-01 の year をチェック */

    for (i=1600; i<2000; i++) {
        days = zeller(i, 3, 1);
        unzeller(days, &century, &year, &month, &day);
        if (year != i%100) {
            printf("year for %04d-03-01 is NG.\n", i);
        }
    }

    /* 1600 年から 1999 年までの 2 月末日の year をチェック */

    for (i=1600; i<2000; i++) {
        days = zeller(i, 2, 28+isleap(i));
        unzeller(days, &century, &year, &month, &day);
        if (year != i%100) {
            printf("year for %04d-02-%02d is NG.\n", i, 28+isleap(i));
        }
    }

    /* 以上で year のチェックは終了 */

    /* 2000 年の各月の 01 日の month をチェック */

    for (i=1; i<=12; i++) {
        days = zeller(2000, i, 1);
        unzeller(days, &century, &year, &month, &day);
        if (month != i) {
            printf("month for 2000-%02d-01 is NG.\n", i);
        }
    }

    /* 2000 年の各月の末日の month をチェック */

    for (i=1; i<=12; i++) {
        int mday[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        days = zeller(2000, i, mday[i]);
        unzeller(days, &century, &year, &month, &day);
        if (month != i) {
            printf("month for 2000-%02d-%02d is NG.\n", i, mday[i]);
        }
    }

    /* 以上で month のチェックは終了 */

    printf("ほかに出力がなければ, テストは成功しました.\n");
    return 0;
}

/* グレゴリウス暦 0000-03-01 からの通算日数を返す */
long zeller(int year, int month, int day) {
    if (month < 3) {
        year--; month+=12;
    }
    return 365L * year + year / 4 - year / 100 + year / 400 \
            + (153 * month - 457) / 5 + day;
}

/*
    zeller() の逆。
        century には(十進の)「年」を右に二桁だけシフトしたものが、
        year には(十進の)「年」の下二桁が、
        month には「月」(一月が 1, ……, 十二月が 12)が、
        day には「日」が、
    はいります。
*/
void unzeller(long days, int* century, int* year, int* month, int* day) {
    *century = (4 * days - 1)/ 146097L;
    days -= 146097L * *century / 4;
    *year = (4 * days - 1) / 1461;
    days -= 1461L * *year / 4;
    *month = (5 * days - 3) / 153 + 3;
    days -= (153 * *month - 457) / 5;
    if (*month > 12) {
        *month -= 12; (*year)++;
        if (*year == 100) {
            *year = 0; (*century)++;
        }
    }
    *day = days;
}
main() ではこの関数 unzeller() のチェックを行なっている。 式の形から、 それぞれ最初の日と最後の日でチェックすればいいことがわかるので、 そうしている。

※ century と year を別々に返す必要はないのだが、 なりゆきでそのままにしておいた。

※ 紙とエンピツで定数項を決めたのだが、 やってみたらうまくゆかず、走らせながら適当に決め直した。 その点についてはまたあとで考えよう。

2001-01-04 (4) 01:21:06 +0900

月の大小が5カ月でくり返すことを利用する変なカレンダー

4月から8月までと、9月から翌年1月までとは大の月小の月のパターンが同じだ。 そこで、昔、下のようなカレンダーを考えたことがある。 3月から8月までは右端の1列(青字)は見ないことにする。 9月から翌年2月までは左端の1列(赤字)は見ないことにする。

                1  2  3
M   4  5  6  7  8  9 10
A  11 12 13 14 15 16 17
R  18 19 20 21 22 23 24
   25 26 27 28 29 30 31  1
    1  2  3  4  5  6  7  8
A   8  9 10 11 12 13 14 15  S
P  15 16 17 18 19 20 21 22  E
R  22 23 24 25 26 27 28 29  P
   29 30  1  2  3  4  5  6
M   6  7  8  9 10 11 12 13  O
A  13 14 15 16 17 18 19 20  C
Y  20 21 22 23 24 25 26 27  T
   27 28 29 30 31  1  2  3
J   3  4  5  6  7  8  9 10  N
U  10 11 12 13 14 15 16 17  O
N  17 18 19 20 21 22 23 24  V
   24 25 26 27 28 29 30  1
    1  2  3  4  5  6  7  8
J   8  9 10 11 12 13 14 15  D
U  15 16 17 18 19 20 21 22  E
L  22 23 24 25 26 27 28 29  C
   29 30 31  1  2  3  4  5
A   5  6  7  8  9 10 11 12  J
U  12 13 14 15 16 17 18 19  A
G  19 20 21 22 23 24 25 26  N
   26 27 28 29 30 31  1  2
       3  4  5  6  7  8  9  F
      10 11 12 13 14 15 16  E
      17 18 19 20 21 22 23  B
      24 25 26 27 28
きっと見まちがえるから、この案はダメだ。

2001-01-03 (3) 01:53:37 +0900


すのもの Sunomono