見出し画像

国際宇宙ステーションが通ると鳥が鳴くプログラム

実行画面 033 (プログラム番号08)

国際宇宙ステーションの現在位置を眺めるためのプログラムです。
自分の場所の真北か真南を通るときに鳥が鳴きます。

教育用プログラミング言語「ドリトル」で書きました。

// 国際宇宙ステーションが通ると鳥が鳴くプログラム

// プログラミング言語「ドリトル」

// V3.31以降のインストール版ドリトルで実行してください。

// 2020.06.07  蕪木 孝


// 国際宇宙ステーションに関するデータを以下のサイトから提供して頂く
// Open APIs From Space  http://open-notify.org/

位置データのURL  = "http://api.open-notify.org/iss-now.json"。
乗組員データのURL = "http://api.open-notify.org/astros.json"// ----- 各種設定 -----

場所 = 配列 !
	// 地名  緯度  経度
	"トコロザワ"  35.7862  139.4739	// 自分の場所
	"ロンドン"   51.5006   -0.1246	// 以降は他に表示したい場所
	"ホーンミサキ" -55.9833  -67.2667
	"ハワイ"     21.3067 -157.8589
                                          // ←追加できる
作る。

自分の場所の経度 = 場所 ! 3 読む。	// 鳥が鳴く経度

高さ     = 450// 高さを変えると全体の大きさも変わる
幅       = 高さ * 2。
線の間隔 = 高さ / 6。
左上隅x = 幅 / 2 * (-1)。	// 図の左上隅のx座標
左上隅y = 高さ / 2// 図の右上隅のy座標

画面 ! (黒) 塗る。	// 背景色の設定

文字のサイズ = 12。
ラベル ! (文字のサイズ) 文字サイズ。
ラベル ! (緑) 文字の色。

カメ = タートル ! 作る    (緑) 線の色    0.5 線の太さ    0.5 拡大。


// ----- 経線を描く(縦に描く線) -----
カメ ! ペンなし    (左上隅x) (左上隅y) 位置    270 向き。
「
	| i |
	カメ ! ペンあり   (高さ) 歩く   図形を作る。
	カメ ! ペンなし   (左上隅x + 線の間隔 * i) (左上隅y) 位置。
」 ! 13 繰り返す。


// ----- 緯線を描く(横に描く線) -----
カメ ! ペンなし    (左上隅x) (左上隅y) 位置    0 向き。
「
	| i |
	カメ ! ペンあり    (幅) 歩く  図形を作る。
	カメ ! ペンなし    (左上隅x) (左上隅y - 線の間隔 * i) 位置。
」 ! 7 繰り返す。


// ----- 場所を描く -----
場所の数 = (場所 ! 要素数?) / 3。
カメ ! 90 向き。
「
	| i |
	地名 = 場所 ! ((i - 1) * 3 + 1) 読む。
	緯度 = 場所 ! ((i - 1) * 3 + 2) 読む。
	経度 = 場所 ! ((i - 1) * 3 + 3) 読む。
	x座標 = 幅 / 360 * 経度。
	y座標 = 高さ / 180 * 緯度。

	// 地名を書く
	ラベル ! (地名) 作る    (x座標 - 5) (y座標 + 25) 位置。

	// 場所の位置に円を描く
	カメ ! ペンなし    (x座標 - 1) (y座標) 位置。
	カメ ! ペンあり    1 円    図形を作る。
」 ! (場所の数) 繰り返す。


// ----- 鳥の鳴き声を作る -----
鳥 = メロディ ! "^ド・ド" 作る。
鳥 ! (楽器 ! 124 作る) 設定 。
鳥 ! 演奏。			// 起動時にテストで一鳴きする
鳥は鳴いた = いいえ。


// ---------- メインの処理 ----------

カメ ! 1 線の太さ    ペンなし。

緯度ラベル = ラベル ! 作る。
経度ラベル = ラベル ! 作る。
人数ラベル = ラベル ! 作る。

一つ前のx座標 = -180//システム!"proxy.eplang.jp" 8080 proxy。	// プロキシの設定例

// 乗組員の人数の表示
WebAPI1 = WebAPI ! 作る。
WebAPI1 : url = (乗組員データのURL)。
乗組員データ  = WebAPI1 ! 読む。
人数 = 乗組員データ : number。
人数ラベル ! (人数) 書く。

// デバッグ用のラベル
乗組員データラベル = ラベル ! 作る    (左上隅x) (左上隅y) 位置。
位置データラベル  = ラベル ! 作る    (左上隅x) (左上隅y - 文字のサイズ * 2) 位置。

// 乗組員データの表示(デバッグ用)
//乗組員データラベル ! (乗組員データ) 書く。

// プログラムが1日動作するタイマーを作る
タイマー1 = タイマー ! 作る    3秒 間隔    (1200 * 24) 回数。

タイマー1 ! 「
	| i |
	
	WebAPI1 = WebAPI ! 作る。
	WebAPI1 : url = (位置データのURL)。
	位置データ = WebAPI1 ! 読む。

	// 位置データの表示(デバッグ用)
	//位置データラベル ! (位置データ) 書く。

	緯度 = 位置データ : iss_position : latitude。
	経度 = 位置データ : iss_position : longitude。
	x座標 = 幅 / 360 * 経度。
	y座標 = 高さ / 180 * 緯度。

	// 右端から左端へ移動するときは軌跡を描かない
	「x座標 < 一つ前のx座標」 ! なら 「
		カメ ! ペンなし。
		鳥は鳴いた = いいえ。	// 鳥が鳴いたかを判定するフラグもリセット
	」 実行。

	カメ ! (x座標) (y座標) 位置 。
	カメ ! ペンあり。
	一つ前のx座標 = x座標。

	経度ラベル ! (経度) 書く。
	経度ラベル ! (x座標 - 7 * 文字のサイズ / 4) (y座標 - 30) 位置。

	緯度ラベル ! (緯度) 書く。
	緯度ラベル ! (x座標 + 30) (y座標 + 7) 位置。

	人数ラベル ! (x座標 - 35) (y座標 + 7) 位置。

	// 自分の場所の経度を通ってかつまだ鳴いていないなら鳴く
	「ぜんぶ ! (自分の場所の経度 < 経度) (鳥は鳴いた == いいえ) 本当」 ! なら 「
		鳥 ! 演奏。
		鳥は鳴いた = はい。
	」 実行。
」 実行。

実行方法

インストール版ドリトルを以下のサイトからダウンロードしてください。
https://dolittle.eplang.jp/download
パソコンのOSがWindowsなら「Windows用」をクリックするとダウンロードがはじまります。
ダウンロードしたら解凍してください。
解凍したら dolittle.bat をダブルクリックするとドリトルが起動します。
プログラムを貼り付けて「実行!」をクリックすると画面が表示されます。
国際宇宙ステーション(カメ)の周囲に緯度、経度、乗組員数が表示されるはずです。
プログラムの中で自分の場所が「所沢」に設定されているので自分の場所の地名、緯度、経度を調べて各自変更してください。
また、地球上で他に表示したい場所を追加することもできます。

緯度、経度、乗組員数が表示されない場合

インターネット経由でデータを取得するためにWebAPIというものを今回はじめて使いました。
私の自宅のネットワーク環境では動作しましたが、動作しなかったらすみません。
データ取得に失敗している場合は「未定義」と表示されます。
データ取得の有無にかかわらず鳥は実行時に一鳴きします。(音の確認のため)
データが表示されない場合、確認ポイントが3つあります。

1.インストール版ドリトルのバージョンが古くないか?

WebAPIが使えるバージョンはv3.30以降です。
動作確認をしたドリトルはv3.31です。
今回ドリトルをダウンロードした人は最新版なので大丈夫です。

2.WebAPIを使ったサンプルプログラムは動作するか?

ドリトルのフォルダの sample フォルダに入っている api_ と付いたファイルは WebAPIを使ったサンプルプログラムです。
その内の api_station.dtl を実行してみてください。
エラーにならないで駅名が表示されるようであればWebAPIは問題なく動作するようです。
この場合私が作ったプログラムに原因がありますので各自調べて改修をお願いします。

3.プロキシ環境下で実行していないか?

学校などのようにプロキシサーバーというものがあるネットワーク環境では動作しない(はず)です。
プログラムにプロキシの設定を追加すれば動作するかもしれませんが、確認していないのでわからないです。
今後プロキシ環境下で試す機会があれば記事を更新します。
ドリトルのプロキシ(Proxy)設定方法については以下のページを参照してください。
https://dolittle.eplang.jp/ref_system

ドリトルのWebAPIオブジェクトについては以下のページを参照してください。
https://dolittle.eplang.jp/ref_webclient33


挑戦したけどうまく動かなかったそこのあなた、しょせんコンピューターの中での話なので必ず答えはあります。
気が向いたら調査をお願いします!

この記事が気に入ったらサポートをしてみませんか?