星空のコンディションを数値化する「星空スコア」。 これまで、Vercelというクラウドサービス上のコンピューターで精密な天体位置計算のために Python + Skyfield を動かしていたにゃ。
高精度な天文計算をするために、Skyfieldを使っていたにゃんけど、計算のたびに17MBもの巨大なエフェメリス(天体の位置が記録された膨大なデータ辞書)を使うので、計算時間が膨大になり、vercelの無料で使える計算時間制限にひっかかりそうだったんだにゃ。4時間/月間が上限にゃんだけど、うち3時間30分強まで使っていて、あとがなかったのにゃ。
制限に達するとプログラムが止まってしまうらしいので、キャッシュをしたり、その時間を伸ばしたりとやったところで、そのうち、ユーザーさんも増えてきて、焼け石に水だったにゃ(4月下旬〜5月中旬)。残り30分にまで迫ってきて、かなり焦っていたんだにゃ。お金をかけて解決する方法もあったにゃんけど、広告とか課金とかを導入するとユーザーさんに迷惑かけることになるし、抵抗があったんだにゃ。
悩みに悩んで、今回、ロジックをまるごと Python からPure JavaScript に移植する大手術を敢行したにゃ。下図のうち、最後の2日間に注目にゃ。導入直後から劇的な効果があったんだにゃ。もっとも、ユーザーさんの使い勝手とか見た目は変わらないけどにゃ。
文句を言わないAIさんがコードを書いているからできた芸当だにゃ。怖い人間のえんじにゃさん相手にこの手の改修をやると、「見通しが甘かった責任どう取るんすか?」「また最初からですか? 賽の河原みたいですね。あ〜楽し」とか針のむしろのような批判に耐え続けないといけないにゃ。

精度を「分角」に。
今回の改修で採用したのは
これまでの構成と比べると、その差は歴然だにゃ。
-
Skyfield + de421.bsp: 過去の観測データ(約17MB〜)を参照して「秒角(1/3600度)」単位で計算。論文執筆に使えるくらい高精度らしいにゃ。
-
astronomy-engine: 数学的な近似式(約150KB)を使って「分角(1/60度)」単位で計算。本アプリのような用途なら、これで十分なのにゃ。
望遠鏡の制御なら秒角が必要だけど、月や太陽の位置判定なら、分角の精度があれば十分。両者を並べてシミュレーションしてみたけれど、日の出、日の入り、月の出、月の入もそれぞれだいたい1分の誤差で収まっていたにゃ。この「精度の割り切り」が、今回のポイントだにゃ。
何が変わったのか
-
「何度リロードしても大丈夫」 これまで、ユーザーさんからも「天気情報取得APIの無駄遣いにならない?」と心配の声をいただくことがあったにゃ。これまで、にゃあひとりで全ユーザーさんの分を負担するため、キャッシュとかチューニングで乗り切っていたにゃんけど、今回から、すべてユーザーさんのブラウザで行うようにしたから、何度リロードしても平気にゃ。上限は1日10,000リクエスト、1時間5,000リクエスト、1分600リクエストなので、使い切るほうが大変にゃ。無料なので心配もいらないにゃ。これからは誰にも遠慮はいらないにゃ。
-
17MBのダイエットと高速化 巨大なデータファイルを捨てたことで、サイトの読み込みも動作も軽くなったはずにゃ。
- ユーザー数が急激に増えてきたら、また別の問題が起きるにゃんから、そのときに考えるにゃんね。

この記事へのコメント
コードは変わってもココロは同じ・・・
改造有難うございます。反応が格段に良くなりました。
計算時間のグラフ・・・劇的に小さくなりましたね。
過去の履歴が一定の周期で変化してるのが、オモシロイです。
皆さん、新月期で星空が気になりだしてソワソワしてるのが見えるようです・・・
i*matさん、コメントありがとうございます。反応の改善が体感できるようになってよかったです。アクセス数は新月期と関係ありそうなんですよ。そりゃそうか。でも見える化されると面白いですね。次は、機能追加やってみます!