カレンダーコントロール
 
HOME
LAJAXS
JSON
カレンダーコントロール
Homepage
Blog
 

Last Update: 2005/12/08
サンプル1は、月単位ではデータが小さすぎるので年単位に変更した。
新しいイベントハンドラに対応してサンプルを作りかえた。

Introduction

 クライアント側スクリプトの調査をしていたら、たまたま日付入力の為のカレンダーコントロールサンプルを見つけました。
なる程、これはなかなか便利です。そこには、祝日表示の機能を付けた拡張版を他の人が作っていると言う紹介があったので、そちらも見に行ってきました。こちらも納得、良いですね。そこで、その作者の他のページを見ていたら、祝日と言うのは結構奥が深いものだと言うことを知りました。またそこにはその調査結果をアルゴリズム化して色々な言語で実装したライブラリも公開されています。どうもご苦労様です。

 ここで実装言語にC#版が無かったので、とりあえず作っておこうかと考えたのですが、ふと気がついた事があります。確かに便利だけど、これは日本の祝日だけにしか対応していません。各国によって祝日は異なるし、日本でも自治体によって、あるいは会社や学校などの組織で固有の休みもあるでしょう。そういう時に一体どうすれば良いでしょうか?コードを肥大化させてもきっとそういう要求には答えられないでしょう。

 この問題は一般化して考えれば、カレンダーに特別な日を加えて処理すると言う事になるので、アルゴリズムでは無くてデータで解決する方が良さそうです。そうすると、ここで「AJAX + 静的データ生成」の考え方がそのまま使えるのでは無いだろうか? つまりカレンダーデータをあらかじめ静的生成しておき、クライアント側で必要に応じてそれを読み込んで表示すれば、単純なアルゴリズムでは対応できないどんな特別な日にでも対応できるし、クライアント側スクリプトはぐっと単純化できる。なんだか良いことずくめじゃない....かな?と。

 事前生成された静的ファイルとは言えサーバーからデータを送出するのだから、サーバーに負荷がかかるのでは?と言う疑問もあります。しかし一度に読み込むのは、表示する月とその前後一ヶ月分、しかも一旦読み込んだらブラウザのキャッシュにずっと残る事になります(この場合一度生成されたデータが変更される事は無いため)。しかも一ヶ月分のデータは100バイト前後なので、大した事には無いだろうと思えます。

 と言うことで、ここで実際にそれを作ってみる事にしました。

Calendar Data Format

 まず、サーバー側に配置される静的カレンダーデータをどうするかを考えて見ました。

  • ファイル名
     クライアント側からは「西暦年」「月」を指定してデータを取得できれば良いので、ファイル名にはそれに対応した名前を付け様としました。
    しかし実際にやってみると、月単位ではオーバーヘッドが大きすぎるので、年単位でファイルを用意します(ファイルサイズは1KB程度)。
     
    yyyy.json.xml
  • データコンテナ
     JSONのページで書いたとおり、現在日本語文字化けの問題があるため「JSON in XML」形式のデータを使いましょう。ここでデータは1年分、つまり1ヶ月分データの12個分の配列なので、次の様にします。
    <?xml version="1.0" encoding="utf-8" ?>
    <j>
    [{1月のカレンダーデータ}],
    [{2月のカレンダーデータ}],
    ....
    [{12月のカレンダーデータ]
    </j>
     
  • カレンダーデータ
     最後にデータコンテナ内に含まれるデータの形式ですが、以下の様な形式にしてみました。
    days: 数値, // 当月の最大日付。必須。
    week: 数値, // 当月1日の曜日(Sunday=0,Monday=1,…Saturday=6)。必須。
    holidays: [
     {
      day: 数値, // 休祝日の日付
      name: 文字列, // 休祝日の名前(建国記念日、春分の日、振替休日...)
     },
     ...以下同形式の連続...
    ]

Static Calendar Data Generator

 データ形式が決まったので、これを生成する為のプログラムを作らなくてはなりません。
上で書いた様に、角田桂一さんの実装に足りないC#の実装を書いて、コマンドラインプログラムを作ってしまいました。

Ver. 0.2 : GenerateCalendar-0.2.zip (source/C# VS2005 project), CalendarData-0.2.zip (generated data) 
License 情報はこちら

解説

Under Construction
注1:Visual Studio 2005 で作ってありますので、 C# 2.0, .NetFramework 2.0 が必要です。
注2:このカレンダージェネレータは、ごく短いプログラムですので、あえて解説をつけるまでも無いかもしれません...

Client Sample Part 1

 データが用意できたところで、まず最初にテーブルにカレンダーを表示するページを作って見ましょう。

祝日表示機能付カレンダーページのサンプル

解説

Under Construction

Client Sample Part 2

 今度は最初に見つけた日付入力の為のカレンダーコントロールサンプルと同じインターフェースを持つ、AJAS アプローチのコントロールを作ってみます。

祝日表示機能付カレンダーコントロールのサンプル

解説

Under Construction

Extending Client

 ここまで作ってみて、とりあえず当初の目的は達成した様なので終わりとしたいところですが、最後にこれを拡張する例を記しておきます。

 これに関連してGoogleで「旧暦」を調べていたところ、遠藤武彦さんと言う方の暦の部屋と言うホームページに辿り着きました。ここには旧暦の計算方法やJavaScriptで生成する月齢カレンダー等が公開されています。これらの情報を上記のカレンダーページやカレンダーコントロールに反映させるにはどうするかと言う事を考えてみましょう。

  • データ形式
     今回作成したのはデータオリエンテッドなカレンダーですので、データを変更すれば柔軟に対応できるところが利点ですので、こちらからアプローチします。
    元のデータには、六曜のデータがありませんので、これを格納できるように拡張します。
    days: 数値, // 当月の最大日付。必須。
    week: 数値, // 当月1日の曜日(Sunday=0,Monday=1,…Saturday=6)。必須。
    week6: [0,1,2,3,...], // 当月各日の六曜値(先勝=0,友引=1,先負=2,仏滅=3,大安=4,赤口=5)。オプショナル
    holidays: [
     {
      day: 数値, // 休祝日の日付
      name: 文字列, // 休祝日の名前(建国記念日、春分の日、振替休日...)
     },
     ...以下同形式の連続...
    ]
  • データ生成
     次にこのデータを生成します。上記遠藤武彦さんの「陰暦変換プログラム」には JavaScript で書かれた西暦→旧暦の変換処理がありますので、これを上のコンバーターに組み込みます。
  • コントロールの変更
     最後に画面表示を行うJavaScriptの変更を行います。データ送受信等の部分は全く変更の必要がありませんので、1日分の表示をレンダリングする、RenderDateメソッドに対応コードを追加します。

と言った感じで結構簡単に拡張ができるでしょう。(簡単にと言っている割には、まだ自分でコードを書いていないのですが...)

 どうでしょうか? AJAS=「AJAX + 静的データ生成」って、なかなか面白いと思いませんか?

追記1:これを書いていて、昔を思い出してしまいました(歳をとると、そんなのばかりですが...)。
まだアセンブリ言語でアプリケーションを作っていた時代、処理をデータテーブル駆動でやるのが良いか、アルゴリズム駆動でやるのが良いかが、いつも議論になっていました。現在それとは全く違う環境で Web Application を作っているのに、やっぱり同じ事をやっているのかと思うと、進歩しているんだかしていないんだか複雑な心境になります。

追記2:最近話題の Web2.0。ユーザの知恵を集めて迅速なサービスを提供する事で、ユーザが自動的に集まってくる仕組みだ。Amazone (商品データ)や Google Map (地図データ)等が例に挙がっている。ではこれにならって、「世界中のどんな暦のデータもあります。ワールドワイドなカレンダーサービスを提供します」って言ってカレンダーデータを集めたら、ここも Web 2.0 になれるのかな?なれなさそうだな...。

 

Licence

上記で公開しているソフトウエアのライセンス情報です。
Public Domain に置きたいのですが、日本ではそういう訳には行かないので、次の様にします。
◆公表権:誰でも、いつでも、どこにでも公表する事を許可します。
◆氏名表示権:表示する必要はありません。もし表示する場合は、
「Copyright (C) 2005 Takashi Oyama All Rights Reserved.」
を表示してください。
◆同一性保持権:全ての改変、変更、切除を認めます。
ただし元著作物と同一で無いものを公表し、かつ氏名表示を行う場合は、
「Modified by [you name] in [publish year]
の表示を加えてください。[you name]:改変した人の氏名、[publish year]:公表した年
◆著者以外の著作物:GenerateCalender.zip には、角田桂一様その他の方によるプログラムを改変したプログラムが含まれています(HolidayChecker.cs)。このファイルに関しましては、元著者のライセンスに従ってください。
 
オンラインドキュメントの目次へ

 

HOME | LAJAXS | JSON | カレンダーコントロール
Copyright (C) 2005 Takashi Oyama All Rights Reserved.