すのものの「雑ソフトウェア」

断り書きがないかぎり、C言語のソースファイルのみです。タブは 4 カラムに展開してお読みください。

すべて自由に複製・再配布してくださって構いません。

80 字× 24 行以内に一年分を表示するカレンダー cal.c

カレンダーを表示するソフトウェアはたくさんありますが、 DOS 上で一年分を表示すると最初のほうがスクロールして消えてしまうことが多く、 困ります。 そこで作ってみたのがこれです。

下のような出力になります。 月を縦に並べ、すき間を少なくしたのがミソです。

A:\>cal 2001
       1  2  3  4  5  6              1  2  3  4  5                          1 
J   7  8  9 10 11 12 13    M   6  7  8  9 10 11 12    S   2  3  4  5  6  7  8 
A  14 15 16 17 18 19 20    A  13 14 15 16 17 18 19    E   9 10 11 12 13 14 15 
N  21 22 23 24 25 26 27    Y  20 21 22 23 24 25 26    P  16 17 18 19 20 21 22 
   28 29 30 31                27 28 29 30 31             23 24 25 26 27 28 29 
                1  2  3                       1  2       30                   
F   4  5  6  7  8  9 10    J   3  4  5  6  7  8  9    O      1  2  3  4  5  6 
E  11 12 13 14 15 16 17    U  10 11 12 13 14 15 16    C   7  8  9 10 11 12 13 
B  18 19 20 21 22 23 24    N  17 18 19 20 21 22 23    T  14 15 16 17 18 19 20 
   25 26 27 28                24 25 26 27 28 29 30       21 22 23 24 25 26 27 
                1  2  3                                  28 29 30 31          
    4  5  6  7  8  9 10        1  2  3  4  5  6  7                    1  2  3 
M  11 12 13 14 15 16 17    J   8  9 10 11 12 13 14    N   4  5  6  7  8  9 10 
A  18 19 20 21 22 23 24    U  15 16 17 18 19 20 21    O  11 12 13 14 15 16 17 
R  25 26 27 28 29 30 31    L  22 23 24 25 26 27 28    V  18 19 20 21 22 23 24 
                              29 30 31                   25 26 27 28 29 30    
    1  2  3  4  5  6  7                 1  2  3  4                          1 
A   8  9 10 11 12 13 14    A   5  6  7  8  9 10 11    D   2  3  4  5  6  7  8 
P  15 16 17 18 19 20 21    U  12 13 14 15 16 17 18    E   9 10 11 12 13 14 15 
R  22 23 24 25 26 27 28    G  19 20 21 22 23 24 25    C  16 17 18 19 20 21 22 
   29 30                      26 27 28 29 30 31          23 24 25 26 27 28 29 
                                                         30 31                

何月何日が何曜日なのは何年か? を調べる uncal.c

「uncal 2 17 4 [1975 2025]」とすると 1975 年から 2025 年までで 2 月 17 日が木曜日である年を出力します。 [ ] 内は省略可で、デフォルトは 1950 年から 2050 年までです。

何のアイディアもない、 計算機実習の課題にしてもいいようなプログラムですが、 月日と曜日しか記されていないメモから年を知りたい場合などに役立ちます。

ネーミングは適当です。:-)

base64 からファイルを復元するプログラム base64.c
ファイルを base64 に変換するプログラム enbase64.c

「base64」というのが何を指すのか正確には理解していないので、 言葉づかいのおかしなところがあるかもしれないことをおことわりしておきます。

(私が理解している範囲での)base64 の定義

以下に書くのは、 昔どこかで読んで記憶の片すみに残っていることと、 最近実験してわかったこととをまとめたものです。 正式なものではありません。

3 バイトは 8*3 = 24 ビットですが、 これを 6 ビットが四つとみなします。 6 ビットは 0 から 63 までの数とみなし、

として文字に直します。

例えば、ファイル先頭の 3 バイトが ff, d8, ff だったとします。 これを二進で書くと

    11111111 11011000 11111111
となります。 この 24 ビットを 6 ビットずつに分け直すと
    111111 111101 100011 111111
となります。 これを数値に直すと 63, 61, 35, 63 です。 これを文字に変換すれば「/9j/」となります。 (jpg ファイルの冒頭にはこれが書かれているようです。)

元のファイルのバイト数が 3 の倍数に 1 あるいは 2 足りない場合、 その分だけ「全ビットが 0」のバイトを最後に付加してから変換し、 最後の 1 あるいは 2 文字 --- これは必ず A になる --- を同数の「=」で置き換えたものを結果とします。

役に立ちそうな局面

その1

添付ファイルに対応するメールソフトがない場合、 受け取ったメールに添付されているのがテキストファイルであっても読めません。 そんな場合の解読に使えます。

この方法で逆にファイルを“添付”することはおすすめしません。 受信者側のメールソフトではただのテキストファイルとして表示されますので、 “添付”ファイルを取り出すことができません。 (メールソフトによっては、 添付ファイルつきのダミーのメールを作ってその添付ファイル部分を送られてきた base64 の部分で置きかえることで、“添付”ファイルを取り出せるようです。)

その2

MIME に対応していないメールソフトでメールを読むと

From: "=?iso-2022-jp?B?GyRCJDkkTiRiJE4bKEI=?=" <sunomono◎muf.biglobe.ne.jp>
のように書かれていたりしますが、 これの解読も可能です。 それには、「=?iso-2022-jp?B?」と「?=」にはさまれた部分 「GyRCJDkkTiRiJE4bKEI=」 だけを切り抜いてファイルにしてから変換してください。 結果は JIS コードで得られます。 ちなみに、この例は「すのもの」です。

その3

(いわゆる)日本語の Subject が使えないメールソフトからメールを送る場合、 日本語の Subject を MIME 化したものを Subject とすることで、 日本語の Subject を使うことができます。 JIS コードに直し、行末に改行コードを含まない、 一行だけからなるファイルにしてから変換してください。 できたものを 「=?iso-2022-jp?B?」と「?=」 ではさめば完成です。 (こういうときのため、 引数がなければ標準入力を処理すればいいのに、 と思われるかもしれませんが、 Windows/DOS マシンも unix もコマンドラインは JIS コードでないのが普通ですので、 そのままではうまくゆきません。)

2001-09-12 (3) 00:28:03 +0900

メールアドレスを囲む不等号をエスケープするのを忘れていたので、した。 また、メールアドレス内の「@」を「◎」で置き換えた。

2005-01-30 (0) 17:35:24 +0900

グレゴリウス暦とユリウス日との間の換算 greg2jd.c
ユリウス暦とユリウス日との間の換算 jul2jd.c

Zeller の公式はグレゴリウス暦の年・月・日から曜日を計算するものだが、 それをユリウス日、すなわちユリウス暦 -4712 年 1 月 1 日からの通算日数を計算するように改変した関数と、 それの“自然”な“逆関数”、 およびそれらのユリウス暦版である。

ここでいうユリウス暦とは、 グレゴリウス暦への改暦の直前に実施されていたユリウス暦をその実施以前にまでさかのぼって延長したものである。 初期には閏年の入れ方が違っていたそうだが、それには対応していない。 また、紀元前の年の呼び方は、 1 年の前年を 0 年とする天文学上の規約に従っている。

どちらにも、10000 年分、 二つの関数をチェックするお試し用 main() がついている。

理科年表(1999 年版)のデータで検算を行なった。

注1) -4712 年 1 月 1 日のユリウス日は 1 ではなく 0 である。

注2) ユリウス日に 1 を加えてから 7 で割った余りを求めれば、 0 が日曜日、1 が月曜日、……、6 が土曜日として曜日が得られる。

2001-11-17 (6) 22:33:53 +0900

縦表示のカレンダー --- 日曜開始で週番号なしの vcal.c
月曜開始で四月から翌年三月まで・週番号つきの vcal2.c

C>vcal 2002
  Januarius  Februarius    Martius    Aprilis      Maius       Junius
   6 13 20 27 3 10 17 24 3 10 17 24 31 7 14 21 28 5 12 19 26 2  9 16 23 30
   7 14 21 28 4 11 18 25 4 11 18 25 1  8 15 22 29 6 13 20 27 3 10 17 24
1  8 15 22 29 5 12 19 26 5 12 19 26 2  9 16 23 30 7 14 21 28 4 11 18 25
2  9 16 23 30 6 13 20 27 6 13 20 27 3 10 17 24 1  8 15 22 29 5 12 19 26
3 10 17 24 31 7 14 21 28 7 14 21 28 4 11 18 25 2  9 16 23 30 6 13 20 27
4 11 18 25 1  8 15 22 1  8 15 22 29 5 12 19 26 3 10 17 24 31 7 14 21 28
5 12 19 26 2  9 16 23 2  9 16 23 30 6 13 20 27 4 11 18 25 1  8 15 22 29

  Quintilis   Sextilis    September   October     November    December
   7 14 21 28 4 11 18 25 1  8 15 22 29 6 13 20 27 3 10 17 24 1  8 15 22 29
1  8 15 22 29 5 12 19 26 2  9 16 23 30 7 14 21 28 4 11 18 25 2  9 16 23 30
2  9 16 23 30 6 13 20 27 3 10 17 24 1  8 15 22 29 5 12 19 26 3 10 17 24 31
3 10 17 24 31 7 14 21 28 4 11 18 25 2  9 16 23 30 6 13 20 27 4 11 18 25
4 11 18 25 1  8 15 22 29 5 12 19 26 3 10 17 24 31 7 14 21 28 5 12 19 26
5 12 19 26 2  9 16 23 30 6 13 20 27 4 11 18 25 1  8 15 22 29 6 13 20 27
6 13 20 27 3 10 17 24 31 7 14 21 28 5 12 19 26 2  9 16 23 30 7 14 21 28

日曜開始で、縦に週を表示するカレンダーです。 1 日から 7 日までのところで横幅を節約し、DOS の一画面に収めています。

E>vcal2 2002
   Aprilis       Maius       Junius      Quintilis    Sextilis     September
 1  8 15 22 29  6 13 20 27  3 10 17 24  1  8 15 22 29  5 12 19 26  2  9 16 23 30
 2  9 16 23 30  7 14 21 28  4 11 18 25  2  9 16 23 30  6 13 20 27  3 10 17 24
 3 10 17 24  1  8 15 22 29  5 12 19 26  3 10 17 24 31  7 14 21 28  4 11 18 25
 4 11 18 25  2  9 16 23 30  6 13 20 27  4 11 18 25  1  8 15 22 29  5 12 19 26
 5 12 19 26  3 10 17 24 31  7 14 21 28  5 12 19 26  2  9 16 23 30  6 13 20 27
 6 13 20 27  4 11 18 25  1  8 15 22 29  6 13 20 27  3 10 17 24 31  7 14 21 28
 7 14 21 28  5 12 19 26  2  9 16 23 30  7 14 21 28  4 11 18 25  1  8 15 22 29
--------------------------------------------------------------------------------
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

   October     November     December     Januarius   Februarius     Martius
    7 14 21 28  4 11 18 25  2  9 16 23 30  6 13 20 27  3 10 17 24  3 10 17 24 31
 1  8 15 22 29  5 12 19 26  3 10 17 24 31  7 14 21 28  4 11 18 25  4 11 18 25
 2  9 16 23 30  6 13 20 27  4 11 18 25  1  8 15 22 29  5 12 19 26  5 12 19 26
 3 10 17 24 31  7 14 21 28  5 12 19 26  2  9 16 23 30  6 13 20 27  6 13 20 27
 4 11 18 25  1  8 15 22 29  6 13 20 27  3 10 17 24 31  7 14 21 28  7 14 21 28
 5 12 19 26  2  9 16 23 30  7 14 21 28  4 11 18 25  1  8 15 22  1  8 15 22 29
 6 13 20 27  3 10 17 24  1  8 15 22 29  5 12 19 26  2  9 16 23  2  9 16 23 30
--------------------------------------------------------------------------------
40 41 42 43 44 45 46 47 48 49 50 51 52  1  2  3  4  5  6  7  8  9 10 11 12 13

四月から翌年三月までを、下に週番号を添えて表示します。 週番号を表示する関係で、月曜開始です。 一月から始めると下段の七月から十二月が横 80 字以内に収まらない場合があるため、 四月からとしました。

いずれも、月名がラテン語なのは単なる気まぐれです。 お好みで変えられるよう、コメントアウトされた英語名が添えられています。

2001-11-25 (0) 01:55:28 +0900


すのもの Sunomono