[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:002307] GPhys 0.5.0 released



堀之内です.

多次元格子点データ取り扱いライブラリー GPhys をバージョンアップ
しました(ver 0.5.0):

  http://ruby.gfd-dennou.org/products/gphys/

今回の主な改訂は以下のようになります:

  (1) 遠隔データアクセスのための,gphys-remote
      (http://ruby.gfd-dennou.org/products/gphys-remote/) 
      の取り込みと改良.(gphys-remote は今後は GPhys パッケージ
      の一部としてメンテされます.)
  (2) ファイル取り扱いの改善とデバグ.(Grib, GrADS, NetCDF全てに
      関してです)
  (3) 可視化ライブラリー GGraph の改良.

特に,(1) は,私としては目玉と思ってます.gphys-remote パッケー
ジには,ローカルなファイルシステム上の任意のディレクトリーを起点
とするディレクトリーツリーを扱うためのクラス GDir というのが入っ
ています.遠隔アクセスはこれを druby のフロントエンドにすること
で実現しているわけですが,GDir はローカルデータの扱いにも便利な
ので,現在私自身はローカルデータもリモートデータも共に GDir を使っ
て(従ってほとんどおんなじ具合いに)アクセスしています.特に irb 
を使って対話的に処理する場合に便利です.

遠隔データの解析可視化は今のところ,シングルユーザー用になってま
す.ファイヤウォールを越えるためには ssh のポートフォーワーディ
ングを使います(-L オプションを使って ssh コネクションをはる).

こいつの使い方を示すため,チュートリアルをアップデートしようと思っ
てますが,基本的には下のような具合いになります(すみません,長い
です).

=GDirの利用1(ローカルデータアクセス)

==準備

irb 用スタートアップファイルを作ります(作らなくてもいいですが,
作った方が楽です).私は,普段の irb とは別にするため,

   ~/.irbrc_ggraph.rb

というファイルを用意し,下記のように alias してます.

   alias irb_ggraph   "irb -r $HOME/.irbrc_ggraph"

このため,下記のように起動します.

   % irb_ggraph

=== ~/.irbrc_ggraph.rb の中身

私が使ってるのを下に示します.
その中で今の話に関係があるのを先に解説します.

  GDir.top='/'      # GDir用トップディレクトリーの設定.ここでは
		    # ファイルシステムのroot directoryにしてます.
		    # GDir.top='.' など,好きなように設定してください.
  GDir.cd(Dir.pwd)  # とりあえずカレントディレクトリーに cd しておきます.
		    # 上で GDir.top='.' とするなら要りません.


  def pwd; GDir.pwd; end   # 単に pwd と入れると,GDir の現在のディ
			   # レクトリーを表示します.

同様にして,ls, ls_l (==dir), cd, open (==data), open_all_data を
irb セッションのトップレベルで定義します.

では,全文です:

  % cat .irbrc_ggraph.rb
  print "Start interactive GGraph session\n"

  require "numru/ggraph"
  include NumRu
  include GGraph

  GDir.top='/'
  GDir.cd(Dir.pwd)
  def cwd; GDir.cwd; end
  def pwd; GDir.pwd; end
  def ls(path=nil); GDir.cwd.ls(path); end
  def ls_l(path=nil); GDir.cwd.ls_l(path); end
  alias dir ls_l
  def cd(path); GDir.cd(path); end
  def open_all_data; GDir.cwd.open_all_data; end  # --> Hash of GPhys objs in cwd
  def data(path); GDir.cwd.data(path); end        # --> GPhys
  alias open data

  DCL.swpset('iwidth',700)    # 適宜変える
  DCL.swpset('iheight',700)    # 適宜変える
  #DCL.swpset('ldump',true)
  DCL.swpset('lwait',false)   # don't wait mouse click to show the next page
  #DCL.swpset('lalt',true)     # background plot
  DCL.sgscmn(10)  # set colomap (下記メモ参照)

  DCL.gropn(1)
  DCL.sgpset('lfprop',true)   # to use the propotional font
  DCL.sgpset('lcorner',false)
  DCL.sgpset('isub', 96)      # control character of subscription: '_' --> '`'
  DCL.glpset('lmiss',true)

  # メモ書き
  # カラーマップ番号
  #  01: dcl_original
  #  02: black-orange-yellow-white
  #  03: black-blue-cyan-white
  #  04: blue-cyan-white-yellow-red
  #  05: gray_scale
  #  06: pastel_rainbow
  #  07: black-rainbow-black
  #  08: white_yellow_red
  #  09: white_blue_black
  #  10: short_green_original
  #  11: black-rainbow-white
  #  12: pink-rainbow-pink


==利用の実際

参考までに gphys の配布ディレクトリーで実行した場合です.
デモ用にプロンプトを変えるため,alias された irb_ggraph を使わず
直接呼びました.

  % cd gphys-0.5.0
  % irb -r $HOME/.irbrc_ggraph --simple-prompt

  Start interactive GGraph session
   *** MESSAGE (SWDOPN) ***  GRPH1 : STARTED / IWS =  1.                         
  >> ls
  Directories:
    'bin/'
    'doc/'
    'lib/'
    'sample/'
    'test/'
    'testdata/'
  Text files?:
    'ChangeLog'
    'README'
    'TODO_ep_flux'
  => nil
  >> ls_l
  Directories:
	   512  Jun 06 12:03 bin/
	  1024  Jun 06 12:03 doc/
	   512  Jun 06 12:03 lib/
	   512  Jun 06 12:03 sample/
	   512  Jun 06 12:03 test/
	   512  Jun 06 12:03 testdata/
  Text files?:
	 38396  Jun 06 12:00  ChangeLog
	   511  Jun 23  2003  README
	   117  Feb 16 15:55  TODO_ep_flux
  => nil
  >> cd  'testdata/'
  => /am/murtmp/horinout/gphys-0.5.0/testdata/
  >> ls
  Directories:
    'T.jan.ctl/'              # NetCDF等のデータファイルが
    'T.jan.grib/'             # ディレクトリー扱いになることに注意
    'T.jan.nc/'
    'T.jan.packed.withmiss.nc/'
  => nil
  >> cd 'T.jan.ctl/'
  => /am/murtmp/horinout/gphys-0.5.0/testdata/T.jan.ctl/
  >> ls
  Data:
    'T'
  => nil
  >> ls_l                 # ls_l は ls -l 相当.変数なら形などを表示
  Data:
    T     [x=36,y=19,z=9,t=1]     'Temperature                    degC'   (1)
  => nil
  >> temp = open 'T'
  => <GPhys grid=<4D grid <axis pos=<'x'  [36]>>
	  <axis pos=<'y'  [19]>>
	  <axis pos=<'z'  [9]>>
	  <axis pos=<'t'  [1]>>>
     data=<'T'  [36, 19, 9, 1]>>
  >> tone temp                   # これで図が表示される.
  => nil
  >> cd '..'
  => nil
  >> ls 'T.jan.nc/'
  Data:
    'lon'
    'lat'
    'level'
    'T'
  => nil
  >> temp2 = open 'T.jan.nc/T'
  => <GPhys grid=<3D grid <axis pos=<'lon' in '//am/murtmp/horinout/gphys-0.5.0/testdata/T.jan.nc'  sfloat[36]>>
	  <axis pos=<'lat' in '//am/murtmp/horinout/gphys-0.5.0/testdata/T.jan.nc'  sfloat[19]>>
	  <axis pos=<'level' in '//am/murtmp/horinout/gphys-0.5.0/testdata/T.jan.nc'  sfloat[9]>>>
     data=<'T' in '//am/murtmp/horinout/gphys-0.5.0/testdata/T.jan.nc'  sfloat[36, 19, 9]>>
  >> tone temp2                   # これで上と同じ図が表示される.



=GDirの利用2(遠隔データアクセス)

今度は遠隔データアクセスです.そのためには,サーバーを立ち上げる
必要があります.必要なサーバー及びクライアントのコマンドは,
GPhys と共にインストールされます.

==サーバー立ち上げ

今度は先ほどのディレクトリーをトップディレクトリーとしてサーバー
を立ち上げてみます:

kterm その1
  % cd gphys-0.5.0
  % gdir_server . -a all    
        # -a all は任意のホストからのアクセス受け付け(ちょっと危険).
        # デフォルトはローカルのみ.他にも port 番号などを指定できる.
  URI: druby://horihost0:39708
  [return] to exit

        # サーバーURL(今回はdruby://horihost0:39708)を表示して待つ.
        # ポート番号を指定しなかった場合は,適当な空きポートを使う.
        # 今回は 39708 になった.

kterm その2(マシンは同じでも違っても良い)
  %  gdir_client
  ** A GPhys service client. To conetct, type in server's URI(return)
     (format: druby://host:port). Type in help to see usage.
  URI>> druby://horihost0:39708
     # ここに上の URI を入力

すると以下のメッセージが出て,セッション開始:
  ***************************************************************
  *                          WELCOME!
  *
  *  You logged in druby://horihost0:39708 
  *  with /usr/local/lib/ruby/site_ruby/1.8/numru/gdir_connect_ftp-like.rb: 
  *  an irb-based ftp-like client of a gphys service (such as gdir_server.rb).
  *
  *  This client is to be started as
  *
  *    % irb --noinspect -r "numru/gphys_connect_ftp-like"
  *
  *  if you are running on a interactive ruby shell such as irb,
  *  quit and start again like this.
  ***************************************************************

  Type in
    help
  for available methods 

以下,ローカルの場合と(ほぼ)同じようにすすめる.

  irb(main):001:0> ls_l
  Directories:
	   512  Jun 06 12:03 bin/
	  1024  Jun 06 12:03 doc/
	   512  Jun 06 12:03 lib/
	   512  Jun 06 12:03 sample/
	   512  Jun 06 12:03 test/
	   512  Jun 06 12:03 testdata/
  Text files?:
	 38396  Jun 06 12:00  ChangeLog
	   511  Jun 23  2003  README
	   117  Feb 16 15:55  TODO_ep_flux
  => nil
           # サーバー側のディレクトリーが表示されていることに注意

  irb(main):002:0> cd 'testdata'
  /testdata/
  => nil
  irb(main):003:0> ls_l
  Directories:
	   423  Sep 16  2003 T.jan.ctl/
	 13167  Mar 10 13:03 T.jan.grib/
	 26664  Aug 28  2003 T.jan.nc/
	 13716  Mar 10 10:38 T.jan.packed.withmiss.nc/
  => nil
  irb(main):004:0> cd 'T.jan.nc'
  /testdata/T.jan.nc/
  => nil
  irb(main):005:0> ls_l
  Data:
    lon   [lon=36]        'Longitude'     (degrees_east)
    lat   [lat=19]        'Latitude'      (degrees_north)
    level [level=9]       'Level' (millibar)
    T     [lon=36,lat=19,level=9] 'Temperature'   (degC)
  => nil
  irb(main):006:0> start_dcl   
       # DCLは陽に開始する(ここが唯一の違い)
       # start_dcl の中身は,上の irb_ggraph における DCL の設定
       # と似たような感じになってます.これを使わず DCL.gropn し
       # て構いません.
   *** MESSAGE (SWDOPN) ***  GRPH1 : STARTED / IWS =  1.                         
  => nil
  irb(main):007:0> temp = open 'T'
  => #<DRb::DRbObject:0x40899fb4 @uri="druby://horihost0:39708", @ref=541953932>
     #^^^ 遠隔オブジェクトなので,こんな風に表示される.
  irb(main):008:0> tone temp  # これで図が表示される.めでたしめでたし.
  => nil