プログラミング
惑星位置ウィジェット
A Planet Position Widget (leancrew.com)
要約
著者は、macOSのウィジェットを作成するためにPythonスクリプトを開発しました。このスクリプトは、Astropyライブラリを使用して太陽、月、および古代の定義における惑星の位置(方位角と高度)を計算し、TerminalWidgetアプリケーションに表示します。これにより、空に見える天体の位置をリアルタイムで把握できるようになります。
全文翻訳
そして、今、それはすべてこの私が言ったことすべてであり、それは間違っていたか、あるいは誤解されたかのどちらかでした。
前の投稿 惑星位置ウィジェット
2026年8月12日 午後12時16分 Dr. Drang 著
MacウィジェットをTerminalWidgetで作成する方法と、Astropyで天体の位置を特定する方法を学んだ後、自然な流れでそれらを組み合わせて惑星を追跡するウィジェットを作成しました。私は惑星の古代の定義を使用しており、これには太陽と月が含まれますが、土星より先のものは含まれません。数値は方位角と高度で、その順序で、最も近い度に丸められています。そのアイデアは、何が見える可能性があり、どこにあるかを私に伝えることです。
この特定のスクリーンショットは、昨夜10時過ぎに撮影されたものです。すべてが地平線の下にあったため、外に出る理由は何もありませんでした。太陽を含めるかどうかで迷いました。空で太陽を見つけるのに助けが必要な人はほとんどおらず、太陽が出ているときは月以外何も見えません。しかし、一部の天体の視認性は太陽からの分離に依存するため、完全性のために、そして部分的には、とにかく含めることにしました。
ウィジェットのテキストを生成するコードから始めましょう。それはplanetsというPythonスクリプトです。
python:
1: import astropy.units as u
2: from astropy.time import Time
3: from astropy.coordinates import get_body, AltAz, EarthLocation
4: from subprocess import run
5:
6: def direction(az):
7: 'Return a string indication of the azimuth (given in degrees).'
8:
9: dirs = 'N NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW'.split()
10: i = int(((az + 11.25) % 360) / 22.5)
11: return dirs[i]
12:
13: # Current time in UTC.
14: ut = Time.now()
15:
16: # Observation location.
17: home = EarthLocation(lat=41.81433*u.deg, lon=-88.07093*u.deg, height=208*u.m)
18:
19: # Bodies of interest.
20: planets = 'Moon Sun Mercury Venus Mars Jupiter Saturn'.split()
21:
22: # Current positions of all the bodies.
23: pos = {}
24: const = {}
25: for p in planets:
26: pos[p] = get_body(p, ut).transform_to(AltAz(obstime=ut, location=home))
27: const[p] = pos[p].get_constellation()
28:
29: # Assemble the results.
30: output = []
31: for p in planets:
32: output.append(f'{p:>8s}: {pos[p].az.value:3.0f} \
33: {direction(pos[p].az.value):3s} {pos[p].alt.value:3.0f} {const[p]}')
34:
35: # Pipe the results through TerminalWidget.
36: tw = '/Applications/TerminalWidget.app/Contents/MacOS/TerminalWidget \
37: --target planets --font Menlo --bg eeeeee --fg 000000 --text -'.split()
38: run(tw, input='
'.join(output).encode())
39:
40: # print('
'.join(output))
shebang行はありません。これはlaunchdによって呼び出される方法のためであり、後で説明します。
planetsが必要なモジュールをインポートした後、行6〜11はdirection関数を定義します。これは方位角を受け取り、対応する羅針盤の方向を示す文字列を返します。Astropyは方位角を223度と報告しますが、それは私にはすぐに「南西」とは言えないため、これがあります。この関数は、この画像のように16点の羅針盤を想定しています。画像はWikipediaより。
各点は22.5度で区切られており、行10で22.5で割っているのはそのためです。行10の他の部分は、北が348.75度(-11.25度)から始まり、360度で方位角がリセットされ、リストのインデックスは整数でなければならないという事実に調整するためです。
Astropyにはdirectionが行うことと同じ機能がすでに存在するかもしれませんが、ドキュメントを検索するよりも自分で関数を作成する方が簡単(そして楽しい)だと思いました。
行14と17は観測の時間と場所を定義します。planetsは30分ごとに実行されてウィジェットを更新するため、表示されているものは30分以上古くなることはありません。上記のhomeの場所は実際にはモートン樹木園です。私のスクリプトのバージョンは私の家の緯度と経度を使用しています。
行20はplanetsリストを定義し、行23〜27は、各惑星のAltAz位置と星座を含むposとconstの2つの辞書を作成します。get_body関数(行26)は位置を取得し、get_constellation関数(行27)はその位置を使用して、その天体がどの星座にあるかを判断します。
行30〜33は出力行のリストを作成し、行36〜38はsubprocessモジュールのrun関数を使用して、出力行をTerminalWidgetに送信します。twリストには、TerminalWidget実行可能ファイルへのフルパスと、それに渡されるすべてのオプションが含まれています。runのinputパラメータは、以前に定義された出力で、改行で区切られた単一の文字列に変換され、バイトとしてエンコードされたものです。
行40は、将来の開発のために残しておいたデバッグ行です。planetsを書きながら、行36〜38をコメントアウトし、行40をコメント解除して、結果をTerminalですぐに確認できるようにしていました。
planetsは、このlaunch agent、com.leancrew.planets.plistを介して、30分ごと、つまり毎時0分と30分にlaunchdによって実行されます。
xml:
1: <?xml version=