flat7th

+ 文字でもグラフィックでも返せるコマンドシェル

created 2011-06-22 modified 2011-11-24 

文字でもグラフィックでも返せるコマンドシェル、についてのアイデアメモ。

zebraの例


zebraという、CISCOルータのようなソフトウェアルータを作れるソフトがあります。これは本当に良く出来ているソフト。商用版はZebOSなんだけど、基本思想はzebraでできあがってるので、今日の話ではとくに区別しません...。

ルーティングプロトコルは複数ある(ripとかbgpとか)ので、プロトコルによってデーモンを複数に分割している。
それぞれのプロトコルデーモンは、CISCOルータのようなコマンドをそれぞれ(専用のTCPポート番号で)受けることができるんだけど、CISCOルータでは、いろんなプロトコルのコマンドを、別にtelnetしなおさなくても打てる。
zebraでも、複数のデーモンに役割分担されているコマンド群を、一括して引き受けてくれるシェルデーモンがいる。


1.1 のコマンドが、デーモンXの分担である場合、
1.2 には 1.1 と同じ内容が流れます。
2.1 デーモンXは、コマンドの処理を実行し、コマンドの応答をシェルデーモンに返す。
2.2 シェルデーモンは、それをそのままクライアントへ返す。

コマンドがYの分担のものだった場合、XでなくYへ流れて以下同様。

ここまでが前提のハナシ。

文字でもグラフィックでも返せるコマンドシェル

最近、コマンドシェルの結果をグラフィックで返す、というシェルが某ブログやツイッターで話題にあがった。
んでも、こういうのって別に最近考えられたことじゃなくて、昔からある。

Mathematicaは、コマンドシェルの形式でインタラクティブに計算をすすめることが出来て、計算結果が分数やら、数学記号やらを含むものになることがある。
文字しか表示できないダム端末から利用した場合は、分数やら数学記号やらをアスキーアートで表示してくれる。
グラフィックが表示できる端末から利用した場合は、分数やら数学記号やらをグラフィックで表示してくれる。

(図 ... を入れたいが、Mathematica持って無いので無理です)


別の例で、これを、CISCO型のコマンドシェルに当てはめるとこんな感じになる。

文字しか表示できない端末から利用した場合:


show usedrate というコマンドが、なんらかのリソース使用量を表示するコマンドであるとする。
CUIだと、コマンド結果は数字で出すか、古き時代のラインプリンタグラフのごときアスキーグラフで出すしかない。

グラフィックが表示できる端末から利用した場合:


show usedrate というコマンドに対し、グラフを表示してくれる。
と、こんなつくりのソフトがあってもいい、という話。

さて、どうつくればいいかな


ここからが、オイラの本日の日記。

zebraのように、末端のデーモンがコマンドレスポンスイメージを返してしまっては、それをグラフィックに変換するのは至難の業だ。至難ってほどじゃないかもだけど、面倒だし汚いソースになるのがみえみえ。

こういうソフトの場合、末端のデーモンは、レスポンスデータが格納されたメモリオブジェクトをそのまま返せればうれしい。んでも、それをTCP上でどうやって返すの?SUNのRPCやらDCEのRPC、あるいはCORBAやDCOM?面倒くせぇ、となる。
なら、XML?うーむ。XMLはペインオブアスホールだ、とおっしゃった方がいますが、私も賛成。
そこで、

XMLまでいかなくてもJSONならアリじゃね?

というのが本日の思いつき。






最近じゃ node.js とか、V8とか、javascript をCで作る独自プログラムに組み込めるようになってるようだから、もしかしたらJSONの解析とメモリオブジェクト化も簡単じゃないかと...って
わー、もう3時回ってる。
もう寝ないと。

なお、zebraはlibeventよりだいぶまえから、libeventと同じ方式のイベントループ型プログラミングをやっていて、わたしはその方式をzebraっていうかZebOSから教えてもらいました。
タイマを何百個つくろうが、実際に待つのは先頭の1個だけでよい、と知ったときには、目からいろんなものがはがれましたよ。