(農業)情報工学・課題 (2023/10/26)

水稲の生育ステージ予測プログラムの作成(0)GAS Version

JavaScriptとは
JavaScript とは、1994年にNetscape Communications 社が開発した、オブジェクト指向のスクリプト言語である。他の言語と比べてクライアント側(手元のコンピュータ上)で動作するという大きな特徴がある。また、ブラウザだけがあればプログラムの開発と実行ができて、特別なソフトウェアを準備する必要が無い点は大きな利点である。 プログラム言語の特徴については、プログラミング言語についてにまとめた。
言語名おもな特徴
COS「UNIX」の開発にも用いられている代表的な構造化言語。アプリケーションソフトウェアから組み込みシステムまで、多様な分野で汎用的に利用されている。
C++C言語にオブジェクト指向の概念を取り入れた拡張版と言える。現在のプログラム開発環境では多用されている。「シープラプラ」と呼ぶ。
Javaインターネット関連技術や分散システム環境で広く利用されている、オブジェクト指向言語。C++をモデルとして作られているが、特にインターネット環境での適合性が高い。
Rubyスクリプト言語と言われる型の言語である。日本発(まつもとひろゆきさんが開発)の言語で、様々な場面で利用されるようになってきている。
Pythonインデント(字下げ)でブロック構造が分かるようになっていたり、綺麗なプログラムが簡単に書けると言われている。AI(人工知能)のプログラムで利用されることが多い。
JavaScriptインターネットのWeb系で最も使われているブラウザを操作するためのプログラミング言語。ウェブブラウザだけがあれば動作するため、簡単に作成して利用する事ができる。JAVAとは直接の関係は無い。
TypeScriptTypeScriptはマイクロソフトによって開発され、メンテナンスされているフリーでオープンソースのプログラミング言語である。JavaScriptにの上位互換になっていて、変数の静的型付(宣言時に変数の型を定義する)や、オブジェクト指向などを取り入れている。
Scratch代表的なブロック言語。MIT(マサチューセッツ工科大学)で開発された。コンピュータの画面上で、ブロックを組み合わせることによってプログラムが作成できる。
COBOL主に事務処理を目的として開発された歴史の古い言語。銀行の汎用コンピュータなどで利用されている。
FORTRAN科学技術に関する計算処理に適するとされる歴史の古い言語。COBOLと並び、世界初のプログラム言語とされている。
BASIC比較的初心者向けのパソコン用プログラム言語。最初期に開発された言語であるが、現在でもエクセルの内部に「Visual Basic」として利用されている。

JavaScriptは、スクリプト(インタープリタ型)の言語で、オブジェクト指向を持っていて、更にウェブページ(ホームページ)記述を行うHTMLと不可分の関係にある言語である。なお今回の授業で扱うJavaScriptは、手元のコンピュータ(上のブラウザ内)で作動させるクライアントサイドとして利用する。
Google Apps Script
Google Apps Script(以下、GASと省略)は、Googleが開発・提供しているプログラム実行環境である。JavaScriptが基本となっている。GASを利用するには、大きく次の2通りの方法がある。 今回は、後者のコンテナバインド型を利用する。こちらの方法の方が、結果をドキュメントとして共有したり、スプレッドシートのデータを利用したりする点でメリットがある。
参考(Googleのリンク):
スタンドアロン型の説明
コンテナバインド型の説明
GASの準備
GASを利用するには、次のものが必要である。 それでは実際にアクセスして、最初のGASを作成してみる。手順は次の通りである。なお、この段階の前に、Googleアカウントを作成しておく必要がある。 詳しい手順は、このPDFを参考にすること。
GASプログラミング
ここからは、実際のGASプログラムを見ながら、説明を行う。このプログラムを、自分のブラウザのスクリプトエディターにコピペし、保存して、実行すると良い。
myFunction - ログで表示
function myFunction() { Logger.log('Hello World!'); }
最初の関数である事の宣言
  ログスクリーンに表示する関数の呼び出し。
関数の終了かっこ
このサンプルでは、スクリプト画面と同じ画面の下に、表示させる形式を取った。
このサンプル以降では、スプレッドシートの画面のメッセージボックスに結果が表示される。
myFunction1 - メッセージボックスで表示
function myFunction1() { Browser.msgBox('Hello World!'); }
最初の関数である事の宣言
  メッセージボックスに表示する関数の呼び出し。
関数の終了かっこ
このサンプルでは、GASのBrowser.msgBox関数を使って、スプレッドシートの画面上にお約束の文字列(Hello World!)を表示した。
なお、GASの形式としてスタンドアロン形式を選択した場合には、Browserクラスを利用する事は出来ない。

では、次に計算を行うプログラムを書いてみる。一日の秒数を計算してみる。
myFunction2 - 一日の秒数の計算
function myFunction2() { Browser.msgBox('一日の秒数は' + 60*60*24 + 'です。'); }
  文字列は’ ’で囲う。数値は計算式。文字と数値は + で連結できる。 
  

今度は、変数を用いたプログラムサンプルである。
ここでは、sec,min,hourという変数に数値を代入しておき、その乗算の結果を表示している。
myFunction3 - 変数を使った計算
function myFunction3() { let sec = 60; let min = 60; let hour = 24; Browser.msgBox('Sample03: 一日の秒数は' + sec*min*hour + 'です。'); }
  変数sec, min, hourを定義し、その積として表示している。
  let は、変数の定義
  (varでも定義可能であるが、変数の有効範囲が異なる)

次のmyFunction4では、新しい関数を用いた。関数は、決まった手順を一括して呼び出すためのプログラムのブロックである。この関数は、呼び出す前に定義しておくことが推奨される。関数を呼び出すときに関数に渡す値(ここでは、sec,min,hour)を、引数(ひきすう)と呼ぶ。ここでは、関数から帰って来る値は一つだけである(数学関数のsin(), cos()などと同様)。その返り値は、関数の中でreturn文で与えられる。
引数として、データの受け渡しをする事も可能であるが、呼び出し元と関数の中で同じ名前の変数名を使う場合には、どちらの変数が有効になっているかの注意が必要である。(これを変数のスコープと呼ぶ)
なお実行する際には、myFunction4を選択する必要がある。!
myFunction4 - 関数を使った計算
function secOfTheDay(sec, min, hour){ let result; result = sec*min*hour; return result; } function myFunction4(){ let sec = 60; min = 60; hour = 24; let kekka; kekka = secOfTheDay(sec, min, hour); Browser.msgBox('一日の秒数は' + kekka + 'です。'); }
  秒数を計算する関数を定義している。
  resultという変数に計算結果を代入する。

  return文で、計算結果を呼び出し元に返す。

  kekkaという変数に、関数を呼び出した結果(関数の中ではresult)を格納する。
  kekkaを出力する。

次に、スプレッドシートにボタンを配置して、ボタンにmyFunction4を割り当てる方法を示す。
手順としては、次のようになる。 手順は、このPDFに示したので、参考にして欲しい。
積算温度とは
今回は、水稲の生育ステージを予測するプログラムを作成する。基本とする考え方は、<積算温度>モデルである。
積算温度(積算気温)とは、一定期間の気温(平均気温)の合計値のことである。例えば3日間の平均気温がそれぞれ15℃、20℃、18℃であった場合、15+20+18=53℃ となる。
植物の積算温度モデルとは、この積算温度の値が一定値を上回った場合に、生育ステージの変化が起こるという考え方である。言い換えれば、一定の温度以上の日が数日(〜数十日)継続すると、生育ステージが次の段階に進むという考え方である。この考え方は、例えば桜の開花予想などにも良く利用されている。イネの栽培の場合、定植(田植え)後の積算温度によって、出穂(しゅっすい)日と、登熟(収穫)日を予測する手法が多く用いられている。
ただ、この積算温度についても、ある一定の温度(例えば15℃)以下では生育に寄与しないという考えから有効積算温度(15℃以上の気温部分についてのみ積算する)という考え方や、35度などといった高すぎる温度では、かえって生育にマイナスの要因になるとして、高温部での温度の寄与が低めになるような3次式を用いた積算温度モデル、などのバリエーションもある。また、成長率を気温による指数関数で表し、DVR(DeVelopment Ratio)を求め、その数値を積算して、DVI(DeVelopment Index)という数値を求めるDVIモデルという方式も広く使われている。
興味のある人は、インターネットなどで調べてみると良い。 DVIとDVR
また、単純積算温度モデルの場合であっても、幼苗期に低温に晒されると生育障害が発生したり、登熟期の低温で「イモチ」病にかかったり、不稔(結実不能)になったりと、さまざまな影響が考えられる。しかし、そういった効果のモデル化は基本モデルが完成してから追加してゆくこととしたい。(次回以降)

今回の課題で取り扱うのは「単純積算温度モデル」とする。
代表的な品種である「コシヒカリ」を考えると、田植えからの積算温度が1700度で出穂し、その後さらに1000度の積算温度が追加されると登熟が完了して、収穫可能となる。
具体的な計算の流れは次のようになる。
プログラムの動作
今回の課題プログラム(calc00.jsの説明)PDFファイルは、次のような動作を行う。
- 課題プログラムの説明 :
  1. 定数の定義(地域・品種データ・定植日(田植え日)の指定)
  2. 気温データを配列にセット
  3. 共通情報の表示関数
  4. シミュレーション結果の表示関数
  5. 実行ボタンクリック時の動作指定(関数定義)
    定植後の積算温度の計算・出穂日の決定
    出穂後の積算温度の計算・登熟日の決定
課題プログラムは、5. 積算温度の計算ー登熟日の決定部分が未完成である。
プログラミングが必要な該当部分は、 本日の課題作成部分 登熟日:toujukuDate計算 となっている。
その部分は、未完成のままにしあるので、このまま実行すると、登熟日はnullのままとなってしまう。
この部分を、各自、自分でプログラミングし、実行できることを確認して、提出することが課題である。すでに出穂日の計算は終了しているので、その部分を参考にして実装(プログラミングして機能を実現すること)してほしい。
プログラムで用いられている主要な変数名とその意味は、以下の通りである。

Variables in calc00.js
変数名変数型説 明備 考
VARIETYStirng品種名constで指定
TAUE_DATEInteger田植え日(日付連番)constで指定
TARGET_EAR_TEMP_SUMFloat出穂に必要な積算温度constで指定
TARGET_TOUJUKU_TEMP_SUMFloat登熟に必要な出穂後の積算温度constで指定
METEO[today]Float.Arraytoday日目(日付連番)の平均気温
366日型で提供
プログラム中に記載
shussuiDateInteger出穂日(日付連番) 計算して推定する
toujukuDateInteger登熟日(日付連番) 計算して推定する
currentEarTempSumFloat出穂積算気温の作業用
TARGET_EAR_TEMP_SUMと比較
計算中に利用
currentToujukuTempSumFloat登熟積算気温の作業用
TARGET_TOUJUKU_TEMP_SUMと比較
計算中に利用

気温ファイルは、次のような構造をしている。(366日型:2月29日のデータもある)
行番号読込時数値説明
1METEO[0]4.51月1日の平均気温(以下、計算で利用)
2METEO[1]4.41月2日の平均気温
----------
meteoMETEO[365]4.412月31日の平均気温

課題ファイル
今回の課題
なおGoogleスプレッドシートの「共有」リンクを設定して、「リンクを知っている全員」に対して、「編集者」として、リンクを設定すると、Googleスプレッドシート自体の提出ができると思われる。
ただ、その場合の実行権限の設定方法については、挙動が不安定なので、その手法での提出は、任意とする。
JavaScriptの超基礎(文法)
超簡略JavaScript文法(pdf)


参考リンク: