GAVE は電脳 Ruby プロジェクトのもと, 地球流体科学分野での利用を想定して西澤によって開発された多次元データの解析・可視化ソフトウェアである.
地球流体科学分野の研究手法として、データを可視化して解析する手法は重要な研究手法の1つである。例えば大気や海洋を研究するために、地球流体の研究者は衛星観測や数値シミュレーション等によって生成されるデータを解析する。このデータとは多次元の数値データである。データの表現方法として、折れ線図や等値線図などの2次元平面に表現する方法は人間にとって認識しやすい。多次元データの場合には、ある断面切り出して2次元平面に投影することによって可視化する。
近年、計算機やインターネットの発展によって多種多様のデータが多量に流通しており、これらを容易に利用することができる。計算機の計算速度が飛躍的に向上したため、これまでの計算速度では有限な時間内で扱うことができなかった数値計算ができるようになった。また、世界中に散らばる多様なグループや研究者が生成するデータをネットワーク経由で容易に入手することができるようになった。そして多量のデータを扱うことによって新しい発見につながるかもしれない。しかしデータが多種多様であるためにデータの扱いを効率よく行わなければ多量のデータを解析することはできない。
データを効率よく扱うための手法の1つとしてグラフィカルユーザーインターフェースで対話的に可視化する手法がある。多種多様なデータを可視化する場合、データごとに可視化したい断面はおそらく異なる。そうであればデータごとに切り出す断面を試行錯誤を繰り返す必要がある。この作業はバッチ処理のような手法よりも対話的に行う方が効率が良い。グラフィカルユーザーインターフェースであれば更にコマンドを入力する手間が省けるため、効率がよりよくなる可能性がある。
また、各々必要な機能を拡張するためにソフトウェアはソースが公開されかつ改変することが可能でなければならない。ソフトウェアに求める機能は研究対象によって異なる。例えばデータに対する演算において精度をどの程度求めるかは計算速度との兼ね合いがあるため多様である。このような要望は無限にあり1つのソフトウェアに全て実装することは困難である。したがって研究者が各々求める形にソフトウェアを改変することができなければ細かい要望は実現できないと思われる。
電脳 Ruby プロジェクト[3]では, 地球物理学におけるデータ解析, 可視化, 数値シミュレーションにオブジェクト指向スクリプト言語 Ruby[11] を使って活動を行っている. このプロジェクトでは地球流体関係者が解析・可視化のためのソフトウェアを開発している. Ruby を用いる理由は, オブジェクト指向というプログラムパラダイムを用いることによって、多様なデータを統一されたインターフェースから扱う設計にしやすいためである。またスクリプト言語ゆえに対話的なユーザーインターフェースを実装しやすいことなども理由の1つとしてあげられる.
電脳 Ruby プロジェクトによって開発された解析・可視化のためのライブラリを利用する GAVE[10](a gtk+ based grid data analyser and viewer writen on Ruby) という GUI の多次元データ解析・可視化ソフトウェアが開発されている. このソフトウェアは地球流体における多次元データの解析を効率良く行うためのソフトウェアである. 本論分ではこの GAVE についての紹介を行う.
以下, 第2章から第3章では GAVE の特徴と機能の概要を取り上げ GAVE がどのようなソフトウェアであるのか解説する. 第4章では GAVE の内部動作について触れる. また, 付録A として使用方法をまとめた. 付録B として電脳 Ruby プロジェクトについてまとめた. 付録C で GAVE が依存するライブラリをまとめた.
なお, 本論分で対象とする GAVE のバージョンは 1.0.0-beta4 である.
GAVE は西澤によって開発されている多次元データ解析・可視化ソフトウェアであり, 電脳 Ruby プロジェクトで開発された解析・可視化のためのライブラリを統合的に利用することができるユーザーインターフェースである. 図1 は GAVE を使用して可視化を行っている際の画面である. また, 扱うことのできるデータ形式は netCDF[13] である. バージョン 1.0.0-beta5 では GrADS のデータ形式も扱えるようになっている.
以下では GAVE の特徴を次の3つに分類し説明する。
GAVE のユーザーインターフェースは GUI である. GUI の長所は手軽で対話的な操作性である. 対話的な操作によって描画した絵に対して逐次修正を加えることができるため, データが持つ特徴をより明確に表現することが可能になるだろう. また, GUI は視覚的に機能を理解することができるためキャラクターユーザーインターフェース(以下 CUI) のソフトウェアようにコマンドを覚える必要がない。そのため, 初めてそのソフトウェアを使用する人であっても直感的に機能を把握することができる。よってソフトウェアを習得するまでに長い時間を要さない. また、GAVE の GUI は日本語に対応している. 英語が母国語としない日本人にとって日本語のユーザーインターフェースを持っていることは機能の把握を楽にする.
バッチ処理やルーチンワーク, または可視化を再現することを考えると, 一般に GUI は CUI に劣る. しかし GAVE はこの点を解消する機能を持っている. その機能とは可視化を再現するスクリプトをファイルに保存することができるという機能である. このスクリプトは Ruby スクリプトであり, このスクリプトとデータから可視化を再現することができる. またこのスクリプトを雛形として各々必要に応じて修正すれば, 様々な工夫ができる. 例えば GAVE が未実装の機能を実現したい場合はスクリプトを修正することで解決する. また, この雛形をループ(繰り返し構造)に閉じ込めファイルを順次与えるような処理を記述すれば, 複数のファイルに同様の処理を行うスクリプトを簡単に書くことができる.
電脳 Ruby プロジェクトの製品は基本的にソースが公開され、改変することも可能である。GAVE も電脳 Ruby プロジェクトの製品であるため同様のことが言える。商用のソフトウェアなどソースが公開されていないソフトウェアにおいて、そのソフトウェアに実装されていない機能が必要である場合は、開発が進むのを待つかあきらめるしかない。GAVE はソースを自由に改変することができるため自分で拡張することが可能である。例えば GAVE は現在, GAVE が利用するライブラリの機能の全てを使えるようになってはいない。そのため目的の機能に対するインターフェースを作成することで機能拡張を行うことができる。GAVE の記述に Ruby が使われているため拡張での手間がかからない。。
だれでも使える。GAVE は無償であるため導入しやすいソフトウェアであるといえる。無償であることはソフトウェアの導入性が良いことにつながらないが、GAVE はインストール用のパッケージが用意されつつあり、ドキュメントもこのように整備されつつあるため
GAVE は地球流体科学の研究を想定して作られているため地球流体科学にとって便利なな機能をもつライブラリを呼び出すことができる. 例えば地球科学における描画には地図投影する機能や欠損値処理が不可欠だろう. 例えば医学分野の可視化ソフトウェアであれば地図投影の機能はおそらくないだろうが GAVE では既に実装されている. 今後の開発でも地球流体科学の研究のためになる機能を中心に実装されると思われる.
GAVE は多次元データに対して描画、データに対する数値演算、netCDF の自己記述された属性の表示、そして描画結果の保存ができる. 以下ではこれらの機能を説明する。
描画には次元変数を1つとる折れ線図と, 次元変数を2つとる等値線図の2種類が可能である. 選択した変数が2つ以上の次元を持つの場合はデフォルトで等値線図が選ばれる. その際選択した変数の最初の2つの次元が次元変数として選ばれる. また, 等値線図の場合, 地図投影法を用いることもできる(後述). 図2は左から折れ線図を書いた例, 等値線図を書いた例, 地図投影に正射図法を用いて等値線図を書いた例を並べたものである.
図のタイトル, 軸のタイトルと単位はデータの属性に該当する値があれば, その値がデフォルトで設定される. またユーザーが陽に設定することもできる. ただし描画された図中には英数字しか記述することができない.
地図投影とは球面を2次元平面に投影する方法である。GAVE が現在利用できる地図投影は以下の4つの図法である.
ORTHOGRAPHIC (正射図法)
無限遠から見た地球を表す半球図. 半球より広い範囲を表示することはできない.
POLAR STEREO (ポーラーステレオ図法)
表示する反対側の極を視点として投影した図法. 緯線・経線との角度が正しい.
AZIMUTHAL (正距方位図法)
図の中心からの距離が正しい.
AZIMUTHAL EQ.AREA (ランベルト正積方位図法)
面積が正しい.
図3は地図投影の例である.
多次元データから切り出す面を指定する. 例えば, 緯度, 経度, 時間(月)の3次元の降水量データがあったとする. このデータから例えば, 8月の日本付近を描画範囲に指定するとしたら, 緯度を20°〜50°, 経度を東経120°〜160°に指定し時間を8月に指定する. ただし, 各軸に直行する断面しか切り出すことはできない.
空間的な構造や時間的な移り変わりなどを見るためデータをアニメーションとして表示することが可能である. 例えば前出の描画範囲指定で示したデータならば降水量の時間変化などを見ることができる. アニメーションの速度すなわち描画間隔も調節することができる. また, アニメーションは録画することも可能である(後述).
通常の座標軸または対数座標軸(片対数, 両対数)をとることができる。
等値線とトーンの塗分けは自動的に適当な間隔が設定されて描画される. その設定を変更したい場合は手動で設定しなおすこともできる. データの特徴が最もよく表現されるように可視化するためには自動的に設定された値では不十分なことが多い. そこで手動で設定しなおす機能が用意されている. この設定も他の設定と同様に対話的に行うことができる. 特にトーンの設定は実際に変更した設定を見ないことには最適な設定になっているかどうか分からないため GUI の操作が非常に有効である.
必要であれば欠損値を設定することができる. データの属性で欠損値が明示されていれば自動的にその値が欠損値として設定される.
多次元データに対して数値演算を行うことができる. 現時点で実行可能な数値演算は平均, 最大, 最小, 標準偏差の4つである. 演算した結果は新しい変数として扱われるため再び演算することも描画することもできる。
netCDF ファイルが持つ自己記述された情報を表示する機能を持っている. 通常これを確認するためには netCDF ライブラリに付属する ncdump というツールをコマンドラインから使って確認することができる. 同様のことが GAVE の属性表示機能でもできる.
描画結果を画像ファイルとして保存することができる. 保存する画像形式は拡張子によって判別される. PNG, JPEG , TIFF , PPM などの形式に対応している.
アニメーション表示機能を使って描画されている絵を1コマずつ保存することができる. 保存形式は PPM であり, ファイルには自動的に通し番号が付く. GAVE の機能からは外れるが, PPM 形式の画像は MPEG 形式の動画にエンコードすることができる.
可視化を再現する Ruby スクリプトを保存することができる。データファイルと, 保存したスクリプトをセットにしておけば可視化を再現することができる. さらに前節でふれたようにこのスクリプトに各々必要な修正を加える雛形として利用することができる.
GAVE の一連の動作の流れを図4 のように表した.
ユーザーは GAVE を起動後、まずファイルを開く(1. ファイルオープン). この段階でファイル内に含まれる変数が読み込まれる。ファイルには複数の変数がある場合がある。そのためまず操作対象とする変数を選択する(2. 変数選択)。そして実行したい動作を選択し(3. 動作選択)、動作に使用する次元変数を選択する(4. 次元変数選択)。この 2〜4 ではそれぞれで行った選択が次の選択肢を決定するため順番に行う必要がある。その後、動作を実行(6. 動作実行)するのだが、その前に投影法の選択や描画範囲の選択などの設定(5. 各種設定)を行うこともできる。3 で解析を選択した場合は 6 の動作実行で解析(データに対する演算)が行われその結果は新しく変数として生成される。この変数を 2 で選択するとこの解析結果を描画したり更に解析したりすることができる。6 で描画を行った場合は描画結果の絵が生成される。この絵に修正を加える場合は 5 に戻り修正のために設定を行う。または 2〜4 に戻り変数の選択などからやり直すこともできる。実際に GAVE で可視化を行う際は特に 5〜6 を対話的に繰り返し実行することになる。描画結果に満足した場合、結果を保存(7. 保存)することができる。保存には画像として保存するか Ruby スクリプトとして保存するかの2通りがある。GAVE の機能ではないが Ruby スクリプトとして保存した場合はデータファイルとともにこの Ruby スクリプトを実行(8. Ruby スクリプトの実行)することで可視化を再現することができる。
GAVE が利用している電脳 Ruby プロジェクトのライブラリはおおよそ図の橙、桃、青の点線で囲まれた部分に対応する。データの読込の機能に Ruby/NetCDF ライブラリ、描画機能に Ruby/DCL ライブラリ, 解析機能に GPhys ライブラリを用いている。Ruby/NetCDF ライブラリは Unidata から提供されている netCDF ライブラリの Ruby 用インターフェースであり、Ruby/DCL は地球流体電脳倶楽部で開発されている描画・数値処理ライブラリである DCL ライブラリの Ruby 用インターフェースである。また GPhys は電脳 Ruby プロジェクトで開発されている多次元物理量クラスのためのライブラリである。それぞれの詳細については付録C を参考にしてほしい。
Ruby スクリプトには GAVE が内部で可視化までに行っている一連の動作が記述されている. このスクリプトを見れば GAVE の内部で何が行われているかについてより具体的に知ることができる. 以下に ECMWF/ERA40 再解析データから 2001年8月の温度を可視化した際の例を用いて GAVE の内部動作をより詳細に解説する. 本論分で用いるデータは全て塚原によって ECMWF/ERA40 再解析データから蓄積されたデータである。この例では日単位の 2001年8月の温度データの月平均をとったデータを用いる。ファイル名は T_2001-08_ERA40.nc, 次元変数として緯度(degree north)、経度(degree east)、高度(millibars)の3次元を持つ。解説の都合上いくつかに分割しているが以下のスクリプトは 1つのファイルである.
1: require "gtk2" 2: require "numru/gphys" 3: require "numru/dcl" 4: require "numru/netcdf" 5: 6: include NumRu
ここまでは各ライブラリを使用するための記述である.
7: filename = "/home/takemoto/NC/T_2001-08_ERA40.nc" 8: varname = "t" 9: 10: gphys = GPhys::netCDF_IO.open(filename,varname)
このスクリプトではファイル名と描画する変数名を決めてファイルからその変数だけを呼び出している. しかし, GAVE でははじめから変数を指定してファイルを開いているわけではない. ファイルを開いてから図4 の 2. 変数選択で変数を選び, それから再びファイルにアクセスし指示された変数を読み込む.
11: gphys = gphys.cut(0.0..357.5,true,true) 12: gphys = gphys.mean(0) 13: gphys = gphys[0..-1,0..-1]
12行目で次元変数 longitude(緯度) で平均演算している. これは図4の 3. 動作選択で平均を選択し、4. 次元変数選択で longitude を選択したことが記述されている。新しくできた変数は、2. 変数選択で選択する。
14: DCL::gropn(1) 15: 16: DCL::sglset("LCNTL", false ) 17: DCL::udlset("LMSG", false )
これは描画のための初期化である。
18: xmin = 90.0 19: xmax = -90.0 20: ymin = 1000.0 21: ymax = 1.0 22: 23: vxmin = 0.15 24: vxmax = 0.4775 25: vymin = 0.1675 26: vymax = 0.84 27: 28: DCL::grfrm 29: DCL::grswnd(xmin,xmax,ymin,ymax) 30: DCL::grsvpt(vxmin,vxmax,vymin,vymax) 31: DCL::grstrn(2) 32: DCL::grstrf 33: 34: x_title = "latitude" 35: x_unit = "degrees_north" 36: y_title = "levelist" 37: y_unit = "millibars"
18〜21行目は描画範囲の指定, 23〜26行目は軸を含む矩形領域(これをビューポートという)の位置とサイズの設定をしている。34〜37行目はX軸, Y軸のタイトルと単位の設定している. 軸を含む矩形領域の位置設定は一度描画してから設定するのであるが, これら全て図4の 5. 各種設定にあたる.
38: DCL::sglset("LCLIP", true ) 39: DCL::uwsgxa(gphys.coord(0).val) 40: DCL::uwsgya(gphys.coord(1).val) 41: DCL::ueitlv 42: DCL::uegtla(-26783.916015625, 21480.806640625, 0 ) 43: DCL::uetone(gphys.val) 44: DCL::udgcla(-26783.916015625, 21480.806640625, 0 ) 45: DCL::udcntz(gphys.val) 46: 47: DCL::ussttl(x_title, x_unit, y_title, y_unit) 48: DCL::usdaxs 49: DCL::sglset("LCLIP", false ) 50: i=0 51: DCL::sgtxzv(vxmax+0.01,vymax-0.03*i,"(mean) longitude:0..357.5",0.02,0,-1,1)52: 53: DCL::uzrset("ROFFXT", 0.06) 54: title = "Temperature(K)" 60: DCL::uxsttl("t", title, 0 )
これが描画を実行している部分である. 図4の 6. 動作実行から絵が描画されるまでの流れである. ただ54,55行目はタイトルを設定している部分であり、これは図4の 5.各種設定に該当する.
61: DCL::grcls
これは描画したウィンドウを消す命令であるが, GAVE を用いて描画を行っている際はには関係ない部分である.
GAVE 上のクリックや入力などの操作がすべて1対1の関係でスクリプトを作成するわけではないが, GAVE の内部ではおおよそこのような動作をしている.
GAVE が多次元データを解析するために便利なソフトウェアの1つであることを示した。 まずデータから指向錯誤しながら断面を切り出す作業が非常に手軽にできる。 GUI で対話的に操作できるため、可視化しながら逐次、選択や修正を行うことができる。
GAVE は多次元データの解析に不慣れな人でも十分に機能を利用できるソフトウェアである。 近年の地球流体のデータを取り巻く環境の変化によって、 これまで多次元データを解析する機会が少なかった人も解析する機会が増えると思われる。 そうなると誰でも手軽に利用できるソフトウェアが重要になるはずである。 GAVE は GUI であるため CUI のソフトウェアに比べて機能を把握しやすい。 日本語に対応しているため、日本人であれば更に機能を把握しやすいだろう。 よって GAVE を使用するために使用方法を学ぶ労力をほとんど必要しない。 また、RedHat Linux、Debian Linux など一部の環境であればインストールパッケージを利用して 手軽にインストールすることができる(付録A 参照)。 したがって、GAVE は導入しやすいソフトウェアであると言える。
GAVE は、多次元データの解析を既に他のソフトウェアやライブラリを用いて行っている人に とっても非常に便利なソフトウェアである。 GAVE はソースが公開され改変も可能であるため各々求める機能を加えることができる。 GAVE が利用しているライブラリ(詳細は付録C 参照)も同様にソースが公開され改変も可能であるため これらのライブラリの機能から拡張することもできる。 これらのライブラリとは電脳 Ruby プロジェクトで開発されているライブラリであり 汎用言語である Ruby で記述してあるために拡張性が高い(Ruby については付録A 参照)。 また、GAVE はスクリプト作成支援ツールとして使うことができる。 可視化した手順を Ruby スクリプトとして保存することができるためである。 データファイルとスクリプトから可視化を再現することができるだけでなく、 このスクリプトを雛型として利用することで、解析スクリプトを手軽に作成することができる。
以上のように GAVE には幅広い活用方法があり、幅広い層の人にとって有用なソフトウェアである。 今後の開発に期待したい。
本論文を書く上で大変多くの方々から有益な助言や暖かいご支援いただきました. まず初めに指導教官である林 祥介教授, 小高 正嗣助手に深く感謝します. お2人には本論文のテーマを与えてくださり、さらに地球流体の背景について教えて頂きました. また地球環境科学研究科・石渡 正樹助手には本論文の資料に関して助言をいただきました. 地球流体力学研究室の修士過程の塚原 大輔さんには本論分の例のために使用したデータを頂きました。そして森川 靖大さんとともに本論文の文章添削から論文全体の構成に至るまで, 親身にご指導頂きました. この場を借りてお礼申し上げます.
この章ではまず使用するために動作環境とインストール方法に触れ, Debian Linux 環境で ECMWF/ERA40 再解析データを用いた GAVE の具体的な使用例を挙げる.
GAVE は現在, 以下の環境で動作が確認されている.
RPM や Debian パッケージが用意されているのでそれを利用すれば簡単にインストールできるはずである. ここでは Debian Linux に Debian パッケージを用いてインストールする方法を示す。その他のインストール方法は電脳 Ruby プロジェクのインストールページに書いてあるためここでは触れない.
以下のパッケージをインストールすると GAVE が使用できる。
今回の例では塚原によってストックされたデータベースから以下3つのファイルを用いている. これらファイルは ECMWF/ERA40 再解析データからの日単位で入手したデータを更に GPhys を用いて月平均をとったものである。
ファイル名 | データ |
---|---|
TP_2001-08_ERA40.nc | 2001年8月の降雨量 |
T_2001-08_ERA40.nc | 2001年8月の気温 |
U_2001-08_ERA40.nc | 2001年8月の東西風 |
Xウィンドウが起動している状態でコンソールから
$ gaveとして起動すると, GAVE が図14のように起動する.
$ gave filename.ncとする。
等値線図の描画例として, ERA40再解析データより
2001年8月の気温を可視化する.
ここで使うファイルは気温のデータで次元変数として
緯度(longitude), 経度(latitude), 気圧(levelist)の3変数
を持っている.
描画する対象の変数を選択する.
例では t しかないのでそれが選択されている.
次に動作に等値線(Contour)を選択する.
そして軸にとる次元変数を選択する.
例ではデフォルトの longitude と latitude が選択されている.
描画(Draw)ボタンをクリックすると等値線図が描画される.
ビューポートの内部をドラッグすることで表示位置を変更することができる.
ビューポートの枠(軸)をドラッグすることでサイズが変更できる.
ただし現在のバージョンでは文字も含めた描画範囲は正方形の領域しかとることが
できない仕様になっている.
X軸とY軸にとる次元変数を選択しなおす.
X軸にlatitude, Y軸にlevelsを選択した.
描画ボタンをクリックして, 描画を開始するると次のようになる.
描画の表示位置とサイズは変更している.
latitudeとlevelistは軸として使われているが,
残ったlonitudeは現在, デフォルトの東経0度が使われている.
そこで東経140度の図を描きたい場合は次元ウィンドウで設定する.
描画してみる.
図の右側に「longitude 140 degrees_east」という文字列があることがわかる.
図のタイトルを変更することができる.
これを描画すると次のようになりる.
軸に付属する文字列 (タイトルと単位) を変更することができる.
これは軸ウィンドウから行う.
これを描画すると次のようになる.
しかし、あまり的確な修正ではなかったので、図26ではまたもとに戻している。
軸ウィンドウの対数チェックボタンをチェックすると
対数軸をとることが可能である.
軸ウィンドウの最小値と最大値を設定することで 描画の範囲をしていすることができる.
描画範囲を逆に設定することで上下, 左右反転させる
こともできる.
例では上下を反転させている.
1000mbが図の下して見やすくした.
等値線とトーンの間隔は自動で設定されるが
手動で設定することもできる.
等値線間隔およびトーン間隔ウィンドウの手動・自動を
切り替えて最小値と間隔を設定することで手動で設定が可能である.
最小値と間隔は変数tの範囲を考えて適当に設定してする.
何度か繰り返し設定しなおすことが必要になる.
各変数が持つ情報を表示する. メインウィンドウのメニューバーから属性ウィンドウを選択し表示させる. これでデータが持つ属性を表示する.
例をみると, 変数tは単位 K, longname が Temperature であり
スケールファクタとオフセットが図のように設定されていて,
次元変数に longitude, latitude, levelist をもっていることがわかる.
大域属性はファイルの出所などファイルそのものに関する属性である.
動作選択メニューから等値線の代わりに折れ線を選択すれば
あとは等値線と同様に折れ線図を描くことができる.
地図投影法は4種類用意されている.
使用する投影法を地図投影ウィンドウから選択し,
メインウィンドウの動作選択メニューから「地図投影(Map)」を選択する.
他の手順は等値線図を描く場合と同じである.
それぞれの投影法で描画してみる.
描画対象となる物理量を解析する.
解析対象となる変数を選択し, 動作選択メニューから解析方法を選ぶ.
選択できる解析方法(関数)は現在4種類用意されている.
解析方法を選択すると実行ボタンがその解析用の実行ボタンに変わる.
解析に使用する次元変数を選択して, その実行ボタンをクリックする.
すると解析されたデータが変数欄に新しくできる.
本文で触れたように電脳 Ruby プロジェクトは多次元データの解析・可視化ライブラリを開発するプロジェクトである. Ruby の特徴であるオブジェクト指向というプログラムパラダイムを取り入れることで従来型の設計では実装が面倒だった処理がはるかにシンプルに実現している.
多次元データの科学技術データ形式は標準的なものでも数種類存在し, しかもデータが存在する媒体も1つではない. データがメモリにある場合と外部記憶装置にある場合ではデータにアクセスする手続きが異なる. もしネットワーク上のデータに直接アクセスする場合があればさらに複雑な手続きが考えられるだろう. また, netCDF などの自己記述型データ形式はデータがデータ自身を知っているためオブジェクト指向に親和的である. このような背景からオブジェクト指向言語を用いた開発がはじまったのは自然な流れであると考えられる. また, いくつかのオブジェクト指向言語の中からRubyを選択した理由はRubyが次のような特徴をもっているからである.
Ruby は 10 年程前にまつもとゆきひろ氏[8]によって開発された言語であり, 言語としては新しい部類にはいる. そのため Smalltalk をはじめとした様々な言語の良い部分を取り込んだ言語になっている.
Ruby の特徴は手軽なプログラミングを求めた設計思想である. 何が可能かではなくいかに可能かという点を考慮している. 簡単なことを簡単に表現できる文法,
特に最初から純粋なオブジェクト指向言語として設計された言語であるため手軽にオブジェクト指向プログラミングができる特徴を持っている. 例えば C++ のように C 言語から受け継ぐ手続き型の記述も可能な言語では, 非オブジェクト指向的プラグラムと混在し, かえってすっきりしない設計に陥りやすい欠点をもつ. それに対しRuby は変数にデータ型が存在せず全てオブジェクトである. また, ほとんどの処理がメソッドであり, 関数, 手続き, コマンドといった区別がないという特徴をもつ. したがって Ruby は非オブジェクト指向的な設計になりにくい設計になっている.
また Ruby は非常に開発効率のよい言語である. オブジェクト指向そのものが開発効率の向上をめざした考え方でもあるので当然であるが, それに加えシンプルで柔軟な文法, さらには例外処理やイテレータなどの機構によって可読性の高いプログラムを書くことができる. また変数に型がないため, 型の管理をする必要がない(このようなことはオブジェクト自身が行う). さらには自動的にメモリ管理を行うガーベッジコレクタなどのプログラム支援機能があるためプログラミングでは機能の実装に集中できる. インタプリタであることも開発効率に貢献していると思われる.
GUI やネットワーク関連などのライブラリが既に開発されていることも Ruby 重要な特徴である. 特に GUI ライブラリは Ruby ではRuby/Gtk, Ruby/Tk, Ruby/Qt, Apollo(Delphi の機能を利用できるライブラリが付属)など非常に多い. 本論文で取り上げる GAVE は GUI を Ruby/Gtk で実装している.
欠点もいくつかあげられるが, 最も大きな欠点は速度である. まずインタプリタ型の言語であるためコンパイル型の言語に比べて実行速度が遅いのは当然である. また Ruby の柔軟な文法は他の言語に比べてパーサに負荷をかけており速度に影響を与えている. 電脳 Ruby プロジェクトでは大量の数値オブジェクトに対して計算を行うことになるため前者の問題が大きい. また Ruby の配列の要素は必ずオブジェクトである. もしもの配列で大きな多次元数値配列を扱うとしたら配列の要素全てを数値オブジェクトとして生成してしまうので, 速度だけでなくメモリの点からも非常に大きな問題になる.
しかし, この問題は拡張ライブラリを使うという方法でほぼ解決することができる. Ruby は C 言語で記述された言語である. そのため Ruby で書かれたプログラムは C 言語でも書くことが可能である(ただし冗長な定義やメモリ管理が必要). この C 言語で書かれたRubyのライブラリを拡張ライブラリという. C言語で記述してコンパイルされているプログラムであるため当然速度は速くなっている. このことからも Ruby の拡張性の高さが分かる. 多次元数値配列クラス NArray も拡張ライブラリのひとつである. NArray は通常の配列クラス Array とは異なり, 一様に並べられたポインタを構造体でくるんだものである. その結果, NArray高速な演算が可能である.
Gtk+は画像処理ソフトウェア Gimp のために開発された主に GUI を提供するためのツールキットである. Gimp が持つ機能を呼び出すことも可能であり, 描画, 対応する画像形式への変換などの機能も有する.
GAVE は Gtk+ の Ruby 拡張ライブラリである Ruby/Gtk を用いて GUI を実装している. Gtk+はC言語で記述されたライブラリだが, オブジェクト指向概念をもったライブラリである. たとえばウィンドウの部品(ウィジェット)は継承によって生成される. オブジェクト指向言語Rubyから利用できるRuby/Gtkではさらにオブジェクト指向のよい部分が導入されGtk+では冗長だった関数の呼び出しがシンプルになるなど開発効率が非常によくなっている.
netCDF が自己記述・非機種依存型のデータ形式であることは本文で述べた. netCDF ライブラリは Unidataが持つ多くのアプリケーションに共通のデータアクセス方法を提供する目的で開発されたライブラリである. このライブラリを用いて netCDF ファイルのI/Oを行うことでバイトオーダーや浮動小数点表現の違いを吸収し, 機種に依存しないデータ形式が実現している.
Ruby/NetCDF[7] ライブラリは電脳 Ruby プロジェクトによって作成されたライブラリである. C, Fortran, C++, Perl から呼び出す netCDF ライブラリは Unidata から提供されていたが, Ruby 用の netCDF ライブラリはなかったため C 用のライブラリから拡張することで Ruby 用ライブラリが作成された. GAVE ではこの Ruby/NetCDF ライブラリを用いてnetCDF ファイルのI/Oを行っている.
DCL とは地球流体関係者が長年にわたり蓄積してきた Fortran の描画・数値計算ライブラリである(地球流体電脳倶楽部). DCL は地球流体関係者が開発しているため地球流体研究用途に準じた機能が豊富である. GAVE は描画に DCL を利用しているため DCL ライブラリが提供する等値線図の描画や地図投影が可能になっている. ベクトル場の描画など GAVE には実装されていない機能がたくさんあるが将来的には実装されるのだろうと思われる.
GAVEはDCLのRuby拡張ライブラリであるRubyDCL[5]に依存している.
GPhys[7] は多次元物理量のための Ruby クラスライブラリである. GAVEは内部でデータをGPhsyクラスのオブジェクトとして持っている. またデータ形式や媒体によらず統一的なインターフェースを提供する. 現在 netCDF と GrADS のデータ形式に対応している. 地球科学で扱う非常にサイズの大きい多次元データを考えた設計になっている.
GPhsyは解析メソッドをもっている. GAVEの解析はこのメソッドを利用している. また簡単な描画用のモジュールが用意されているため, 解析・可視化スクリプトを簡潔な書式で実現できる. GPhysは中でNArrayというライブラリ用いている. NArrayはC言語で記述されたRuby拡張ライブラリであるため高速に演算することができる.