qreki.js

qreki

[1] qrekiグレゴリオ暦から旧暦に変換できるプログラムです。 西暦1948年から西暦2016年の間の日付を正しく扱えます。

[2] オリジナルは AWK スクリプトですが、 様々なプログラミング言語に移植されて広く使われています (>>6)。

[40] 後述の通り、もはや本ソフトウェアを使用するべきではありません。

[19] 日本の旧暦一般や他の旧暦変換表等との比較、 他の変換ソフトウェア等については、当該記事を参照。

旧暦, 暦の換算, 旧暦データファイル

正確性

[65] qreki およびその派生ソフトウェアの正確性には問題があります。

[18] 西暦1948年から西暦2016年の間の日付については、 正しい結果を返すことが知られています。それ以外の期間については、 誤った結果を返す場合があります。

[33] 既に正しい結果を返せる期間を過ぎている以上、メンテナンスされていない本ソフトウェアを使うべきではありません。 移植版も正しく動作しない可能性が高く要注意です。

[23] オリジナル版には原理の説明も入っているのですが、 移植版は十分に説明していないことがあり、利用者に誤解を与える危険性があって要注意です。

[26] 過去の日時については、実際の旧暦は時代により計算法が異なっていたところ、 本ソフトウェアは現代日本用の計算法を実装しているため、 歴史的に正しい結果を得ることができません。従って、本ソフトウェアを歴史上の出来事に関する暦の換算に用いることはできません。 旧暦 (これは不具合ではなく仕様。)

[25] 将来の日時については、そもそも原理的に不確定なものであり、 本ソフトウェアが作成された西暦1994年の時点よりも後の時代の日時を完全に予測できませんから、 正しい値を返さないとしても、必ずしも不具合というべきものではありません。 (かといってそれが有用かどうかはまた別の問題ですが。)

[30] 本ソフトウェアは旧暦2033年問題を正しく扱えません。 本ソフトウェアが作成された時点では対策が確定していなかった (問題も広く知られていなかった) のですから、無理も無いことです。 旧暦2033年問題

[29] 本ソフトウェアが西暦2224年について正しく扱えないことがドキュメントにも明記されています >>28。 これも旧暦2033年問題同様の問題であることが後に知られています。 旧暦

[31] 本ソフトウェアは21世紀中だけでも他に西暦2017年 (旧暦2017年問題)、 西暦2051年西暦2074年を正しく扱えません。 これらは西暦2000年に出版された21世紀暦で、 自転速度や誤差が原因で異なる日付になる可能性があると指摘されているもので (21世紀暦は他に西暦2096年も指摘しているが、これは qreki も正しい)qreki 以外のソフトウェアも異なる結果を返す場合があります。 旧暦 (>>24)

[32] ただし、ここでは21世紀暦が主たる表で採用しているものを正しいとしていますが、 未到来の日付qreki の結果が正しい可能性もわずかに残っています。

[359] 他ににも問題が指摘されています。

[360] 派生ソフトウェアの中にはこれらのいくつかを修正したものもありますが、 すべてを修正したものは確認されていません。 (すべてを修正したらもはや別物になってしまいそうです。)

[398] 派生版は独自の不具合を生じている可能性も否定はできません。 派生版の品質の検査を行ったと明記していないものも多いです。 注意が必要です。

[66] 不正確なソフトウェアの普及による被害は、 西暦2017年問題を参照。

  • >>8
    • [28] >>27

      2224年 3月21日から、同年 4月18 日の期間(グレゴリオ暦法による日付)の月名が間違って表示する現象が確 認されています。 具体的には、 正しい答えが3月であるのに対して、 閏2 月と表示する現象です。中気の計算に問題があると判明していますが、 今の 所、良い対策方法が見つかりませんので、そのままにしてあります。

  • >>14
  • >>317
    • [24] QReki.javaの不具合 - Qiita, 2017年03月13日に更新, https://qiita.com/yamori813/items/b4d2d3d34e25654ecbe6

      日本時間の2/26はユリウス日の2457810.125から2457811.124となります。ところがQReki.javaの計算値は2457811.125400158となり次の日になってしまっているので旧暦の2/1が2/27になってしまっています。

      日をまたぐ0.125日前後に新月になるとこのように誤差でずれてしまう事がありあります。計算で出すには1分は0.000694日なので小数点以下3-4桁くらいの精度が必要と思われます。

      そもそもQReki.javaのユリウス日の扱いはちょっとおかしい気がします。上記の数値はちょっといじって出しています。

      QReki.javaはawkスクリプトからの移植で、このawkスクリプトはいろいろな言語に移植されているようですが、他でも問題が起きている可能性があるかと思われます。

      根本的に直すのは難しいのでアプリには2017/2/26から3/27までのworkaroundを入れました。

  • [62] 2017年旧暦二月の朔: suchowan's blog, 2017年10月18日, https://suchowan.at.webry.info/201710/article_18.html
    • [63] anonymous, 2017年10月21日 09:19

      震源地は1993年に公開された旧暦計算サンプルスクリプト(qreki.awk)で間違いないでしょう。 このスクリプトはいわゆる略算式を用いているわけですが、地球の自転の遅れを無視しています。それはドキュメントに書かれているのでいいとして、一番の問題は「視黄経」ではなく「黄経」で計算していることです。


[106] 本ソフトウェアが誤った結果を生成することは、 オリジナル版制作当時に出来たことの限界もありますから、 あまりその責任を追求しすぎるのも適切ではありません。 しかしその社会的影響の大きさを考えると、 誤りがどのように発生し、見過ごされてきたかは検討されるべきで、 今後の教訓とされるべきといえます。

[100] ドキュメントによると、当ソフトウェアオリジナル版はその公開にあたって

... を検査し、西暦2224年問題 (>>28) を除き問題がないと確認した >>70 とされています。

[104] これを読むと十分な正しさが保証されているように感じられます。 ところがJavaScript 移植版の作者が西暦2017年問題西暦2033年問題を発見しています (>>93)。 には PHP 移植版のうちの1つの利用者の問題も発見しています (>>263)。 なぜオリジナル版でこれらの問題が検出されなかったのでしょうか。 (できれば当時の AWK 版の実行環境を再現して検証したいところですね。)

[105] >>101暦の百科事典 を規範としているのですが、 >>103 は 「結果が正しく表示されている」 ことしか検査していません。 適当な正解データが得られなかったために西暦2017年問題等は見落とされたのでしょうか。 西暦2224年問題を検出しながら、西暦2033年問題を検出できなかったのはなぜでしょう。

[107] オリジナル版制作のきっかけとなった >>70 TODAY というソフトウェアは、 JavaScript 移植版の作者が検証に使ったものなのですよね (正確に言えば両者はバージョンが違い、その間に大きな変更が加わっているのですが)。 オリジナル版は TODAY を検証に使わなかったのだろうかという疑問もあります。

オリジナル版

[69] オリジナルは日本語 (シフトJIS) 化された MS-DOSgawk 用の AWK スクリプトで、 高野英明により開発されました >>70

[71] 現在も付けで配布 >>8 されているものはドキュメントに 「Rev 1.1」 と書かれており、 著作権表示になっているものです。 >>70

[3] このスクリプトは先発グレゴリオ暦 (0年あり) を入力とし、 旧暦六曜を出力としています。

[5] ただしこのスクリプトは自由ソフトウェアではありませんから、注意が必要です。

[4] qreki のドキュメントには旧暦についての詳細な解説が含まれています。 >>8 からダウンロードできるファイルに含まれているほか、 >>27, >>70 にも転載されています。

[73] 「Rev 1.1」になる前の元のバージョン (1.0) はに作成されたと推測されますが、 入手不能です。当時は NIFY-ServeASAHI-NET で配布されていたと思われます。


[108] 製作に当たり当時出版されていた関係の書籍が一通り参照されたようです。 その他、 先行していたソフトウェアとして

... が参照されていました。 >>70

[112] ただしソフトウェアとしての継承(派生)関係には無いみたいです。

移植版

[6] qreki は数多くの派生版が知られています。

[72] オリジナル版の「Rev 1.1」からの直接または間接の移植と思われます。 (オリジナル版に基づかず孫以下の世代のものもあります。)

[573] qreki とその主要な派生版の展開
S61   * 暦の百科事典
1986  :
S62   :
1987  :
S63   :                                           六曜プログラム *
1988  :                                                          : 1/ >>110
S64/H1:                                                          :
1989  :                                                           
H3    :                                                 新こよみ便利帳 *
1991  :                                                                :
H4    :                                                          :     :
1992  :    :TODAY >>109                                          :     :
H5    :    :                        QRSAMP                       :     :
1993  :    :.........................>o.........................:     :
      :    :                          | >>73                     :     :
H6    :    :                          |                                :
1994  :....:.........................>* Rev 1.1                        :
      :    :                          | 10/2 >>71                      :
           :                          |                                :
           : (表)                     |                                :
H11        :   :  qreki.js            |                                :
1999       :   :.....>o<--------------+                   Web :        :
           :   :      | 11/8 >>95     |             Calendar2 :        :
           :..>o<.....| 11/8 >>95     |                       o 11/10  :
           :...:.....>|               |                       :>>84    :
           :   :11/16 |               |                       :        :
           :   : >>97 |               |                       :        :
                      |               |                       :qreki.pl:
H12                   |               +---------------------->o* 6/9   :
2000                  |...............|......................>||>>123  :
              7/15 o<-+               |                       ||       :
             >>295 |<.|...............|                        |       :
             10/12 o  |               |                        |......:
             >>294 |  |               |                        |       :
H13            1/8 o  o               |                        |
2001         >>289 |  |               |               qreki.pl |
               4/6 o  o 1.3           |                 >>15 o |
             >>288 |  | 4/18 >>86     |                      | |
                   |  o 1.31          |                      | |
                   |  | 4/21 >>86     |                      | |
                   |  o 1.4           |                      | |
                   |  | 6/3 >>86      |                      | |
             11/15 *  * 1.5           |                      | |
             >>287 |  | 10/4 >>86     |                      | |
                   |  |旧暦 for VB    |                      | |
H14                |  +--->*<---------+                      | |
2002               |  |    | 5/27     |                      | |
                   |  |    |>>11      |qreki.php               |
H15                |  |    |          |2/ *<-------------------+
2003               |  |    |          |>>9|          Qreki     |
                   |  |    |          |..>| 4/10 >>162 *<------+ 
                   |  |    |          |   |      mt-kyureki.pl | 
                   |  |    |          |   |      9/20 >>179 *<-+
                   |  |    |          |...|................>|  |
                   |  |    |          |   |                    |
                   |  |    |          |   |                  | |
H16           3/11 *  |    |          |   |統一カレンダー    | |
2004         >>286 |  |    |          |   +->o 0.09 >>354    | |
                   |  |    |          |...|.>| 12/28 <.......|.|
                   |  |....|..........|...|.>o 0.91          | |
                   |  |    |          |   |  | 12/31         | |
H17                |  |    |          |   |  o 0.92          | |
2005               |  |    |          |   |  | 1/8           | |
                   |  |    |          |   |  o 0.93          | |
                   |  |    |          |   |  | 1/16          | |
                   |  |    |          |   |  * 0.94          | |
                   |  |    |          |   |  | 1/17          | |
                   |  |    |          |   |  o 0.94          | |
                   |  |    |          |   |  | 1/18          | |
                   |  |    |   :          |  o 0.94-1        | |
                   |  |    |   :なでしこ  |  | 1/21          | |
                   |  |        :          |  * 0.94-2        | |
                   |  |   4/27 *<-----+   |  | 1/28          | |
                   |  |        * 5/1  |   |  |               | |
                   |  |        |>>511 |   |  |               | |
                   |  | >>465  |      |   |  |               | |
                   |  | o 7/          |   |  |               | |
                   |  | |    Rokuyou  |   |  |  :nencal        |
                   |  | |  |  8/13 *<-|   |     :>>476  exdate |
                   |  | |  | >>202 |  |   |>>220:     >>132 o<-+
                   |  | |  |       |  |   | *..:           |  |
                   |  | |  |   |   |  |   | |   :           || |
                   |  | |  |   |   |  |...|.|..............>|| |
H18                |  | |  |   |   |  |   | |          1.03 *| |
2006               |  | |  |   |   |  |   | |    3/17 >>408 || |
                   |  | |          |  |   | |qreki.php      || |
                   |  | |qreki.php |  |...|.|..>o<----------||-+
                   |  | |wp-koyomi |  |   | |   | 3/25 >>256|| |
                   |  +-->* 10/14  |  |   | |   o 9/9       || |
                   |  | | * 10/15  |  |   | |   | >>260     || |
                   |  | | |>>266 <.|..|   | |               || |
                   |  | | |<.......|  |   | |               || |
                   |  | |          |  |   | |               || |
H19       1/31 *<--+  | |  |   |      |   | |               || |
2007     >>238 |   |  | |         :   |   | |               || |
               |   |  | | 携帯潮汐:   |   |                 || |
H20            |   |  | |         :   |   |Web API          || |  相互変換
2008           |   |  | |  |3/14 *:<--+   +--->* 4/1        || |   1/5 *
               |   |  | |  |>>56 `+   |...|...>| >>310      || |  >>193:
               |   |  | |  |  6/3 o   |   |    |            || |       :
               |   |  | |  | >>485|   |   | |  |            || |       :
               |   |  | |  | 6/26 o   |   | |  |            || |       :
               |   |  | |  | >>485|   |   | |  |            || |       :
               |   |  | |         |   |   | |  |       |    || |       :
H21            |   |  | |旧暦六曜,+   |   | |          |    || |       :
2009           |   |  | |    4/1 o|   |   |     0.4.2  |    || |       :
               |   |  | |  | >>59||   |   | qreki_py<..|     | |       :
               |   |  | |  |     |    +---|-->o<.......|.....| |       :
               |   |  | |..|...|.|....|...|..>| 11/28  |     | |       :
               |   |  | |  |   | |....|...|..>|>>12    |    || |       :
               |   |  | |  |   | |    |   |   o 11/    |    |  |       :
               |   |  | |  |   | |    |   | | * 12/1   |    |  |       :
               |   |  | |  |   | |    |   | | | 0.4.6  |    |  |       :
H22            |   |  | |  |   | |    |   | +,|ゴミ箱  |    |  |       :
2010           |   |  | |  |   | |    |   | |*|1/10    |    |  |       :
               |   |  | |  |   | |        | |*|1/11    |    |  |       :
               |   |  | |  |   | |SAORI   |  ||>>442        |  |       :
H23            |   |  | |  |   | +->* 2/21|   |        1.04 *  |       :
2011           |   |  | |  |   | |  |>>552|   |   9/1 >>407 |  |       :
               |   |  | |  |   | |  |     |   |             |  |       :
H24            |   |  | |  |   | |    |   |   |        1.05 *  |       :
2012           |   |  | |  |   | |    |   |   |  1/31 >>406 |  |       :
               |   |  | |  |   | |    |   |   |             |  |        
H25            |   |  | |  |   | |    |   |   |        |    |  | Date::Qreki
2013           |   |  | |  |          |                |       +->* 0.01
               |   |  | |  |          |    DQRSAMP.AWK |       |  | 3/9 >>208
               |   |  | |  |          +->* 9/15 >>629  |       |  |  
               |   |  | |  |     Gem  |... ............|.......|.>|    :
               |   |  | |  | 11/14 *<-+   +->* 11/29   |       |  |    :
               |   |  | |  |  >>150|  |   |  | >>16    |       |  |    :
               |   |  | |  |  12/5 *  |   |            |       |  |    :
               |   |  | |  |  >>150|  |   |   |        |       |  |
H26            |   |  | |  |       |  |       |        |       |  * 0.02
2014           |   |  | |  |   | | |  |       |        |       |  | 2/7 >>208
               |   |  | |  |   | | |  |       |        |       |  * 0.03
               |   |  | |  |   | | |  |       |        |       |  | 2/11 >>208
               |   |  | |  |   | | |  |       |        |       |  * 0.04
               |   |  | |  |   | | |  |       |        |       |  | 2/11 >>208
               |   |  | |  |   | | |  |       |        |       |  * 0.05
                           |       |  |       |旧暦六曜|       |  | 2/12 >>208
             カレンダー    |  6/13 *  |       |        |       |  | 
             9/2 *<--------+  >>150|  |       |   11/6 o       |  |    :
                 |>>327    |       |  |暦API  |   >>149|       |  |    :
H27            | |                 |  | o     |        |       |  |    :
2015           |   |  | |      | | |  | |>>170|                |  |    
               |   |  | |      | |    |       |                |  | go-qreki
H28            |   |  | |      | |    |       | mk-   >>128 o<-+  |   3/ *
2016           |   |  | |      | |    |       |calendar 2/5 |  |  | >>493:
               |   |  | |      | |    +------ | --->*       |  |      :
               |   |  | |      | |    |       |     |>>580     |  |      :
               |   |  | |      | |    |       |     | 6/       |  |      :
               |   |  | |      | |    |       |     * 7/       |  |      :
               |   |  | |      | |    |       |     * 9/       |  |      :
               |   |  | |      | |    |       |     |          |  |      :
               |   |  | |      | |    |       |     |          |  |      :
H29            |   |  | |      | |    |       |     |             * 0.06
2017           |   |  | |      | |    |       |     |             | 1/31 >>208
               |   |  | |      | |    |       |     |             * 0.07
               |   |  | |        |    |       |     |             | 1/31 >>208
               |   |  | |      B | A  | C版   |     |             |      
               |   |  | |    3/8 **<--|-------|---- | ------------|----+ :
               |   |  | |   >>187|:   +>*8/25 |>>48 |             |    : :
               |   |  | |             | |>>57 *10/  |             |    : :
               |   |  | |      |      | |     *11/12|             |    : :
               |   |  | |      |      |       *12/  |             |    : :
               |   |  | |             |       |     |             |    : :
               |   |  | |JapaneseDate |Scheme |     |             |    : :
H30            |   |  | * 5/19        | o3/31 |     |                    :
2018           |   |  | |>>22  |      | |>>39 |     |                    :
               |   |  | |      |      | |     |     *11/4                :
               |   |  | |      |      | |     |     |                    :
               |   |  | |      |      | |     |     |                    :
H31/R1         |   |  | * 7/9  |      |       |     |                    :
2019           |   |  | * 10/5 |      |       |     |                    :
               |   |  | |      |      |       |     |                    :
R2             |   |  | * 3/   |      |       |     |                    :
2020           |   |  | * 12/19|      |       |     |                    :
               |   |  | |>>21  |      |       |     |                    :
R3             |   |  | |             |       |     * 5/25               :
2021           |   +- | | ->*3/       |       |     |                    :
               |   |  | |   |>>602    |       |                          :
               |      | |   |         |       |                          :
               |      | |      |      |       |                          :
               | >>432| |      |>>518 |       | Qreki                    :
               |*<----+        * 7/10 +-------|-->* 8/23                 :
               ||<....|........|......|       |   * 8/22                 :
               |<.....|........|......|       |   |>>487                 :
               |>>234 |        |      |       |..>|                      :
               ||     |        |      |       |   |          Qreki_nako  :
R4             ||     |        |......|.......|...|..............>* 1/17 :
2022           ||     |        * 2/8  |       |   |               :>>527 :
               ||  |  |        |>>517 |       |   |    qreki.go          :
               ||  +--+--------|------|-------+---|------>*.............:
               ||  |  |        |      |       |   |       | 4/ 5/        :
                                                          | >>490

[574] 凡例:

  • * 現存するもの
  • o 現存が確認できないもの
  • | qreki 系統
  • :qreki 系統
  • +---> 派生
  • ....> 参照
  • 終期は不明なことが多いので図示していない (縦線の末端は有意でない)

JavaScript 移植版

[88] 多くの派生版がオリジナル版と共に参照しているのが、 長野隆Webブラウザー / WSH 向け JavaScript に移植した qreki.js

[95] 自身のWebサイト六曜表示に従来は一覧表を用いていたところ、 に翌年のデータがないことに気づき、 qreki を移植して利用することにしました。 >>87

[96] qreki は当時の主要なポータルサイトの1つ Infoseek で発見したのだといいます。 他の実装は一覧表形式で、 qreki は計算方式だったのが採用理由と説明されています。 >>87 一覧表の継続的なメンテナンスを嫌っての判断だったのでしょう。

[97] ところがに当時人気だったカレンダーソフトウェアの1つ TODAY との比較で qreki旧暦計算の誤りに気づきました。 そのため六曜表示は qreki ではなく、 従来通りの一覧表形式に戻すことにしました。 >>93 qreki西暦2017年問題西暦2033年問題もこの時既に発覚していました。

[98] にも関わらず、 qreki.js はその後も (旧暦日付計算に関係しない) 改良が加えられて配布され続けていました。 旧暦日付の誤りについては、 リンクをたどれば到達できるものの、 配布ページでは何の注意もされていませんでした。 >>86

[99] 他のソフトウェアとの比較で誤算に気づいたところまでは良かったのですが。 問題の当事者である (同じページに JavaScript の仕様の非互換による誤動作が発生した旨が書かれている) にも関わらずこの対処は迂闊でしたね。 十数年も先ならいいだろうと思ったのでしょうか。 (同じような過ちはこの時代の他の大手企業等もやらかしているので、あまりこの判断を責めるのも酷かもしれませんが。 西暦2000年問題 )
  • [87] 巻頭言 99, , https://web.archive.org/web/20040201030732/http://park1.wakwak.com/~y-nagano/199901.html#19991108

    1999年11月8日(月)

    このページ上部に「大安」「仏滅」などの六曜表示がついていますが、これはあらかじめ調べた六曜表をもとにテーブル参照をするJavaScriptを作成して表示しています。この表が今年の年末までしか用意されていないので、来年以降、六曜表示ができません。

    そこで、Infoseekリンクを使って旧暦を計算するアルゴリズムを検索したところ、そのほとんどがテーブル参照方式であった中に、「旧暦計算サンプルスクリプト/H.Takano(C)1993,1994リンク先: >>8」という、きちんと計算して求める方式のものを見つけました。MS-DOS上のjgawkで書かれたスクリプトで、詳しいドキュメントが付いています。

    そのAWKで書かれたプログラムを、Webブラウザで動作するようにECMAScript(ECMA-262リンク)で書き直したのが、「qreki.jsリンク」です。ECMA-262準拠のJavaScriptを搭載する、Netscape Navigator 3.01以降Microsoft Internet Explorer 4.0以降(MSIE 3.0xの方はScript Engines 5.0Microsoftのサポートページリンクからダウンロードしてインストールすることで動作します)で動作します。ECMA-262に準拠していないJavaScript対応ブラウザをご使用の場合はエラーが出ます。面倒なのでバージョンチェックは省略しています。我慢してください。赤字こちらでは、MSIE5.0-Win98 と Netscape Navigator 4.61-linux-glibc で動作を確認済みです。

  • [93] 巻頭言 99, , https://web.archive.org/web/20040201030732/http://park1.wakwak.com/~y-nagano/199901.html#19991116

    1999年11月16日(火)

    先週この欄にて公開リンク先: >>87した「旧暦計算スクリプト」ですが、テーブル参照型の暦計算プログラムの金字塔である「Today ソースコードリンク」(森佳史さんリンク作)の中の旧暦西暦換算表 "kyutbl.c" と照合してみました。西暦 1870年2月1日 ~ 2100年3月11日 の間で旧暦の毎月1日の日付を照合したところ、以下の点で私のスクリプトは「Today」と違った結果を出していました。

      旧暦      西暦(誤)     西暦(正)    誤差を含む期間(西暦)
    -----------------------------------------------------------
    1884/4/1   1884/4/25    1884/4/26   1884/4/25  - 1884/5/24
    1908/9/1   1908/9/26    1908/9/25   1908/9/25  - 1908/10/24
    2017/2/1   2017/2/27    2017/2/26   2017/2/26  - 2017/3/27
    2033/11/1  (月名を閏11と間違える)  2033/12/22 - 2034/1/19

    このページの上部に表示している六曜は換算表をもとに出力していることは先週書きましたが(このページのHTMLソースを見れば一目瞭然)、ECMAScript版の「旧暦計算スクリプト」は動作環境に制限があるので、それを使って来年の分の換算表を作成して今まで通りに六曜を表示させることにしました。

  • [94] 巻頭言 2000~, , https://web.archive.org/web/20040218162913/http://park1.wakwak.com/~y-nagano/200001.html#20010418

    2001年4月21日(土)

    JavaScript旧暦計算ライブラリリンク Version 1.3 にはバグがありました。月齢を計算する部分で早トチリして誤った計算をしていました。修正版の Version 1.31 を配布していますので、そちらをご使用ください。

    2001年4月18日(水)

    JavaScript旧暦計算ライブラリリンクに、月齢を計算するメソッド(というかプロパティ)を追加しました。月と太陽の黄経の経度差が1朔望月(≒29.53089日)で1回転するという前提で:

    月齢[day] ≒ norm( 月黄経[degree] - 太陽黄経[degree] ) ÷ 360 × 29.53089

    という式で計算しています。norm() は、角度を0-360の間に正規化する関数です。詳しくは、ライブラリのソースコードリンクをご覧下さい。このソースコードの拡張子を「.js」に変更して保存すると、HTMLやWSHなどから呼び出すことができます。

  • [10] 旧暦計算JavaScript ( 版) http://park1.wakwak.com/~y-nagano/Programs/koyomi/

[295] には既に他の人が利用して公開していたことを確認できます (ソースコードコメントによれば更に遡って)。 >>294 そのまま使うだけではなく機能追加版も作られ、 他の言語にも移植されました。


[542] 別系統のものもあります。

Perl 移植版

[123] までに N.Ueno が公開した Perl 移植版も広く利用・参照されました。 当時はCGIの最盛期で、CGIスクリプトの記述言語として最も人気があったのが Perl でした。

[126] qrekiJavaScript 版を参照しつつ、 元の AWK 版から移植されました。 >>81

[125] N.Ueno は自作のカレンダー Webアプリケーション (Perl で書かれたCGIスクリプト) Web Calendar2六曜表示機能を、 従来の表方式のものから計算方式に置き換えるため、 qreki を移植したのだそうです。 >>81

[124] Perl スクリプト単体でも Web Calendar2 としてもよく使われていたようで、 Web Calendar2 が設置され稼働中のサイトが現在も数件見つけられます。

[127] 製作者はからの範囲の計算結果を 新こよみ便利帳 と比較し、 西暦2017年問題を検出したことを書いています >>81。 それでも当座の目的には支障ないと判断したのでしょうか。

[136] JavaScript 版の移植者が他の年の問題も検出していたこと (>>93) を知っていたのかどうか、この記述だけでははっきりしません (時系列的には知り得たはずですが)。
[137] 元スクリプトの信憑性に疑問を持ったのか、 移植による動作の変化を懸念したのか、 なんにせよ書籍で出版された旧暦と比較し確認したのは素晴らしい点。

[128] 移植の動機は従来の表形式の実装では期間外を表示できないことにあった >>81 ようです。 であるとすれば、わずか17年で目的を達し得なくなるのですが、 値が計算不能となるよりは、間違っていても値が得られる方がましと判断したのでしょうか。

[135] ともかく、 Webサイトにあってソースコードにない西暦2017年問題への言及は無視されて配布されたり、 派生版が作られたりすることになりました。

  • [81] 旧暦計算ライブラリ(Perlによる旧暦計算プログラム), N.Ueno, , https://web.archive.org/web/20001019055809/http://www3.biwako.ne.jp/~nobuaki/qreki/index.html

    当初Web calendar2のVer0.12bまでは六曜表示に変換テーブルを使用して算出を行っていましたが、テーブルデータのある期間しか利用できないといった欠点がありました。これでは、将来に渡って使用することが困難なため、実際に太陽と月の黄経を計算する方法を模索していました。参考図書を頼りにプログラムを書いてみたのですが、どうも精度上の問題で、朔が午前0時近辺にくると、朔の日付が一日ずれてしまい、その結果、旧暦計算や六曜計算において、実際とは異なる値になり、頭を抱えておりました。

    そんな時に林さんという方からメールをいただき、Java Scriptによる旧暦計算プログラムがあることを知りました。またそれは元々はAWKスクリプトの移植ということも分かりました。AWKのソースからPerlに移植し、Web Calendar2 Ver0.20から、このライブラリを使用して旧暦や六曜を計算しています。

    本スクリプトの計算精度については、暦計算研究会編の「新こよみ便利帳」に記載の新旧対照表で、2000年から2020年までを確認したところ、2017年2月26日~同3月27日までが、旧暦・六曜表示に誤差のあることが確認されています。

[206] 各種 Perl アプリケーションに組み込まれて普及しました。 また他の言語の移植元にもなりました。

[129] Perl の実装としてよく参照されるものがもう1系統あります。 現存しないため、 両者の関係は不明です。

PHP 移植版

[212] PHP 移植版は複数系統が確認されています。


[256] upk による qreki.php は、 付の PHP 移植版です。 >>255

[257] AWK 版を参照しつつ、 Perl 版 (>>151) から移植したものでした。 >>255

[258] 「2004-01-23 (金) 16:30:11」 付のコメントがあり >>254には既に公開されていたようです。

[259] ephem

  • function LONGITUDE_SUN()ですが、新こよみ便利帳ver.1.2 p.150にある光行差補正(視黄経)が抜けているようです。 $th += .0048 * cos( $k * NORMALIZATION_ANGLE( 1934 * $t + 145 ) ); $th -= .0057;を追加されると1908年9/25~および2017年2/26~の計算誤差による朔日のズレが解消できます。 -- ephem 2010-09-03 (金) 15:25:30
  • 1884は、時差を京都に合わせるため東経135.6333...で計算すると良さそうです。 -- ephem 2010-09-03 (金) 15:31:44
  • 以降、JPL DE405で算出した物と比較すると2051/11/3(旧暦10/1)と2177/7/25(旧暦7/1)に朔日の計算がずれますが、2200年までの検証では、ほぼ問題なさそうでした。便利なスクリプトの公開ありがとうございます。 -- ephem 2010-09-03 (金) 15:37:07

と誤りを指摘しました。 >>254

[260] これを承けて頃に修正する旨と差分が upk から投稿されました。 >>254 しかしながら Internet Archive 所蔵のこのページは時点で最終更新がのままで、 qreki.php の公開日時ものまま変更されていないので、 修正版は更新されなかった可能性もあります。

[261] 残念ながら Internet Archive には qreki.php 本体はどのバージョンも所蔵されていません。

[262] 指摘があったうち、 , , JavaScript 版の時点で既に検出された問題の再発見です (>>104)。 JavaScript 版はこの qreki.php の移植元の Perl 版の移植元に当たりますが、 qreki.php の配布ページ >>254 からはリンクされておらず、 作者およびコメント者が知っていたのかは不明です。

[263] qreki 界隈ではこれが初の報告と思われます。

[264] コメント者がまで検証していながら、 旧暦2033年問題に言及していないのは不思議です。 朔日のチェックだけで月名は見ていなかったのかもしれません。

[265] 不完全とはいえ時点でこうして不具合修正が行われ、 旧暦2017年問題を回避できるバージョンが出現していたのですが、 これが普及しなかったのは不運でした。

Ruby 移植版

[213] Ruby 移植版は複数系統が確認されています。

[593] また別系統の移植版。 ただの移植ではなく天体暦が置き換えらえている。 同じ人が近い時期に qreki ベース以外の2手法でも似たようなものを作っていて、 結果を比較していたらしい。

[594] しかし gem として公開されていて、それなりにダウンロードされて使われている模様。 qreki 版も (他手法に比べて精度はよくないと評価したにも関わらず) 本段落執筆時点でまで定期的にメンテナンスされている。

Java 移植版

その他のバージョン

[304] その他、 サーバー側で実行されソースコードが公開されていないものの、 qreki 由来と明記されている、または挙動が qreki と同じものもたくさんあります。

似た名前の別のソフトウェア

[333] 旧暦の「きゅう」に「Q」を宛てたネーミングセンスも qreki の普及の一因かもしれません。

[334] 誰でも思いつきそうなもじり方ですが、同名の別のソフトウェアは案外ありません。 (qreki が有名すぎて同じ名前にしづらかったのかもしれません。) (qreki のコードは継承せず名前だけ継承したものはいくつかあります。)

>>192, >>242, >>167, >>493, >>527


[336] から 「25年以上前」 >>342 ないし 「20年以上前」 >>335, >>344Q暦という PASCAL で書かれた MS-DOS 用ソフトウェア Q暦 がありました。 当時「めずらしソフトで話題にもな」ったといいます。 >>335, >>344

[337] 逆算すると昭和時代末期にあたります。 AWK 版の QREKI 初版がですから、それより5年以上前となります。

[338] 作者は Q と名乗っています。 >>335, >>342 ソフト名と作者名はどちらが先立ったのでしょうかね。掛かっていたのかもしれません。 同じ作者の他のソフトウェアも名前に「Q」が入っています。

[343] QC# で開発した WindowsWindows CE 向けのカレンダーソフトウェア NiQ六曜表示の要望があり >>342旧暦六曜二十四節気の表示に対応しました >>339

[345] 旧暦表示のみが Q暦(復刻版) (QReki.exe) として公開されました。 >>344

[346] NiQ旧暦への変換には .NET Framework を使っているようです >>342Q暦 (復刻版) も同様と思われます。 従って AWKQREKI の系譜のソフトウェアとは異なる結果が得られるはずです。

[349] 残念ながら、 古い Q暦 は配布されていません。当時のパソコン通信で配布されていたのでしょうか。 Q暦 (復刻版)Internet Archive に所蔵されていません。 NiQ旧暦に対応した後の版は Internet Archive に所蔵されていません。


[350] 『Q暦カレンダー01401』直島・豊島・小豊島(香川県)の旅行記・ブログ by 52市村康さん【フォートラベル, 52市村康, 2014/01/01 - 2014/01/17, https://4travel.jp/travelogue/10851024

[351] >>350からグレゴリオ暦カレンダーに旧暦日付を併記したもの (画像)。

メモ

[74] 誤っているとはいってもこれだけ広まってしまったとなると、 現代日本文化の1つの側面として無視できない存在といえるのではないでしょうか。

[75] 日本ソフトウェア開発史の視点でも qreki は興味深い事例ではないでしょうか。 パソコン通信の文化で生み出されたソフトウェアで、 この令和の時代まで未だに現役で使われ続けているものは、 他にほとんどありません。 有名所では LHAqreki を遥かに凌ぐレベルで普及していましたが、 平成のうちに ZIP に駆逐されてしまいました。 なぜ qreki は未だに生き残っているのでしょう?

[76] MS-DOS 向けの旧暦計算ソフトウェアは他にもいくつかありました。 ソースコードが公開されていたものも、いくつかあったようです。 なぜ qreki だけがこれだけ多くの環境に移植され幅広く使われるようになったのでしょう?

[79] 平成後期の時点では、Google検索旧暦の計算や変換のプログラム・ライブラリーを探そうとすると、 上位に qreki のドキュメントや移植版が表示される状態になっていました。 プログラミング言語の標準ライブラリーで旧暦を求められないことを知った技術者が、 既存のライブラリーがないかと検索し、 上位に出てくるそれっぽいコードをそのまま信用してしまった、 といったところでしょうか。

[394] 比較的緩いライセンスでソースコードが公開されて、 中央管理されずにあちこちで分散して利用された。 という模範的ともいうべき民主的なソフトウェア開発が完全に裏目に出ている。

[395] みんな敬意を払うつもりなのか直接の移植元でもないはずの上流の配布サイトにリンクしているのに、 そこに書いてある注意事項とか全然読んでいない。動くコードがあればそれでいいって?

[396] オリジナルのドキュメントに 「オリジナルのスクリプトと本説明書を必ず同 梱して下さい。」 って書いてあるのにそれを真面目に履行してるやつはあんまりない。 ちゃんと同梱して利用者がみんな読んでいればもう少し状況はマシだったのかもしれないが。

[397] 他のライセンスで配布してる派生ソフトウェアまであるけど、原作者に許諾を得ているか甚だ怪しい。

[610] 既に移植版があるのを知ってか知らずか、 オリジナルから再移植する人も多い。 みんな律儀にオリジナルを紹介しているので、 どうせならオリジナルから移植するのが一番正しく動作するだろうと思ってなのかな。 (再移植したくなった動機を教えて欲しいが書かれていない。) オリジナルがちゃんとメンテされてればそれで良かったのだけど、 そうでないのが仇となって既存移植版が修正したり注記したりしてるのを再移植版が無視している。

[611] というか古い移植版ほど結果の正しさに注意を払って、対処できなかったとしてもそれをちゃんと書いているのに、 新しいものはそれを怠っているのが多い。作りました!と書くだけで正しいか検査しました!と書いてない。(書いてないのはしてないからだろう。) 「結果は保証しません」とは書くくせに。保証しなくていいから努力はしてくれよ。

[612] 時間をかけて沢山の人の目と手が加わることが、 蓄積ではなくリセットになってしまっている。辛い現実。

[440] 本当は利用者の総数も知りたいけど推計するのも難しい。 しかし派生版を開発する人や紹介する人の数を見ただけでも、 このソフトウェアが惹きつけたエネルギーの大きさははかり知れるというもの。

[316] そういえば qrekiC# 移植版はみつかりません。 標準ライブラリー (.NET Framework) が旧暦に対応しているからなのでしょうね。

[540] Objective-CSwift の移植版がないのも示唆的。 AppleFoundation農暦に対応していて、 旧暦には対応していないにも関わらず、 Swift旧暦を表示するには Chinese と指定する、 という情報が出回っている。 (これはこれで別の問題が... 農暦 )


[614] 太田本郷城 (おおたほんごうじょう) 跡出土の墨書 (ぼくしょ) かわらけ, 古川, , https://www.city.toyama.toyama.jp/etc/maibun/toyamajyo/sengokukisiro/oota-bokusyo.htm

16世紀後半頃使われていた暦は、太陰暦 (たいいんれき) に基づく「長慶宣命暦」です。この暦は、貞観3(861)年から貞享元(1684)年まで使用されました。太陰暦では大の月と小の月があり、閏月 (うるうづき) が入ることもあります。大の月は晦日 (みそか) が30日であるのに対し、小の月の晦日は29日という違いがあり、年によって異なります。

高野英明氏による旧暦計算を用いると、太田本郷城が記録に表れる元亀 (げんき) 3年から天正6年までのうち、8月が大の月なのは、元亀3、天正元、天正2、天正3年の4年であり、上杉方が拠っていた時期にあたります。

[615] このウェブページの解説文は、 「高野英明氏による旧暦計算」 を使っていますが、それがいつどのように発表されたものかは明らかにされていません。

[616] ウェブ検索による限り、 「高野英明」 による旧暦の業績は qreki しか知られていません。

[617] もしこの解説文が qreki に依拠しているとすると大問題です。 qreki は現行旧暦の実装であり、過去の暦法の実装ではありません (>>26)。 この解説文の著者は最初の段落で暦法の違いを認識しているにも関わらず、 暦法が明らかに異なる計算結果を使って立論していることになるのです。

[625] >>624 この調査報告書に同内容の記載がありました。 >>624 #page=22 こちらには出典がはっきり書いてあって、 まさかの qreki でした。 >>624 #page=23