【マイレース開発記録(5)】
ユリウス日との格闘                       

前回、天体計算に使う時刻を、日本時間(JST)からUTC(協定世界時)へ変換する必要があることを学びました。「これで正しく計算できるはず」と思っていたのですが、実際に動かしてみると、まだ計算結果に微妙なずれがありました。

プログラムそのものは動いていますし、エラーも出ません。それでも結果がおかしいのです。

そこで調べ直してみると、私は天体計算で使われる「ユリウス日」そのものを十分に理解していなかったことに気づきました。

ユリウス日(Julian Day)は、天文学などで使われている時間の表し方です。普段使っている「○年○月○日」というカレンダーとは違い、ある基準から何日経過したかを連続した数値で表します。

しかも、普段の生活では一日は午前0時に切り替わりますが、ユリウス日では正午を基準に整数部分が切り替わるという特徴があります。最初の私は、この違いをきちんと理解していませんでした。

ここで改めて、

自分にとって当たり前の「時間」と、コンピューターが扱う「時間」は同じとは限らない

ということを学びました。

もう一つ問題になったのが、時刻の渡し方でした。Swiss Ephemerisでは、天体計算に使う時刻を小数で指定します。たとえば、

  • 13時30分 → 13.5
  • 13時15分 → 13.25

という形です。ところが最初の私は「13時30分」の「13」だけを使うなど、分や秒を十分に計算へ反映できていませんでした。プログラムは動いていても、入力する時刻が少しずれていれば、計算結果にもずれが生まれます。

そこで、

時・分・秒をすべて計算に含める

ように修正しました。

今回、特に印象に残ったのはここでした。プログラムが止まってエラーを表示してくれれば、「何かがおかしい」とすぐ分かります。ところが今回のように、

動いているけれど、結果が少し違う

という問題は、かえって見つけにくいものでした。そこで、結果だけを見るのではなく、

  • 入力した時刻は正しいか
  • 日本時間からUTCへ変換できているか
  • 時・分・秒が反映されているか
  • ライブラリが想定する形式で値を渡しているか

と、処理を一つずつ確認しました。

この経験から、

「動いたか」だけではなく、「正しく動いたか」を確認する

ことの大切さを学びました。

今回もAIを使いました。ただし、「正しいコードを書いて」と任せるだけではありません。分からないところを、

  • 「この時間は何を基準にしている?」
  • 「この数字の単位は?」
  • 「どの段階でUTCに変換する?」
  • 「分や秒はどこで計算する?」

というように、小さな質問に分けて確認していきました。すると、「全部分からない」と感じていた問題が、少しずつ整理されていきました。

大きな問題を、小さな確認作業へ変える。

これは、プログラミング以外の仕事でも活かせる方法だと思っています。

私は細かい部分に集中しやすい一方で、その作業の前提になっている大きな条件を見落としてしまうことがあります。今回も、「計算式は合っているか」という細かな部分を気にするあまり、「そもそも、この時間は何を基準にしているのか」という前提の確認が後回しになってしまいました。

そこで今は、作業に入る前に「基準は?」「単位は?」「前提は?」と確認するよう意識しています。苦手なことを単に「できないこと」として考えるのではなく、自分が間違えやすい場所を知り、確認する方法を作っておくことも大切だと感じています。

ユリウス日そのものは、日常の仕事ではあまり使わないかもしれません。でも、今回身につけた考え方は、いろいろな仕事に応用できます。

  • 作業前に前提条件を確認する
  • 数字の単位や基準を確認する
  • 結果に違和感があれば工程を分けて調べる
  • 「動いた」だけで終わらず結果を確認する
  • 分からないことを小さな質問に分解する

以前なら、細かな誤差が続くと混乱して、どこから確認すればいいのか分からなくなることがありました。今回はAIとの対話も利用しながら、

理解できる大きさまで問題を分けて、一つずつ確認する

という方法で最後まで取り組むことができました。技術そのものを覚えたこと以上に、自分に合った問題解決の方法を一つ見つけられたことが、今回の大きな成果だったと思います。

【マイレース開発記録(5)】図解
【マイレース開発記録(5)】図解

時間の扱いを整理できたことで、次は天体の「周期」をアプリの動きへ変換する段階に進みます。ところが今度は、

  • 周期をどう定義するのか
  • 数値をどうそろえるのか
  • 「フェーズ」をどう表現するのか

という新しい問題が出てきました。

次回は、

【マイレース開発記録(6)】phase設計の試行錯誤

について書いていきます。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です