J. Plasma Fusion Res. Vol.84, No.4 (2008)２
１
７‐
２２
７

講座 オープンソースソフトウェアを使った実践データ解析

５．地球流体科学における Ruby の利用
堀之内

武

京都大学生存圏研究所（原稿受付：２
０
０
８年２月１
８日）

５．
１ はじめにでも実行速度を求める数値シミュレーションコードはほと今回，「オープンソースソフトウェアを使った実践デー

んど Fortran です．一方，データ解析・可視化には様々なタ解析」の一環として，地球流体電脳 Ruby プロジェクトの言語が用いられるようになりました．

活動を紹介してほしいという依頼をいただきました．当プ

当時，可視化において は，米 国 で は NCARG（NCAR

ロジェクトは，大気や海洋などの「地球流体」の研究に，は米国の大気科学の中核的なセンター），日本では DCL

Ruby を用いるためのソフトウェアの共有や情報交換を行（Dennou Club Library）という FORTRAN ライブラリが広う，ボランティアベースのプロジェクトです．参加はメーく使われていました．DCL は，京都大学の塩谷雅人氏がリングリストに登録するだけなので，プロジェクトという

NCARG に満足できず作ったもので，当初は SGKS（small-よりはフォーラムのような緩い括りのものとなっています

GKS）という名前でした．それが，気象学に限らず地球流（ML には生物学専門で参加されている方もいます）．私自体分野の計算機資源をアーカイブ・公開する「地球流体電

身は大気の研究をしています．大規模な数値シミュレー

脳倶楽部」の中核ライブラリとして発展し，DCL として現ションには Fortran のモデルを使いますが，それ以外の数在に至っています．地球流体電脳倶楽部は，MIT 留学中に

値解析，データ処理，可視化はほぼすべて Ruby で行ってUNIX とインターネットと黎明期に遭遇した東京大学（当います．

時）の林祥介氏，京都大学の酒井敏氏らが中心になって設

本稿では，まず５．
２節で，当プロジェクトの前史，歴史

立 さ れ ま し た．www.gfd-dennou.org を 中 心 に 複 数 の ミを，筆者個人の視点で語ります．実用的なヒントを早く得

ラーサーバを運営し，計算機ソフトや様々な文書を公開しるためには読み飛ばしていただいて構いません．次に，
５．
３ています．その経緯は，林氏が日本気象学会和文誌に寄せ節で，地球流体研究における Ruby の利用の実際についてた［１］に詳しく述べられています．その冒頭を引用します．

述べます．その際，Ruby で流体の数値データを扱うため

地球流体電脳倶楽部は，大学での教育と研究のためのの，我々の中核クラスライブラリ GPhys を用いたサンプル

計算情報資源の開発と蓄積を目指して協力する，気象をまず紹介して，Ruby を使うことでどれくらいプログラ学・海洋学を中心とする地球流体力学関係有志の集まり

ムが短く簡潔にできうるかを示してから，それを支える多である．その活動はボランティア精神を基盤にしている．

次元配列，可視化，数値計算ライブラリについて述べます．

各々がその必要・野望のもとに出せる力を出して協力で我々が扱うのは流体ですので，プラズマ・核融合の分野ときるところを協力し，利用できるものを利用し合う，と共通性は高く，ほぼ同じことをする，あるいはさらに，いうものである．

GPhys を直接拡張して利用することも可能なケースは多いのではないかと想像しています．５．
４節では，「Ruby でひ

さて，研究室に入った私は，周囲に教わって，当然のごろがる世界」と称して，ドキュメンテーション用のツール

とく FORTRAN と DCL を使うようになりました．特に疑を紹介し，さらに，充実した Ruby のオープンソースライ

問を持つことなく，計算にも描画にも，毎回 FORTRAN

ブラリを用いて開発された，グラフィカルユーザインタ

プログラムを作成，コンパイル，実行しました．そこからフェースプログラムや，Web ベースでデータの公開や共有の最初の転機は，M2も半ばを過ぎてから，沼口敦氏の手ににも使える解析・可視化プログラムを紹介します．

なる大気大循環モデル AGCM5（電脳倶楽部版）を使い出したことです．AGCM5 の出力ファイルは，２次元または３５．
２ 地球流体電脳 Ruby プロジェクト

次元の格子点値にヘッダーをつけたレコードが，時間に地球流体電脳倶楽部と Ruby への道のり

沿って並ぶもので，同氏による Gtool3 という FORTRAN

私が大学院を過ごした１
９９０年代，気象学分野では，大型ライブラリーで読み書きできるようになっていました．

計算機を用いた数値計算はもちろん，PC 等を用いたデー

Gtool3 には「サンプルプログラム」として，コマンドライ

タ解析・可視化においても FORTRAN が標準でした．今ンで実行するプログラム群が付属しており，簡単な統計処

Practical Data Analysis Using Open Source Software 5. Ruby for Geophysical Fluid Sciences
HORINOUCHI Takeshi
corresponding author’s e-mail: horinout＠rish.kyoto-u.ac.jp

２１７!2008 The Japan Society of Plasma
Science and Nuclear Fusion Research

Journal of Plasma and Fusion Research Vol.84, No.4 April 2008

理や描画はコマンドラインで行えるようになっていまし紹介された NumRy があり，ライブラリ面ではより有利でた．レイアウトを気にしなければ，空間３次元×時間の４した．一つ，機能面で Ruby の後押しとなったのは，C 等で次元データの任意の断面がコマンド一発で描けるので大変書かれたライブラリのラッパを作成して取り込むことが容重宝しました．一方で，AGCM5 の出力以外には旧来の易で，インタプリタの再コンパイルも不要である（Python

FORTRAN プログラミングで対処しましたので，「どので は 必 要）と い う こ と で し た．本 格 的 に 使 う に は，

データも Gtool3 形式だったら良いのに」と思ったものでし

NetCDF，DCL など多くのライブラリを Ruby に取り込また．しかし，Gtool3 形式はそこまで対応できるほど汎用でないとなりませんので．

はありませんでした．

地球流体電脳 Ruby プロジェクト

博士課程終了後，米国で研究員をしました．データ解同年，林氏が科学技術振興事業団（JST）の短期集中型予析・可視化には，周りの人が使っていた（日本でも聞いた算を「地球惑星流体現象を念頭においた多次元数値データ

ことはあって興味があった）IDL という商用のプログラミの構造化」という課題で受けました．その一環として，私

ングツールを使うようになりました．IDL は，型宣言が不の乗り気やごとけん氏の存在もあって，Ruby で地球流体

要なインタプリタ言語で，コマンドラインでも使え，それのデータを解析を行うための開発をしてみようということなりに手軽でした．同時に NetCDF という，Gtool3 よりもになり，地球流体電脳 Ruby プロジェクトが発足しました

汎用なデータ形式（次節参照）を使うようになり，IDL で（http://ruby.gfd-dennou.org/）．同時に Ruby に限らず，地NetCDF データの描画が行える Gtool3 のようなライブラリ

球流体のデータ解析可視化に関する研究開発活動を地球流を自作して使うようになりました．しかし，汎用性という体電脳 davis（data analysis and visualization）プロジェク

面では，手続き型言語の壁にあたり，「本来ならここまで

トと呼ぶようにもなりました．Ruby 開発者のまつもとゆ汎用にできていいのに」と思うレベルに届かせるのは簡単

きひろ氏に札幌まで来ていただき，講演していただいたこ

ではありません．また，IDL 付属の描画 ラ イ ブラリは，ともありました．同研究の成果としては，富士通エフアイ

DCL よりも細部の出来が悪く，論文レベルの描画のため細ピー!との共同開発により，DCL の Ruby 版を開発したとかな制御を行おうと思うと，かなり経験的な試行錯誤をしいうことが挙げられます．JST 予算は１年で終了しました

なければならないことも思い知らされました．

が，プロジェクトはその後も続いています．その間に，現その頃，Meyerの名著［２］を読み，かつて日本で何冊か薄在は Ruby での地球流体データ解析プログラミングで最もい本を読んでも理解できず挫折した，「オブジェクト指向」

活躍している西澤誠也氏が私の出身研究室の大学院生となとは何であるかとその利点が，はじめて理解できるようにり，Ruby を使いはじめています．

なりました．オブジェクト指向は，汎用で再利用性の高い

IDL を使っているときは，毎日のように「IDL はなんて

ソフトを開発するための技術であるということが納得でタコなんだ」と思っていました（そのせいで米国でのオフィ

き，上記の汎用性の問題は，オブジェクト指向プログラミ

スメートは「タコ」という日本語を覚えてしまいました）．

ングで解決できるはずだということがわかりました．そしところが，Ruby を使ってみると，嬉しい驚きの連続で，プて，IDL で描画ライ ブ ラ リ を 作 る 傍 ら，Fortran90 のモ

ログラミングが大変楽しくなりました．それでも，私がジュールや総称名定義を活用して，オブジェクト指向風に

IDL を卒業し，Ruby に完全に乗り換えるのは，後述する

NetCDF ファイルを扱うライブラリ作成も行いました．

GPhys というライブラリを開発した２００３年初頭にまでずれ

しかし，Fortran90 で「オブジェクト指向する」のはそうこみました．電脳 Ruby プロジェクトは，それまではイン楽ではありません．そこで，電脳倶楽部のメーリングリス

フラとなる拡張ライブラリを少しづつ用意する助走期間とトで，「IDL のようにコマンドラインでも使えるオブジェ

なりました．よって，当プロジェクトの本格稼動は比較的

クト指向言語はないかな」とぼやいたところ，「Python と最近のことと言えるでしょう．

Ruby というのを聞いたことがある」と塩谷氏からコメント

圧倒的に短い行数でデータ処理，可視化プログラムが書を貰いました．当時は Python の本しか手に入らなかった

ける GPhys を開発したことにより，地球流体分野でのので，とりあえず Python を触ってみることからはじめま

Ruby の利用者は少しずつ増えてきています．ただし，地球した．これはとても良さそうだと思いましたが，本格的に流体研究のデファクトスタンダードというところまでは程使う前に帰国となり，当時北海道大学にいた塩谷・林氏遠いです．普及活動という面では，２００３年より，毎年３月

が，Ruby 使いの数学科の大学院生（当時）の後藤謙太郎にワークショップと初心者向けチュートリアルをつなげて（通称「ごとけん」）氏に出会ったなどという話題もあり，今開催しています．ただ，大学の研究室では教員や先輩が教度は試しに Ruby を使ってみました．１９９９年のことで，日えるというのが大きいですので，それを飛び越えて使って本でもまだ一冊も Ruby の本がなく，Web 上のリファレン

みようという学生は，やはりちらほらとしか現れません．

スマニュアルだけが頼りでした．しかし，Ruby を使い始め

しかし，根本的な問題としては，まだ資源集積とドキュメ

た途端に，良く練られていて使いやすい言語仕様に魅了さ

ンテーションが足りないということがあります．オブジェれました．地球流体データの扱いに使うという面では，Py-

クト指向の利点は，再利用性・汎用性の高いソフトを作りthon でも Ruby でも良かったと，今でも思います．私自身

やすいということですので，研究コミュニティのソフト

は Ruby を愛用するに至りましたが，基本的には好みの問

ウェア資産形成に大きく役立ちます．地球流体科学の将来題だろうと思います．Python については，当時既に３章でのためにも，継続的に努力していきたいと思っています．
２１８

Lecture Note

5. Ruby for Geophysical Fluid Sciences

T. Horinouchi

コミュニティのソフトウェア資産を集積するには，手軽の格子点値に加えて，それぞれの座標や名前，単位などのな資源置き場があると役に立つでしょう．電脳 Ruby プロ

情報を持ちます．GPhys で扱えるファイル形式は複数あジェクトでは，ようやく，この原稿を書いている２
００８年冬

り，拡張することも可能ですが，共通点としてファイル中になって念願がかなって，Wiki を用いた「小物置き場」をのデータ変数に名前でアクセスできることが必要です．各

開設する見通しとなりました．Wiki の実装には Ruby ベー格子の座標値等も，データ変数から機械的に辿れる必要がスの Hiki を用いることで，Ruby 使いの管理者がカスタマあります．ただし，ここで「何々できる」とは，それがでイズしやすく，また投稿者にとっては，Ruby の標準的なドきるライブラリが用意されているということですので，キュメンテーションのスタイルと親和的なサイトにするこ

様々な形式に柔軟に対応できます（必要な名前はライブラとができます．今後は，このサイトに利用者のプログラム

リ内でつけても良いなど）．

が寄せられるようになることを期待しています．

入手・インストール

さて，GPhys 開発後緩やかに発展していた電脳 Ruby

地球流体電脳 Ruby プロジェクトのライブラリは http:/

プロジェクトにおいて，２００６年より新たな展開がありまし/ruby.gfd-dennou.org から入手できます．Debian，Fedora

た．それは，５．
４節に述べる，Gfdnavi の開発です．各研究

等の Linux ディストリビューションでは，apt，yum などの者が手持ちのデータの解析に使えるだけでなく，Web ベー

コマンドで簡単にパッケージをインストールでき，Win-スのデータ提供，共有にも使えるアプリケーションです．

dows 用には，Ruby 本体に加え当プロジェクトのライブラ

使用する言語は，Ruby を中核に，SQL，Javascript，html

リ他様々な関連ライブラリ（GNU Scietific Library や Gnome，に広がりました．これまで我々が行ってきたのは，地球流

３次元可視化の Vtk など多岐）が，一度の''Setup''でインス体の研究者による自分たちのための道具作りでしたが，本トールできるパッケージが用意されています．これは，開発は情報系の研究者の協力をいただいて，一部は彼／彼

Windows用の他のRubyバイナリと共存できます．その他，

女らの研究ネタになる形で共同開発を進めています．

Mac OS 用パッケージなども用意されています．なお，以下で使用するサンプルプログラムは本講座の特設ページにも５．
３ Ruby を用いたデータ解析・可視化

置く予定です．
GPhys の利用例

本節では，地球流体のデータ解析可視化のための Ruby
ライブラリを紹介します．Ruby の利点を実感していただ

ここで用いるデータは，ftp://ftp.cdc.noaa.gov/Datasets

くために，我々の中核ライブラリ GPhys のサンプルをはじめ/ncep.reanalysis.derived/pressure/air.mon.ltm.nc よ り 入に紹介します．ついで，より基礎的な数値配列やファイル入手できる，NetCDF 形式のファイルです．内容は，グロー

出力について述べ，GPhys の実装に戻ります．最後に，拡バ ル な 気 温 の３次 元 分 布 の 平 均 的 な 季 節 進 行 で す．

張ライブラリ，数値計算ライブラリについて簡単に述べます．

NetCDF 形式は次々小節で紹介しますので，ここではさし

GPhys というのはライブラリ名であり，その中心的なクあたりサンプルソースの理解に必要なことに絞って書きま

ラスの名前でもあります（クラスについては第４章を参照

す．このファイルでは，気温は，緯度，経度，高度（気圧してください．クラスとは手続き型言語の型に相当します面），時間（月）に関する４次元配列となっており，airが，自由に定義できます．その型に基づいたデータ実体をと名づけられています．各座標軸の格子点値を収める一次

オブジェクトといいます．）．GPhys が扱うのは，離散化さ元配列には，lon，lat，level，time という名前がついれた，連続空間の物理量（広い意味での格子点データ）でています．GPhys ライブラリがインストールされている

す．GPhys オブジェクトは，内部データとして，各物理量と，次のプログラムにより描画を行うことができます．

リスト１：global_temp.rb
１

require ”numru/ggraph”

２

include NumRu

３

iws = ARGV[0] || 1

４

DCL.gropn(iws)５DCL.sgpset(’lcntl’, false)６gphys = GPhys::IO.open(’air.mon.ltm.nc’, ’air’)７

GGraph.contour( gphys.cut(’level’=>925) )８

DCL.grcls% ruby global_temp.rb*** MESSAGE (SWDOPN) *** GRPH1 : STARTED / IWS = 1.
*** WARNING (STSWTR) *** WORKSTATION VIEWPORT WAS MODIFIED.
*** MESSAGE (SWPCLS) *** GRPH1 : PAGE = 1 COMPLETED.
結果は図１のようになります．ソースの最初の５行は定

nc 中の変数 air をもとに GPhys オブジェクトを初期化

型のおまじないです（後述）．６行目で，air.mon.ltm.

し，７行目で 925 hPa の気圧面を指定して等高線を描画し，
２１９

Journal of Plasma and Fusion Research Vol.84, No.4 April 2008

図１

global_temp.rb の実行結果（スクリーンショット）

最後に終了のおまじないを呼ぶだけのソースとなっています．しかし，図には座標軸が緯度，経度であることが示されています．これは，GPhys オブジェクトが座標情報（の読み出し方）を持っているからです．７行目で使われている

cut は，座標値ベースの切り出しや範囲絞込みを行う

メソッドです（メソッドは手続き型言語の関数に相当します）．例のように次元を名前で指定できるほか，順番並び引
数 で 名 前 に よ ら ず 指 定 も で き ま す．こ の 例 で は cut(true,true,925,true)となります（true は全範囲の選択）．このように引数の仕様を柔軟にできるのは Ruby のメ
図２

リットの一つです．

global_temp2.rb の実行結果（PostScript）．

最初のおまじない部分を説明します．１行目は GPhysの描画ライブラリ NumRu::GGraph を読み込むことを指定

ダースコアが含まれるので，特殊文字解釈を抑止するといしています．我々のライブラリは，このように NumRu とうのが，その内容です．７行目冒頭の GGraph というのがいうモジュールにくるむことで名前空間を保護しています

GPhys の描画モジュールです．内部ではDCLを使いつつもが，いちいち NumRu：：をつけて呼ぶのは面倒なので，２完全には隠蔽せず，DCL の直接の呼び出しを協調的に行う

行目の include で，外して呼べるようにします．３行目はようになっているのが，若干敷居が高いところです．しかコマンドライン第１引数の値を変数 iws に代入します．or

し，DCL が持つ多彩な機能を余すこと無く使えるため，論をあらわす||により，省略値を１にしています．４行目は文掲載に耐える図が作れます．

それを使って，出力デバイスを初期化します．省略値の１

さて，試行錯誤したい場合は，Ruby の対話的インタプリ

であれば画面に，２であれば PostScript に出力などとなり

タ irb を使うのが便利です．以下では，最初の５行のおまじます．５行目は，ほんとのおまじないです．DCL では，アないを ggraph_startup.rb というファイルに収録してンダースコアが下付添え字を表すと解釈されますが，今回省略できるようにした場合の例を示します．下線を引いた用いるファイル内の文字情報には，区切りとしてのアン

ところがユーザの入力です．

% irb −r ggraph_startup.rb*** MESSAGE (SWDOPN) *** GRPH1 : STARTED / IWS = 1.
irb(main):001:0> gphys = GPhys::IO.open(’air.mon.ltm.nc’, ’air’)=> <GPhys grid=<4D grid <axis pos=<’lon’ in ’air.mon.ltm.nc’ sfloat[144]>><axis pos=<’lat’ in ’air.mon.ltm.nc’ sfloat[73]>><axis pos=<’level’ in ’air.mon.ltm.nc’ sfloat[17]>><axis pos=<’time’ in ’air.mon.ltm.nc’ float[12]>>>
data=<’air’ in ’air.mon.ltm.nc’ sfloat[144, 73, 17, 12]>>irb(main):002:0> GGraph.contour( gphys.cut(’level’=>925) )*** WARNING (STSWTR) *** WORKSTATION VIEWPORT WAS MODIFIED.
=> nilirb(main):003:0>←次の入力のプロンプト（セッションは続く）

２２０

Lecture Note

5. Ruby for Geophysical Fluid Sciences

T. Horinouchi

上で=>に続くのは，irb が各行の戻り値を「お任せ」で文字

断面を地図投影で，下図は北緯３５°で経度方向に平均した列化したものです（ただし表示法は再定義できます）．１行

鉛直プロファイルを示します．縦軸の気圧は，対数をとる

目 に 対 す る 出 力 よ り，開 い た の が lon，lat，level，timeとほぼ高度に線形に対応しますので，対数スケーリングでの４次元データであることなどがわかります．

表示しています．本ソースでは指定パラメタが増えていま

同じデータを使った描画サンプルをもう一つ載せます．

すが，GGraph は，段階的にパラメタを増やしていくこと

次のプログラムを実行すると図２が得られます．今回は引で凝った描画ができるよう設計してあります（凝ろうとす

数で PostScript を指定した結果を示しました．上図は水平

ると急に複雑にならないよう）．

リスト２：global̲temp2.rb
１

require ”numru/ggraph”

２

include NumRu

３

iws = ARGV[0] || 1

４

DCL.swpset(’iwidth’,550)# 画面サイズ（横）５DCL.swpset(’iheight’,700)# 画面サイズ（縦）６DCL.sgscmn(5)# 白黒カラーマップ

７

DCL.gropn(iws)８DCL.sldiv(’y’,1,2)# 画面を１×２に分割

９

DCL.sgpset(’isub’, 96)#＿

が下付添字にならぬよう制御文字を‘に変更

１０ DCL.sgpset(’lfull’, true)# viewport を１×１の正方形とせず画面に合わす

１１ DCL.uzfact(0.8)# 文字サイズを 0.8 倍に

１２ gphys = GPhys::IO.open(’air.mon.ltm.nc’, ’air’)１３ # <上図>
１４ GGraph.set_fig(’itr’=>12, ’viewport’=>[0.07,0.93,0.1,0.55])
１５ GGraph.set_map(’coast_world’=>true, ’grid’=>true)
１６ GGraph.tone( gphys.cut(’level’=>500), true,
１７’interval’=>5, ’clr_min’=>50,

１８’title’=>’Temperature (Jan, 500hPa)’, ’annotate’=>false )# 色範囲を変えて濃い色を避ける

１９ GGraph.contour( gphys.cut(’level’=>500), false, ’interval’=>5 )２０ #GGraph.color_bar# カラーバー（今回は非表示）

２１ # <下図>
２２ GGraph.set_fig(’itr’=>2, ’viewport’=>[0.25,0.75,0.12,0.52])
２３ GGraph.line( gphys.cut(’lat’=>35).mean(’lon’), true,
２４’exchange’=>true, ’title’=>’Temperature (35N Jan)’,２５’annotate’=>false )２６ DCL.grcls
今度は，数値計算プログラムを示します．４次元以上の列添字が０からはじまるのに合わせて，GPhys では次元をデータ中の第１，４次元についての２次元のパワースペク

０から数えることにしていますので，それぞれ０，３と表トルを計算し，NetCDF ファイルに出力します．Ruby の配

されます．

リスト３：

pw2D.rb１

require ”numru/gphys”

２include NumRu

３

def usage

４”\n USAGE: % ruby #{$0} filename variablename¥n”

５

end

６

filename = ARGV[0] or raise(usage)# 第１引数：入力ファイル名

７

varname = ARGV[1] or raise(usage)# 第２引数：FFT を掛ける変数名

８

GPhys::fft_ignore_missing(true, 0.0)９

# データ欠損は 0.0 で埋めることに（実際には欠損がない場合用）

１０ gphys = GPhys::IO.open(filename, varname)１１ pre = gphys.detrend(3).cos_taper(3)１２# ４次元目について，線形トレンド除去&cosine テーパリング

１３ sp = pre.fft(false,0,3).abs ** 2２２１

Journal of Plasma and Fusion Research Vol.84, No.4 April 2008

１４

# false は正変換（true は逆変換）．0,3==>第１，４次元で２次元 fft

１５ power = sp.rawspect2powerspect(0,3).spect_one_sided(3).spect_zero_centering(0)１６# パワースペクトルに単位と値を変換．時間について 1-sided に etc

１７ outfile = NetCDF.create(”pw2D_#{varname}.nc”)# 出力ファイル名（変数名入り）

１８ GPhys::IO.write(outfile, power)# 座標変数を含む全体を書出し

１９ outfile.close
本プログラムは，４行目から読み取れるように，ファイます．この例では，第１，４次元目は波数軸，それ以外は

ル名と変数名をコマンドライン引数で与えます．ともに必元の軸となります．なお，FFT 計算には FFTW3（http:/

須ですので，６，７行目では，引数がない場合は「例外」/www.fftw.org/）を用いており，任意長で計算できます．

（エラー）を発生して，使用法を表示して終了するようにしスペクトル解析を実践する上で面倒なのは，FFT そのもています（演算子 or は||と同じだが，=より優先度が低のよりも，上で示したような前処理，後処理や，波数軸もい）．１１行目では，第４次元目についてトレンド除去などの正しく出力するといったことでしょう．GPhys のように座前処理を行います．上記のような全球４次元データであれ

標軸も一まとめにすることで，これらの処理を自動化し，ば，第１次元目は経度でサイクリックなため，このような隠蔽できることがおわかりと思います．また，出力は，元前処理は不要なので省略しています．そのような知識に依データ同様に座標軸を含む NetCDF ファイルですので，リ存せず，より汎用なプログラムにするには，FFT を掛ける

スト１とまったく同様に簡単に描画できます．第４章で

次元や，それぞれについての前処理の有無を，引数で指定は，クラスを使う利点とメソッドチェーンの便利さが述べするようにすれば良いでしょう．さて，１３行目では，FFTられましたが，ここでも発揮されていることがおわかりでを掛け，絶対値を取って２乗します．メソッド fft は結果をしょう．

GPhys で返しますが，座標軸も正しく波数軸にして返すよGPhys に最初から組み込まれている数値計算メソッドはうになっています．単位も（ついていれば）正しく演算さ限られています．しかし，Ruby では既存のクラスにメソッ

れて，もとが m なら m−１などとなります（基本単位に分解

ドを自由に追加できます．次の例では，moment.rb というして演算できるライブラリも当プロジェクトで作っていまファイルに，平均の回りの n 次のモーメント計算する mo-す）．その後１５行目で生スペクトルからパワースペクトル

ment というメソッドを定義します．最初に numru/gphysに変換（定数倍）できるのも，このように座標情報があるを require していることで，追加定義になります．１０行目

からです．１５行目ではさらに，４次元目について one-sided

以降は，ruby moment.rb という形で呼んだときのみ実行にするなど，細かな後処理も行っています．最後にファイされる，テスト用のプログラムです．このファイルをライルに出力します．データの書き出し命令は１８行目だけです

ブラリとして他のファイルで利用するには，require ”

が，power という変数が表す GPhys オブジェクトには座標

moment”と記述します（.rb は省略する）．

軸が含まれますので，自動的に出力されるようになっていリスト４：moment.rb（メソッド追加例）
１

require ”numru/gphys”

２module NumRu

３

class GPhys

４# 平均の回りの n 次モーメント５

def moment(n, *dim)６( ( self - self.mean(*dim) )**n ).mean(*dim)

７

end

８

end

９

end

１０ ###### test program #####
１１ if $0 == __FILE__
１２

include NumRu

１３

raise(’need 3 or more args’) if ARGV.length<3

１４fnm, vnm, n, = ARGV

１５dims = ARGV[3..-1].collect{|s| s.to_i}

１６gphys = GPhys::IO.open(fnm,vnm)

１７

mmt = gphys.moment(n.to_i, *dims)

１８

p mmt

１９ end２２２

Lecture Note

5. Ruby for Geophysical Fluid Sciences

T. Horinouchi

５行目では，２番目の引数 dims の先頭に*がついていま

ここからは，数値データの取り扱いにかかる要素ライブ

す．これにより，メソッド moment の引数は一個以上の任ラリを見ていくことにします．拙稿［３］もご参照ください．

意個となります：最初の引数が n に渡され，２番目以降の数値計算に多次元配列はつきものです．Ruby 標準の配引数は配列にまとめられて dims に与えられます（一つし列 Array クラスは，第４章で紹介されたように高機能です

か引数がない場合，長さゼロの配列になる）．一方，メソッが，数値計算には必ずしも便利でありません．その観点でド呼び出しにおいては，６行目のように，配列に*を冠しの欠点として，１次元なので多次元にはネストなどの工夫て与えると，Ruby インタプリタによって展開され，全要素が必要，すべての要素を Ruby オブジェクトにするので要が引数の並びとなってメソッドに渡されます．この仕組み

素数が膨大になるときは遅い，演算子+が加算でなく配列により，可変個の引数を簡単に引き継ぐことができます．

の連結を意味するなど配列単位の数値演算が想定されていメソッド moment における「平均」とは，２番目以降のないということが挙げられます．これらを解決するのが，引数で次元を指定していれば，それらに沿ったものとなり非標準ながら Ruby における多次元数値配列のデファクト

ます．例えば gphys.moment(2, 0)と呼べば，第１次元

スタンダードであるNArray（http://narray.rubyforge.org/）（次元番号０）に沿った平均を引いた２次モーメント，つまです．NArray は，浮動小数点（単精度，倍精度），整数

り 第１次 元 に 沿 っ た 分 散 に な り ます．６行 目 の self -（１，２，４バイト）などに揃った型を持つ要素を納める，多self.mean(*dim)の部分は，次元数の異なるデータ同士

次元配列のクラスです．添字の順番は Fortran と同じコラの引き算となりますが，GPhys では次元に名前がついていムメジャーです．データは C のポインターを使ってメモリるため，対応を一意に解決して期待されるとおりの演算を上に連続した領域に納められますので，高速です．機能的行います．なお，引数を一つだけ（つまり n のみ）与えたは Fortran90 の配列とほぼ同等です．Ruby では，角括弧場合は，全データ点に関する単純平均が使われます．

[]をメソッドして自由に定義できますので，NArray では

１０行目以降のテスト部分も，簡潔ながら一定の汎用性を

これを要素へのアクセスやサブセット取り出しに使いま

確保しており，す．標準の Array 同様，添字は０からはじまり，負の要素
で後ろからの位置も指定できます（−１，−２はそれぞれ% ruby moment.rb filename varname n [dims..]

最後，最後から２番目の要素を指します）．以下に NArrayという形で呼び出せます．ただし，出力はファイルでなくの利用例を載せます（そのまま irb に入力すれば確認できま

おまかせで標準出力に出すだけです（１８行目）．

す．）

数値配列
NArray の利用例
require ”narray”
include NMath# NArray 対応 Math ライブラリ

na = NArray.float(4,3,2).random!

# ４×３×２の配列を作り乱数代入

nb = na[true,1..-1,0]# 各次元につき［全選択，２番目〜最後，１番目］の切出

nc = sin(nb)**2 * cos(nb)# 要素毎の演算

nd = na.mean(0,1)# ０，１次元目に沿った平均

na[0,false] = na[-1,false]# 最初の次元の最後の要素を最初の要素に代入#（false は任意個の次元の全選択）

m = NMatrix[ [1.0,2.0], [3.0, 4.0] ] # ２×２の行列 M
y = NVector[ 1.0, 1.0 ]# 長さ２のベクトル y

x = m.lu.solve(y)# LU 分解して Mx＝y を解く

データファイルの形式と扱いはしておらず，主に次のような形式が用いられています．

地球流体分野で扱うデータは主に数値データです．しかし，多くの分野でそうでしょうが，単純な生のスカラ値で・NetCDF：米国の UCAR という機関で開発されている済むことは稀で，複数の物理量や計測値が，名前や単位，形式です．内部構造は隠蔽され，多言語で用意された座標（時間，空間 etc）に関する情報と合わせて提示される専用 API を通じて読み書きします．ファイル中に存在ことではじめて完結することが普通です．もしも，データするのは，多次元（ゼロ次元スカラも含む）の「変数」，の作成者が各々自己流でデータ構造やファイル形式を定義

変数の各次元の長さを表す「次元」，

すると，流儀には際限がありませんので，他人から貰ったのメタデータを格納する，名前と値の組からなる「属データを満足に扱うためには，まず，データを計算機に読性」です．座標軸をどう表現するか，「属性」で物理量込ませるだけで大仕事となりがちです．これでは，データの単位やデータ欠損をどう表現するかの規約が存在す

交換に支障がありますので，我々の分野では，データ形式

るため，ファイルが機械的に解釈できる「自己記述」的の標準化が進められています．ただし，一つの形式に収斂

なデータ形式となっています．大学・研究機関で広く
２２３変数やファイル

Journal of Plasma and Fusion Research Vol.84, No.4 April 2008

用いられています．
・GRIB：世界気象機関が定める，気象予報機関のデー
タ交換やデータ公開のための形式です．各レコードが水平２次元断面を納め，時系列や高度を含む３，４次
元データはその集合体として表現されます．座標系や座標軸，物理量の種類，圧縮等に関するフラグが詳細に定められており，気象予報に関わるデータを広くカバーします．
・HDF/HDF5：NetCDF と似ていますが，より複雑なデータ構造をカバーします．反面，統一的な「自己記述」性には劣ります（NetCDF 的な標準もあるがあまり使われていません．利用者がそれぞれの仕方で自己記述的にはできますが）．人工衛星データの提供で使われることが多いです．最近の衛星データ提供では，
自己記述性を高める標準化を行った規約 HDF-EOS が用いられることが増えてきました．
・GrADS：バイナリデータに簡単なヘッダーを付したものです．経度‐緯度‐高度‐時間のデータに限られます（高度軸，時間軸がないのは可）．
多次元データは一般に量が大きいので，以上いずれもバイ
図３ナリです．一方，テキストで表される比較的小さな計測

GPhys オブジェクトの構成概略．

データについては標準がなく，未開の荒野になっています．

（実装は連想配列ベース）で構成できます．一方，NetCDF

上記のバイナリ形式は，互いに大きく異なり互換性があなどのファイル中の多次元配列を直接指し示すものでもありませんが，データを構成する論理的な要素には共通性がり得ます（その場合数値データはメモリー上には持ちませあります．それは，何らかの多次元空間をサンプリングしん）．このため，ファイル中の変数も，それを読み込んで演た物理・化学量に関する数値データであり，名前や単位，算した結果（メモリ上のみに存在する）も，同じ枠組みで座標を持つということです．そして，形式は違えど，それ扱われます．さらに，VArray は，他の VArray のサブセッらの解釈を自動化できるということも共通です．ただし，

トへのマッピングでもあり得ます．リスト１で使用した

HDF に関しては，HDF を使うというだけでは機械的解釈

データ切り出し命令 cut は，サブセットマッピングを作る性が保証されないので，汎用には扱えませんが．なお，宇だけです．よって，その時点でデータ読込みは発生しませ宙プラズマのシミュレーションにおいては，HDFは広く用ん．データ読み込みを，実際に必要になったとき（可視化

いられているようです．

する，数値演算するなど）まで遅延するというのは，GPhys

さて，オブジェクト指向言語を用いれば，上で述べたよの大きな設計方針です．例は示しませんが，処理を自動的うな論理的，あるいは概念的な共通性を活かして，データに分割するイテレータなども備えており，大規模なデータ

形式・構造の違いを乗り越えて，「同じことをするプログの処理に耐えるように作られています．

ラムは同じに書ける」ようにできます（同じように書ける

GPhys には座標の概念があるものの，基本的には多次元ではなく，同じに書けるです）．GPhys は，それを体現した配列です．このため，四則や数学演算，サブセット切り出ものとなっています．

し（[]メソッド）などが定義されています．API の仕様はGPhys の実装

NArray と統一してありますので，NArray の演算に使う

GPhys オブジェクトは図３のような構成を取っていま

ソースコードは，多くがそのまま GPhys でも使えます．

す．主となるデータは一般に多次元で，その格子の各次元

GPhys は複数のファイル形式に対応します．例えば，リの「軸」は一般に一次元です．標準的には，各軸は何らか

スト１の６行目の GPhys::IO.open という GPhys のコンの座標に対応しますが，そうでない場合も扱えるように

ストラクタが行うことは，次のようになります．

なっています．主データも座標データも，VArray というクラスのオブジェクトで表されます．VArray は Virtual・ファイル形式を判別し，それぞれのファイル形式用のArray の略であり，「事実上」数値の配列と見なせるものを

入出力モジュールの open メソッドに処理を委譲す

包括的に扱います．ただし，それぞれに名前（上の例ならる．

air など）がつき，NetCDF 同様にキーワード属性を持てる

・各モジュールの open メソッドは，それぞれの形式のというところが異なります．VArray オブジェクトにおけ流儀に則って，ファイルの内容から図３の構造を構成るデータ実体は，NArray，名前の文字列，キーワード属性

する．ただし，数値データは読み込まず，ファイル中
２２４

Lecture Note

5. Ruby for Geophysical Fluid Sciences

T. Horinouchiの変数へのポインターだけを確保するのが標準の動作た形で作ることになるでしょう．ただし，ソースレベルでである（読み込むことも可）．

C に変換すれば，移植性は確保できます．DCL の Ruby
版は，FORTRAN ソースを C に変換したものを使うことでこのように構成されているため，データの概念的な構成が移植性を確保しています．

GPhys のデータモデルに合致する限り，ファイル形式に関

５．
４ Ruby でひろがる世界

わらず扱えます．例えば，第３章の例で用いられた時系列

世界中で，Ruby のための様々なライブラリが開発され，のテキスト形式のデータを当てはめることも可能でしょう．

オープンソースで公開されいて自由に利用できます．この拡張ライブラリについてため，グラフィカルユーザインタフェース（GUI）を持つプ

ここで，C や Fortran のライブラリを，Ruby から利用す

ログラムや，Web ベースの高度なサービスなどを実現できるための「ラッパ」（wrapper）を作成して，「拡張ライブラ

ます．また，ソースのドキュメンテーションにおいても，リ」として利用することについて述べます．あわせて，数役に立つツールがあります．

値計算に関する代表的な拡張ライブラリを紹介します．

RDoc によるドキュメント生成

Ruby は C で実装されています（Java での実装もありま

Ruby には，RDoc というドキュメンテーション生成ツー

すがここでは扱いま せ ん）．Array や Hash な どの Ruby

ルが標準添付されています．RDoc は，Ruby のソースコーの組み込みクラスは C で書かれており，標準添付ライブラ

ドを解釈し，プログラム要素間にリンクが張りめぐらされリの多くも C で書かれています．Ruby の拡張ライブラリ

たドキュメントを生成します．ドキュメントの形式は，の作者は，C で書かれた組み込みクラスが Ruby で利用でhtml のほか，ri というコマンドラインツールで表示できる

きるようになっている仕組みを，そのまま利用できます．

形式が選べます．RDoc は，ソース中の各要素（クラス，メ

このため，Ruby 本体と同じ移植性を持つ拡張ライブラリ

ソッドなど）の直前に書かれたコメントを，それぞれのドを容易に作成することができるのです．拡張ライブラリをキュメンテーションと解釈します．RDoc のコメント文の導入する際，インタプリタ本体の再コンパイル必要はあり

書き方は直感的で分かりやすく，簡単に見出し文や，箇条ません．Ruby の実行速度は，C に比べればはるかに遅いで書き，コード引用などが行えます．例として，本稿で紹介

すが，処理のボトルネックは拡張ライブラリにすることでした４つのソースコードに，次のように RDoc を掛けた結改善できます．上述の NArray は C で書かれた拡張ライブ

果を，図４に示します．

ラリです．

% rdoc --charset sjis --inline-source global_

既存のライブラリを Ruby から利用するラッパをつくる

temp.rb global_temp2.rb moment.rb pw2D.rb

場合，比較的小さなライブラリであれば，直接コーディン

GUI ツール，３次元描画ライブラリ

グしやすいですが，大規模なライブラリの場合は，SWIGというラッパの自動生成ツールが役立ちます．SWIG では

Ruby では，Tk，Gnome（Gtk），Fox など，様々な GUI

C＋＋ライブラリのラッパも作成できます．
科学計算に有用な拡張ライブラリとして，GNU
tific

ツールが利用可能です．これらをDCLなどの描画ライブラ
Scien-

Library（GSL）という巨大な数値計算ライブラリをRuby から使えるようにした Ruby/GSL が挙げられます．
GSL は，データ保持に独自仕様の構造体を多用します．
Ruby/GSL では，それぞれに対応するクラスが定義されているのに加え，多くが NArray に変換できるため，他のラ
イブラリと容易に組み合わせて使えます．GSL 以外にも Cで書かれた数値計算ライブラリのラッパが多く公開されています．
Ruby では，Fortran で書かれたライブラリのラッパを作ることもできます．ラッパ自体は C で書く必要があるた
め，C との互換性が明白な，FORTRAN７７でも使えるデー
タ構造が，直接のやり取りの対象になります（ライブラリ
内部で Fortran90 の構造体等を使うことは可能です）．ただし，Fortran で書いた拡張ライブラリの移植性の確保は，次の理由により，簡単ではありません．Fortran コンパイ
ラでは，実行ファイル生成時に標準ライブラリへのリンクを行います．ところが，Ruby ラッパ生成には，リンカとして C コンパイラを用いますので，Fortran コンパイラがリンクする標準ライブラリを陽に教える必要があります．こ

図４

れを一般的に行うことは難しいので，コンパイラを限定し
２２５

本稿で紹介した４つのソースコードを元に RDoc で生成した html をブラウズした例．

Journal of Plasma and Fusion Research Vol.84, No.4 April 2008

図５

GUI ツール gave のスクリーンショット．
http://ruby.gfd-dennou.org/products/gave/gave.png を白黒に変換．

リと組み合わせて使うことで，マウス操作で描画できるで素早く Web アプリケーションが開発できる驚異的なツールが作れます．図５は，京都大学の西澤誠也氏が作っツールで，今や，世界で Ruby 利用者が増える原動力とた Gtk ベースの GUI ツール Gave のスクリーンショットでなっています．Ruby on Rails では，データを関係データ

す．Linux はもちろん，Windows でも動作します．データ

ベース（RDB）に保存します．Mysql，PostgreSQL，DB

アクセスには GPhys を用いていますので，複数のファイル

2 など，商用，非商用を問わず，多くの RDB マネジメント

形式に対応します．Gave は，多次元のデータを，様々な断システム（RDBMS）
が使えます．また，Rails を使うと，ア

面表示やアニメーションにより，初期的に「把握する」のプリケーションに専用 Web サーバが導入されますので，に役に立ちます．また，GUI で行った描画を再現する Ruby

Web サーバを運用しない個人の PC でも，手軽に Web ベープログラムを生成することもできます．

スのアプリケーションが動かせます．もちろん，Apache

西澤氏は，三次元描画ライブラリ Vtk の Ruby ラッパもなどの標準的な Web サーバでも動作します．そのおかげ開発しています．三次元可視化の場合は，視点の移動など

で，Gfdnavi は，個人が自分のデータの管理・解析・可視を自由に行うためにGUIツールと組み合わせることが欠か化に用いるのに適する一方で，常時運用されるWebサーバ

せませんが，Tk や Gtk などで実装できます．

上でデータ公開を行うのにも適したものとなっていますWeb ベースのデータベース・解析・可視化ツール Gfdnavi（人工衛星による降水観測データ公開などに使われ始めて

２００６年より，筆者，西澤氏および，お茶の水大の渡辺知います）．Rails には，Google Map で使われて一躍有名に

恵美氏（専門は情報学，データベース）を中心とするグルーなった，非同期 http 通信 Ajax を，Ruby から容易に使える

プで，新しいツール Gfdnavi を開発しています（http://

ようにしたライブラリも含んでいます．Gfdnavi はこれを

www.gfd-dennou.org/arch/davis/gfdnavi/）

多用しており，応答待ちで操作が中断されないようになっ［４］．これは，上述の GPhys と，Ruby on Rails（http://www.

ています．

rubyonrails.org；以下 Rails）という開発フレームワークを

図６（上）に Gfdnavi の構成概略を示します．利用者は，用いて作成した，Web ベースのアプリケーションです．

Web ブラウザにより Gfdnavi サーバにアクセスします．

Gfdnavi は，地球流体データのデータベースを作り，Web

データ本体はディスク上の NetCDF ファイル等ですが，そブラウザで検索，解析，可視化できるようにします．

の内容に関する情報（メタデータ）は RDB に登録されていRails は，Ruby の柔軟性を最大限に活かし，短いコード

ますので，検索や内容ブラウジングへの対応はRDBベース
２２６

Lecture Note

5. Ruby for Geophysical Fluid Sciences

T. Horinouchi

ポートされています．そのほか，テキストや時空間の範囲などからの検索も行えるようになっています．
データ選択後は，簡単な数学統計処理や可視化を行うことができます．それを元に，手元で描画などを改良できる
よう，ブラウザで行った処理を再現するスクリプトと，そのために必要なデータを最小限に切り出したものがダウンロードできるようになっています．また，行った可視化をサーバ上で再現するパラメタ付の URL の取得もできます．
こちらは，研究者間での情報交換に役立ちます．Gfdnaviには，ユーザーの概念もあり，登録ユーザーはデータ処理のための Ruby メソッドを登録することができます．また，処理結果をデータベースに保存できます．他にも様々な機能があります．
現在，データから見いだした知見を文書化し，データ解析手法ととともにデータベース化できるようにする開発も行っています．また，複数の Gfdnavi サーバを横断的に検索・利用できるようにするための研究・開発も進行中です．
以上のようなアプリケーションを，ソフト開発を本務としない者が少人数で開発するのは，一般には難しいでしょう．Ruby という生産性の高い言語と，Rails という優れたツールがあってこそのことと思います．

５．
５ おわりに本稿では，地球流体科学における Ruby の利用ということで，地球流体電脳倶楽部というフォーラムを舞台に開発・公開されている，データ解析・可視化用のライブラリや
図６

上：Gfdnavi の構成概略とアクセスの流れ．下：メタデー
タデータベースのもとになるディレクトリ階層の模式図．

アプリケーションを紹介しました．何らかの参考になりましたら，そしてあわよくば，さらなる情報交換や開発協力
等に発展させられたら望外の喜びです．

で行い，データ選択後の解析・可視化操作への応答は，

参考文献

GPhys を使って直接データファイルを対象に行うことにな
ります．

［１］林 祥介：天気 42, 548 (1995).
［２］B. Meyer, Object-oriented software construction 2nd ed.
(Prentice Hall, 1997).
［３］堀之内 武：数値計算と可視化，Ruby Library Report(2005), http://jp.rubyist.net/magazine/?0006-RLR.
［４］堀之内 武，西澤誠也，渡辺知恵美，森川靖大，神代剛，石渡正樹，林 祥介，塩谷雅人：電子情報通信学会
第１８回データ工学ワークショップ論文集，D2-8 (2007).

Gfdnavi のメタデータ登録は，自動登録スクリプトによって行われます．同スクリプトは，指定されたトップ
ディレクトリ以下のすべてのデータファイル中のデータを，ディレクトリ構造も含めてデータベース化します（図６下）．これも GPhys を使いますので，複数のデータ形
式を統一的にサポートします．ディレクトリ構造がデータベース化されているため，Gfdnavi のデータ選択インタ
フェースでは，MS Explorer 風のディレクトリツリーがサ２２７