カレンダー表示
カレンダーのない家はありませんし、仕事をする上でカレンダーのない職場もありません。これだけデジタル化された世の中なら「年」「月」「日」の3つの数字が頭にあればカレンダーなんてなくてもよい気がします。
しかし、ふと気が付くと週末まではどれくらい、月末まではどれくらいとアナログ的に判断しています。なんだか、デジタル腕時計とアナログ腕時計のシェア争いのようです。どうも人間は時間の量を長針と短針が作り出す空間から把握しているらしいので、たとえ時計の中身が徹底的にデジタル化されても表面上はアナログ風の時計になるのでしょうね。
パソコンにとってもカレンダー表示の必要性はまずありません。日付も曜日も日数も全て計算できるのですから。ただ、パソコンを使って作業するのは人間です。人が何か作業をしようと思うとまたカレンダーが登場します。
実際、バッチファイルなどで自動実行するときも、時折カレンダーのようなアナログ的な(人間的な)要素を入れておくと人にとってはよい感じです。
2010年 12月
日 月 火 水 木 金 土
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
※処理Aが終了しました。
2010.12.14 17:40:45
※処理Bが終了しました。
2010.12.14 18:51:42
こんな感じの出力だと何故か安心できます。そこで、カレンダー・システムパッケージとして、calプログラムを用意してみました。
今月のカレンダー表示
他の時間関係のプログラムと同様、calプログラムも8桁の日付を渡す仕様になっています。これはdateやweekday、moonプログラムに合わせるためで、以下のようにすると今月のカレンダーを表示することができます。
2010年 4月
日 月 火 水 木 金 土
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
もちろん以下の2つの例のように、直接年月日を指定しても問題ありません。
>rpn 20100404 -c cal
複数月のカレンダー表示
calの出力は月単位のカレンダーになるので、1年分のカレンダーを出そうと思ったら12ヶ月分実行する必要があります。でも、何度もrpn式を入力するのは大変ですよね。
そんな場合は、表示したい月の日付をテキストファイルに保存して、calプログラムに読み込ませればOKです。一気に複数月のカレンダーが表示されます。以下は2010年1月から3月までのカレンダーを表示した例です。
月初の日付をファイルで用意して…。
|20100100
|20100200
|20100300
+-------------
calプログラムに読み込ませると…。
2010年 1月
日 月 火 水 木 金 土
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
2010年 2月
日 月 火 水 木 金 土
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28
2010年 3月
日 月 火 水 木 金 土
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
テキストファイルの日付の日の部分が"00"になっていることに注意してください。月初めの"01"でもいいのですが、後で説明するエスケープシーケンスによる日付反転をさせないためです。
これで、日付のデータさえあれば何か月分のカレンダーもすぐに出てきますね。
対話型での使用方法
対話型プログラムとして使いたい場合は、以下のように空ファイルを渡してください(package入門(カレンダー・システム編)の空ファイルを参照ください)。入力プロンプトが表示されたら、年、月、日の順に入力します。
rpn [年月日] -c cal <stdin
年=
最初のプロンプトの"年"に1969とキーを打って、最後にエンターキーを押してください。
rpn [年月日] -c cal <stdin
年=1969
月=
次のプロンプトの"月"には7を入力します。
rpn [年月日] -c cal <stdin
年=1969
月=7
日=
最後のプロンプト"日"には20です。
rpn [年月日] -c cal <stdin
年=1969
月=7
日=20
1969年 7月
日 月 火 水 木 金 土
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
アポロ11号が月面に着陸したときのカレンダーです。
今日のカレンダー表示
改めてcalプログラムの表示を見ると、カレンダーの表示が月単位なのだから、日付の指定は要らないような気がします。
確かにそのとおりなのですが、実はこのcalプログラムはエスケープシーケンス版になっています。エスケープシーケンスとはDOS画面上で文字に色を付けたりすることができる機能です。
エスケープシーケンス版を使用するには、事前に環境設定が必要です。技術サポートのnpdのエスケープシーケンス設定を参考にしてください。
ウェブページの表示では違いは分かりませんが、上記のcalプログラムを実行すると7月20日の部分が反転されて表示されています。つまらない機能に思いますが、人間が見るには日付を確認する上でとても楽です。
補足事項
エスケープシーケンス版はDOS画面に表示するときは分かりやすいのですが、ファイルに保存するとエスケープシーケンスが紛れ込んでしまいます。
>notepad cal.txt ; メモ帳で開くと変な記号が…
エスケープシーケンスを除去したい場合は次のようにします。仮に今日が2010年1月15日だとして、当月のカレンダーをファイルに保存するとき、日付をちょっと加工します。
>type cal.txt
2010年 1月
日 月 火 水 木 金 土
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
>notepad cal.txt ; メモ帳で開いても問題なし
日付の日の部分を"00"に置き換えていますので、エスケープシーケンスの反転表示はありません(0日はないので)。ただし、今度は日付が分からなくなるので、他のrpnプログラムと併用することで代用します。
>rpn -c date | rpn 100 / i 100 * -c cal >>cal.txt
>type cal.txt
2010.01.15 11:01:44
2010年 1月
日 月 火 水 木 金 土
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
バッチ処理などでしか使わないとは思いますが、これでカレンダーと日付の確認ができます。
本講座で使用したプログラムは、カレンダー・システムパッケージとして購入することができます。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。