Ruby/Tk - FrontPage  Index  Search  Changes  PageRank  RSS  Login

Ruby/TkORCA

( There is a download link of Ruby/TkORCA at end of this page. )


「どこでも GUI! (GUI, Anywhere!)」


それが Ruby/TkORCA (るびー・てぃーけー・おるか; Ruby/Tk On RFB Canvas) のコンセプトです (プレゼンテーション資料のページには, 一部の発表について,その発表資料が置いてありますので, 良かったら参照してください).

「ローカルのウィンドウシステム用に作成していた GUI アプリケーションを別のマシンからリモートで使えるようにしたいな」などと思ったことはないでしょうか?あるいは,「研究などで作成したマルチウィンドウの GUI を持った実験システムをデモシステムとして不特定多数に公開したいけど,秘密となるプログラムやデータは一切見せたくないし…」などということはないでしょうか?もしかすると,こうしたケースで泣く泣く根本からアプリケーションを作り直したという人もいるかもしれません.

「そんなもん,最初から Web でも使うように作っときゃいいじゃないか」とか,「そういう時は普通 Ajax でしょ」という意見もあるでしょう.でも,本当にリモートから使いたくなるか分からない段階から,制約の多い Web アプリケーションとして作りたいでしょうか?そのためだけにわざわざ Web サーバを立ち上げて,重たいブラウザを動かして使うようにしたいでしょうか?手元に有用なライブラリがあるのに,苦労して Javascript で作り直したりしたいでしょうか?

Ruby/TkORCA は,「そんな面倒なことはしたくない」と感じる人のためのフレームワークです.気軽にローカル用に作成した GUI を,ソースの変更もほとんど必要なく,操作性もそのままに,手軽にリモートアクセスできるようにします.

例えばこんな(↓)マルチウィンドウのアプリケーションが

pendulum2.png

こんな(↓)感じになります.

rubytkorca-pendulum.png

「それなら VNC をつかえば?」という人もいるでしょう.でも VNC の一般的な利用方法では,「信頼できない不特定多数に」使わせるなど恐ろしくてできないですよね?

実は現在の Ruby/TkORCA (system level 0) は VNC と同様に RFB プロトコルを用いるアプリケーションでもあります.さらには,RFB プロトコルによる通信バッファ代りに Xvnc サーバを活用しています.「なんだ.単なる VNC か」と思われるかもしれませんが,VNC サーバは単なる通信バッファというレベルの扱いであり,通常の VNC の利用では必須となるウィンドウマネージャなどは動いていません.一人の利用者へのサービスを司るのは一つの Ruby/TkORCA プロセスです.その上に,Ruby/Tk アプリケーションを読み込んで安全に動かすための実行環境 (複数も可) とそのアプリケーションの動作状況を監視・制御する機構とが組み込まれています.これにより,ソースをほとんど変更することなく不特定多数への公開に耐えられるようにする仕組みを持たせています.

もし入出力のためにコンソールが必要であっても大丈夫です. Ruby/Tk のテキストウィジェットを使って作られたコンソールが用意してありますから,ターミナルソフトを動かしてシステムを危険にさらす必要はありません.もちろんシェルなどは全く動いていないので心配は不要です.コンソールを使うかどうかは,提供するアプリケーションごとにオプションで設定することができます.

system level 0 の Ruby/TkORCA は,「pure Ruby/Tk で汎用的なプロトコルのみを使う」という条件で構築しています.これは,クライアント側に専用のアプリケーションを導入しなくても利用できるようにするためです.同時に,サーバの立ち上げを手軽にするためでもあります.もちろんこの条件は機能実装上の制約にもなっていますから,将来的には条件を段階的に緩めて (独自プロトコルの導入など) 機能強化した system level 1 かそれ以上の system level の Ruby/TkORCA を構築する計画もあります.

Ruby/TkORCAに基づいて,Ruby/Tkアプリケーションをネットワークを介して利用できるようにする手順は,最も簡単には次のようになります.

  1. ローカルのウィンドウシステムで動くRuby/Tkアプリケーションを用意する or 作る (仮に"app.rb"という名前とします).GUIの最表層がRuby/Tkで作られているなら,どんな外部プログラムやライブラリを使っていても構いません(外部プログラムのセキュリティまでは保証できませんが (^_^;).
  2. テスト環境を用いてローカルのウィンドウシステム上で動作を確認 ("tkorca.rb app.rb"というように実行).セキュリティエラーが出る場合などは若干の修正等が必要になるかもしれません.
  3. サーバスクリプトでネットワークから利用可能にする ("tkorca_server.rb app.rb"というように実行).テスト環境での確認済みですので,安心して公開できるはずです (継続的にサービスを提供するなら,デーモンスクリプトも用意されています).

これだけでOKです.例えば,ボタンをクリックするとメッセージダイアログが出る程度の"Hello, World"プログラムなら,作り始めから公開まで3分もあれば十分でしょう.

1. 次のようなソース("/tmp/hello.rb")を作ります.

require 'tk'
TkButton.new(:text=>'hello', :command=>proc{
               Tk.messageBox(:message=>'Hello, Ruby/TkORCA !!')
             }).pack
Tk.mainloop
aaa-local.png

2. "tkorca.rb /tmp/hello.rb"などと実行して,動作テストを行います. aaa-localtest.png

3. "tkorca_server.rb /tmp/hello.rb"などとしてサーバを起動し,外部からアクセスします. aaa-viewer.png

↑↑↑ VNCviewerからの利用 aaa-browser.png

↑↑↑ Webブラウザからの利用 ( ブラウザからの利用のためには,別途Webサーバを立ち上げてページを用意する必要があります.)

サーバ管理者は,公開されたアプリケーションの動作状況の監視だけでなく,稼働中のアプリケーションに立ち入ってリアルタイムに操作することも可能です.例えば先の"Hello, World"の例で,サーバ管理者がボタンクリックを発生させたり,アプリケーションとは関係のないメッセージダイアログをアナウンスとして表示させたりできます.具体的にはこんな感じでコントロールできます.

$ telnet localhost 5941
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

*** Control Port of Ruby/TkORCA Server ***
Username: admin
Password:
Connect ...

Pod[5940]> list
--- list of current connections ---
ID[1]: connection ["AF_INET", 54592, "192.168.11.8", "192.168.11.8"] on display :1 from 2006-08-26 23:36:38
-----------------------------------
Pod[5940]> connect 1

ID[1]:0> TkORCA.daughter_list
=> {#<TkORCA::Daughter:0xb67b6018>=>"/tmp/hello.rb"}
ID[1]:0> daughter = TkORCDA.daughter_list.index('/tmp/hello.rb')
=> #<TkORCA::Daughter:0xb67b6018>
ID[1]:0> daughter.eval{ Tk.root.winfo_children }.value
=> [#<TkButton:0xb679cf8c @cmdtbl=["c00065"], @path=".w00014">]
ID[1]:0> daughter.eval{ Tk.root.winfo_children[0].invoke }
=> #<Thread:0xb6744bd4 run>
ID[1]:0>

この例では,ボタンをクリックした時の動作を強制的に起動しています.この操作に相当するメソッドを別ファイルで定義しておいて,アプリケーション起動時に同時に読み込んで利用可能にすることもできます.その他,特定の処理を実行したときにログに残したいとか特別な操作をしたいだとかの管理機能追加も,多くの場合,アプリケーションのソースをいじることなく外付けで実現することが可能です.既存のメソッドをwrapして監視を付与する (アプリケーションからは普通にメソッドを呼び出しているだけに見えます) のを簡単に実現するためのモジュールも用意されています.

この例では固定的に一つのアプリケーションだけを提供していますが,利用するアプリケーションを選択してもらった上で提供したり,同時に複数のアプリケーションの利用を許したりすることももちろん可能です.

インストールもお手軽です.

必要なのは,Ruby 1.8.5 以降 (Rub/Tk がきちんと動くこと.つまりはTcl/Tkも必要です.現時点ではまだ Ruby 1.9.x には対応していません) と, Xvnc サーバ (Tight VNC を推奨) です.いずれも特殊なパッチなどは必要なく通常のもので良いため,各 OS (ディストリビューション) 向けのパッケージなどを普通に導入しておくだけで構いません.

先に述べたように,system level 0 の Ruby/TkORCA 自体は pure Ruby/Tk で作られていますので,コンパイルなどは必要ありません.展開したファイルを適当な場所に持っていけば終わりです.

なお,Ruby/TkORCA自体はRFBプロトコルによる通信をsecureにする機能は持っていませんが, VNC over SSL/SSHを実現するstunnelなどのツールを使うことで容易に通信経路をsecureにすることができます (SSLでの受け付けポートを公開して,サーバ内でRuby/TkORCAのポートに転送してやるように設定するだけです). VNC over SSL/SSHに対応したクライアントも世の中に複数存在 (ブラウザで動くJavaアプレット版もあり) していますから,好みのものを使ってもらえばいいでしょう.

下記のリンクから,system level 0 のβ版の Ruby/TkORCA を入手できます.ただし,リンク先のものは Tcl/Tk8.5 への対応に関して不完全な部分がありますから注意してください.とりあえずは Tcl/Tk8.4 で試してもらう方が無難かと思います.

  Ruby/TkORCA download → RubyTkORCA-beta20080525-2.tar.gz

あとは展開したファイル群に含まれるドキュメントを参照してください.ただし,残念ながらドキュメントは十分なものではありません.分からないことは ML で私 (永井;nagai@ai.kyutech.ac.jp) にお尋ねください.

Last modified:2009/08/31 00:12:05
Keyword(s):[Ruby/TkORCA] [Ruby/Tk]
References:[Ruby/Tk - FrontPage] [プレゼンテーション資料] [SideMenu]