前回の続き。無事に主要な四月相(新月、上弦の月、満月、下弦の月)の日時を表示できましたが月の出や月の入り、月齢を表示する機能がありません。
月の出・月の入りなんてどうでもいいと思われる方も多いでしょうが、月が出ていない夜は サテライトキャノンが撃てません 月明かりに邪魔されず星がよく見えます。天の川など綺麗な星を見るというのは私の旅行の目的の一つになっていて、特に山へ行く計画を立てるときには必ずチェックしています。月が出ていても時間帯が昼間までならば問題なく星は見られます。カレンダーや予定表を見たときに夜月が明るくない日が分かるとその日に旅行をスケジュールしたくなるわけです。まぁ、月が出ていてもそれはそれで綺麗なのですけれど。いずれにせよ事前に分かっているに越したことはないわけです。
Emacsで日の出日の入りや月の朔望の計算はあるのですから既にありそうなものですが少し探しただけでは見つかりませんでした。
というわけで、作ったのがこちら。
使い方
calendarと連携させるには、例えば次のコードをinit.el(.emacs)に追加します(Mキーはlunar.elで使っているのでLキーにしました)。
(with-eval-after-load "calendar" (require 'moonrise) (define-key calendar-mode-map "Ld" 'calendar-moonrise-moonset) (define-key calendar-mode-map "Lm" 'calendar-moonrise-moonset-month))
L d でカーソル位置の日の時刻をミニバッファに表示し
L m で月間の時刻を表示します。
また、org-modeのアジェンダに表示するには次の文をアジェンダ表示対象のファイルに追加すればOKです(新しいorgファイルを作った方がいいかも?)。
* Moonrise %%(moonrise-org-agenda)
実装にあたって
かなり昔に買ってあった日の出・日の入りの計算―天体の出没時刻の求め方(長沢 工. 1999)という本を元に作成しました。月の位置の計算方法は「海上保安庁が開発した月位置計算の略算式に対し, 時刻原点を変更するなど, 私が多少改変した式」(長沢1999. p124)だそうです。もう20年以上前の本なので精度が気になりましたが海上保安庁水路部の略算式 - 月の位置の略算(1) 黄経: セッピーナの趣味の天文計算によれば今回のような用途に使う分にはまったく問題ない精度のようです。(私も本からの入力に難儀しました。すでに自炊した本だったのでOCRがかかっていたのですが表の部分は全然ダメ。手入力した後音声読み上げさせて目と耳で確認しました)
solar.elとかなりの部分を共通化できるのではないかと思ったのですが、太陽は黄緯が0なので黄経だけ求めればよく、また、時刻の扱い方や計算方法など色々異なっていたためほとんど共通で使えるものはありませんでした。使えたのは、恒星時の計算(solar-sidereal-time)と自転遅れの補正値(solar-ephemeris-correction)、時刻の文字列化(solar-time-string)、それと現在位置を設定する仕組み(solar-setup, calendar-longitude, calendar-latitude, calendar-time-zone)あたりでした。
課題
- 計算結果のキャッシュ
- おそらく正しく動作しない地点がある(極地など)
私のマシンではそれほど遅くないのですが、計算結果をキャッシュすると待たされる時間が減るかもしれません。とはいえagendaの生成自体が元々遅いのでどこまで意味があるのか分かりませんが。
極地など地球上のどこかの地点では正しく動作しないと思われます。対処法は本にも書いてあるのですが、面倒なのであまり読んでませんすみません。
(2021-07-25追記)月の満ち欠けを画像表示させてみました。