Annotation of OpenXM/doc/genkou19991125.tex, Revision 1.92
1.1 tam 1: \documentclass{jarticle}
2:
1.92 ! tam 3: %% $OpenXM: OpenXM/doc/genkou19991125.tex,v 1.91 1999/12/25 15:57:31 tam Exp $
1.51 ohara 4:
1.52 tam 5: \usepackage{jssac}
1.91 tam 6: \title{OpenXM の現状について
1.82 tam 7: 1. 意味もない修飾過剰な語句は排除しましょう. \\
8: 2. せっかく fill しているのをいじらないでくれ. \\
9: 3. 田村が遊んでばかりでおればかり仕事をしているのはどう考えても不公平だ.
10: なんで仕事をしないのか, いい加減仕事をしろ, 田村. \\
11: 3.5 そういうご飯とかつまらない話じゃなくて, commit の情報をみれば田村が
12: 如何に仕事をしていないのかよくわかるよ. \\
1.68 ohara 13: }
1.52 tam 14:
1.67 tam 15: \author{奥 谷 行 央\affil{神戸大学大学院自然科学研究科}
16: \mail{okutani@math.sci.kobe-u.ac.jp}
17: \and 小 原 功 任\affil{金沢大学理学部}
1.53 tam 18: \mail{ohara@kappa.s.kanazawa-u.ac.jp}
1.67 tam 19: \and 高 山 信 毅\affil{神戸大学理学部}
1.53 tam 20: \mail{takayama@math.sci.kobe-u.ac.jp}
1.67 tam 21: \and 田 村 恭 士\affil{神戸大学大学院自然科学研究科}
1.52 tam 22: \mail{tamura@math.sci.kobe-u.ac.jp}
1.67 tam 23: \and 野 呂 正 行\affil{富士通研究所}
24: \mail{noro@para.flab.fujitsu.co.jp}
25: \and 前 川 将 秀\affil{神戸大学理学部}
26: \mail{maekawa@math.sci.kobe-u.ac.jp}
1.1 tam 27: }
1.89 tam 28: \art{}
1.1 tam 29:
30: \begin{document}
31: \maketitle
32:
1.88 tam 33:
1.30 ohara 34: \section{OpenXMとは}
35:
1.90 ohara 36: OpenXM は数学プロセス間でメッセージを交換するための規約である. 数学プロ
37: セス間でメッセージをやりとりすることにより, ある数学プロセスから他の数学
38: プロセスを呼び出して計算を行なったり, 他のマシンで計算を行なわせたりする
39: ことが目的である. なお, OpenXM とは Open message eXchange protocol for
40: Mathematics の略である. OpenXM の開発の発端は野呂と高山により, asir と
41: kan/sm1 を相互に呼び出す機能を実装したことである.
42:
43: 初期の実装では, 相手側のローカル言語の文法に従った文字列を送っていた.
44: この方法では相手側のソフトが asir なのか kan/sm1 なのかを判別するなどし
45: て, 相手側のローカル言語の文法に合わせた文字列を作成しなければならない.
46: このローカル言語の文法に従った文字列を送る方法は, 効率的であるとはいい難
47: いが, 使いやすいとも言える.
48:
49: 現在の OpenXM 規約では共通表現形式によるメッセージを用いている. 上記の
50: 文字列を送る方法の利点を生かすため, OpenXM 規約では共通表現形式の中の文
51: 字列として, ローカル言語の文法に従った文字列を用いたメッセージの交換も可
52: 能となっている.
53:
54: OpenXM 規約では通信の方法に幾らかの自由度があるが, 現在のところは TCP/IP
55: を用いた通信しか実装されていない. \footnote{asir には MPI を用いた実装
56: もある.} そこで, この論文では具体的な実装は TCP/IP を用いていると仮定す
57: る.
1.88 tam 58:
1.36 tam 59: \section{OpenXM のメッセージの構造}
1.30 ohara 60:
1.90 ohara 61: 通信の方法によってメッセージの構造は変わる. この論文では TCP/IP の場合
62: についてのみ説明を行なう.
1.61 tam 63:
1.90 ohara 64: OpenXM 規約で規定されているメッセージはバイトストリームとなっており, 次
65: のような構造になっている.
1.30 ohara 66:
1.50 ohara 67: \begin{tabular}{|c|c|}
68: \hline
69: ヘッダ & \hspace{10mm} ボディ \hspace{10mm} \\
70: \hline
1.36 tam 71: \end{tabular}
72:
1.90 ohara 73: ヘッダの長さは 8 バイトであると定められている. ボディの長さはメッセージ
74: ごとに異なっているが, 長さは $0$ でもよい.
1.38 tam 75:
1.82 tam 76: ヘッダは次の二つの情報を持っている.
1.30 ohara 77: \begin{enumerate}
1.90 ohara 78: \item
79: 前半の 4 バイト. メッセージの種類を表わす識別子であり, タグと呼ばれる.
80: \item
81: 後半の 4 バイト. メッセージにつけられた通し番号である.
1.30 ohara 82: \end{enumerate}
1.82 tam 83: それぞれの 4 バイトは 32 ビット整数とみなされて扱われる.
1.88 tam 84:
1.90 ohara 85: この場合に用いられる 32 ビット整数の表現方法について説明しておこう. 問
86: 題になるのは負数の表現とバイトオーダーの問題である. まず, 負数を表す必
87: 要があるときには2の補数表現を使うことになっている. 次にバイトオーダーで
88: あるが, OpenXM 規約は複数のバイトオーダーを許容する. ただし一つの通信路
89: ではひとつのバイトオーダーのみが許され, 通信路の確立時に一度だけ選ばれる.
1.88 tam 90:
91: 現在のOpenXM 規約では, タグ(整数値)として以下のものが定義されている.
1.45 tam 92:
93: \begin{verbatim}
1.53 tam 94: #define OX_COMMAND 513
95: #define OX_DATA 514
1.54 tam 96: #define OX_SYNC_BALL 515
1.53 tam 97: #define OX_DATA_WITH_LENGTH 521
98: #define OX_DATA_OPENMATH_XML 523
99: #define OX_DATA_OPENMATH_BINARY 524
100: #define OX_DATA_MP 525
1.45 tam 101: \end{verbatim}
1.30 ohara 102:
1.90 ohara 103: ボディの構造はメッセージの種類によって異なる. OX\_COMMAND で識別される
104: メッセージはスタックマシンへの命令であり, それ以外のメッセージは何らかの
105: オブジェクトを表している. この論文では OX\_DATA と OX\_COMMAND で識別さ
106: れるメッセージについてのみ, 説明する.
1.50 ohara 107:
1.82 tam 108: 既存のメッセージでは対応できない場合は, 新しい識別子を定義することで新し
109: い種類のメッセージを作成することができる. この方法は各数学ソフトウェアの
110: 固有の表現を含むメッセージを作成したい場合などに有効である. 新しい識別子
111: の定義方法については, \cite{OpenXM-1999} を参照すること.
1.42 tam 112:
1.88 tam 113:
1.42 tam 114: \section{OpenXM の計算モデル}
115:
1.82 tam 116: OpenXM 規約での計算とはメッセージを交換することである. また, OpenXM 規
117: 約ではクライアント・サーバモデルを採用しているので, メッセージの交換はサー
118: バとクライアントの間で行なわれる. クライアントからサーバへメッセージを送
119: り, クライアントがサーバからメッセージを受け取ることによって計算の結果が
120: 得られる. このメッセージのやりとりはクライアントの主導で行われる. つまり,
121: クライアントは自由にメッセージをサーバに送付してもよいが, サーバからは自
122: 発的にメッセージが送付されることはない. この原理はサーバはスタックマシン
123: であることで実現される. スタックマシンの構造については \ref{sec:oxsm} 節
124: で述べる.
1.70 ohara 125:
126: サーバがクライアントから受け取ったオブジェクト(つまり OX\_COMMAND でない
1.82 tam 127: メッセージのボディ)はすべてスタックに積まれる. スタックマシンへの命令
1.70 ohara 128: (OX\_COMMAND で識別されるメッセージのボディ)を受け取ったサーバは命令に対
1.82 tam 129: 応する動作を行なう. このとき, 命令によってはスタックからオブジェクトを取
130: り出すことがあり, また(各数学システムでの)計算結果をスタックに積むことが
131: ある. もし, 与えられたデータが正しくないなどの理由でエラーが生じた場合に
132: はサーバはエラーオブジェクトをスタックに積む. 計算結果をクライアントが得
1.70 ohara 133: る場合にはスタックマシンの命令 SM\_popCMO または SM\_popString をサーバ
1.82 tam 134: に送らなければならない. これらの命令を受け取ってはじめて, サーバからクラ
135: イアントへメッセージが送られる.
1.50 ohara 136:
1.90 ohara 137: まとめると, クライアントがサーバへメッセージを送り, 計算の結果を得るとい
138: う手順は以下のようになる.
1.3 tam 139:
140: \begin{enumerate}
1.90 ohara 141: \item
142: まず, クライアントがサーバへオブジェクトを送る. サーバは送られてきたオ
143: ブジェクトをスタックに積む.
144: \item
145: クライアントがサーバに計算の命令を送ると, サーバはあらかじめ定めれらた動
146: 作を行う. 一部の命令はスタックの状態を変更する. 例えば
147: SM\_executeFunction, \\ SM\_executeStringByLocalParser などの命令は, ス
148: タック上のオブジェクトから計算を行う. SM\_popCMO もしくは SM\_popString
149: は, スタックの最上位のオブジェクトを取りだし, クライアントに送り返す.
1.4 tam 150: \end{enumerate}
1.2 tam 151:
1.82 tam 152:
1.73 ohara 153: \section{OpenXM スタックマシン}\label{sec:oxsm}
1.68 ohara 154:
1.82 tam 155: OpenXM 規約ではサーバはスタックマシンであると定義している. 以下, OpenXM
156: スタックマシンと呼ぶ. この節ではOpenXM スタックマシンの構造について説明
157: しよう.
158:
159: まず, OpenXM 規約は通信時にやりとりされる共通のデータ形式については規定
160: するが, OpenXM スタックマシンがスタックに積む, オブジェクトの構造までは
161: 規定しない. つまり, オブジェクトの構造は各数学システムごとに異なっている
162: ということである. このことは通信路からデータを受け取った際に, 各数学シス
163: テムが固有のデータ構造に変換してからスタックに積むことを意味する. この変
164: 換は1対1対応である必要はない.
165:
166: 次に OpenXM スタックマシンの命令コードについて説明する. OpenXM スタック
167: マシンにおけるすべての命令は4バイトの長さを持つ. OpenXM 規約の他の規定と
168: 同様に, 4バイトのデータは32ビット整数と見なされるので, この論文でもその
169: 表記にしたがう. OpenXM スタックマシンに対する命令はスタックに積まれるこ
170: とはない. 現在のところ, OpenXM 規約では以下の命令が定義されている.
1.68 ohara 171:
172: \begin{verbatim}
1.69 tam 173: #define SM_popSerializedLocalObject 258
174: #define SM_popCMO 262
175: #define SM_popString 263
176:
177: #define SM_mathcap 264
178: #define SM_pops 265
179: #define SM_setName 266
180: #define SM_evalName 267
181: #define SM_executeStringByLocalParser 268
182: #define SM_executeFunction 269
183: #define SM_beginBlock 270
184: #define SM_endBlock 271
185: #define SM_shutdown 272
186: #define SM_setMathCap 273
187: #define SM_executeStringByLocalParserInBatchMode 274
188: #define SM_getsp 275
189: #define SM_dupErrors 276
190:
191: #define SM_DUMMY_sendcmo 280
192: #define SM_sync_ball 281
193:
194: #define SM_control_kill 1024
195: #define SM_control_to_debug_mode 1025
196: #define SM_control_exit_debug_mode 1026
197: #define SM_control_ping 1027
198: #define SM_control_start_watch_thread 1028
199: #define SM_control_stop_watch_thread 1029
200: #define SM_control_reset_connection 1030
1.68 ohara 201: \end{verbatim}
202:
1.90 ohara 203: スタックマシンに対する命令の中には実行によって結果が返ってくるものがある.
204: 結果が返ってくる命令を実行した場合, サーバはその結果をスタックに積む.
205: たとえば, 命令 SM\_executeStringByLocalParser はスタックに積まれているオ
206: ブジェクトをサーバ側のローカル言語の文法に従った文字列とみなして計算を行
207: なうが, 行なった計算の結果はスタックに積まれる.
1.81 ohara 208:
1.82 tam 209: なお, 命令の実行中にエラーが起こり, 結果が得られなかった場合には,
210: エラーオブジェクトがスタックに積まれる.
1.75 tam 211:
1.73 ohara 212: \section{CMO のデータ構造}\label{sec:cmo}
1.4 tam 213:
1.82 tam 214: OpenXM 規約では, 数学的オブジェクトを表現する方法として CMO 形式(Common
215: Mathematical Object format)を定義している. この CMO 形式にしたがったデー
216: タは, 識別子が OX\_DATA であるようなメッセージのボディになることを想定し
217: ている.
1.68 ohara 218:
1.82 tam 219: CMO 形式におけるデータ構造は次のような構造をもつ.
1.72 tam 220:
221: \begin{tabular}{|c|c|} \hline
222: ヘッダ & \hspace{10mm} ボディ \hspace{10mm} \\ \hline
223: \end{tabular}
1.71 tam 224:
1.82 tam 225: ヘッダは4バイトである. ボディの長さはそれぞれのデータによって異なるが,
226: 0でもよい.
1.68 ohara 227:
1.82 tam 228: メッセージと同様にヘッダは4バイト単位に管理される. すなわち, CMO ではヘッ
229: ダは一つだけの情報を含む. この4バイトのヘッダのことをタグともいう. さて,
230: CMO では, タグによってボディの論理的構造が決定する. すなわち, タグはそれ
231: ぞれのデータ構造と1対1に対応する識別子である. それぞれの論理的構造は
232: \cite{OpenXM-1999} に詳述されている. 現在の OpenXM 規約では以下の CMO が
233: 定義されている.
1.30 ohara 234:
1.47 tam 235: \begin{verbatim}
1.74 tam 236: #define CMO_ERROR2 0x7f000002
237: #define CMO_NULL 1
238: #define CMO_INT32 2
239: #define CMO_DATUM 3
240: #define CMO_STRING 4
1.73 ohara 241: #define CMO_MATHCAP 5
242:
1.74 tam 243: #define CMO_START_SIGNATURE 0x7fabcd03
244: #define CMO_ARRAY 16
245: #define CMO_LIST 17
246: #define CMO_ATOM 18
247: #define CMO_MONOMIAL32 19
248: #define CMO_ZZ 20
249: #define CMO_QQ 21
250: #define CMO_ZERO 22
251: #define CMO_DMS_GENERIC 24
252: #define CMO_DMS_OF_N_VARIABLES 25
253: #define CMO_RING_BY_NAME 26
254: #define CMO_RECURSIVE_POLYNOMIAL 27
255: #define CMO_LIST_R 28
256:
257: #define CMO_INT32COEFF 30
258: #define CMO_DISTRIBUTED_POLYNOMIAL 31
259: #define CMO_POLYNOMIAL_IN_ONE_VARIABLE 33
260: #define CMO_RATIONAL 34
261:
262: #define CMO_64BIT_MACHINE_DOUBLE 40
263: #define CMO_ARRAY_OF_64BIT_MACHINE_DOUBLE 41
264: #define CMO_128BIT_MACHINE_DOUBLE 42
265: #define CMO_ARRAY_OF_128BIT_MACHINE_DOUBLE 43
266:
267: #define CMO_BIGFLOAT 50
268: #define CMO_IEEE_DOUBLE_FLOAT 51
269:
270: #define CMO_INDETERMINATE 60
271: #define CMO_TREE 61
272: #define CMO_LAMBDA 62
1.47 tam 273: \end{verbatim}
1.72 tam 274:
1.75 tam 275: この中で CMO\_ERROR2, CMO\_NULL, CMO\_INT32, CMO\_DATUM, CMO\_STRING,
276: CMO\_MATHCAP, CMO\_LIST で識別されるオブジェクトは最も基本的なオブジェ
1.82 tam 277: クトであって, すべての OpenXM 対応システムに実装されていなければならない.
1.48 tam 278:
1.82 tam 279: これらについての解説を行う前に記法について, 少し説明しておく.
280: この論文では, 大文字で CMO\_INT32 と書いた場合には, 上記で定義した識別子
281: を表わす. また CMO\_INT32 で識別されるオブジェクトのクラス(あるいはデー
282: タ構造)を cmo\_int32 と小文字で表わすことにする.
283:
284: さて cmo を表現するための一つの記法を導入する. この記法は CMO expression
285: と呼ばれている. その正確な形式的定義は \cite{OpenXM-1999} を参照すること.
286:
287: まず CMO expssion は Lisp 風表現の一種で, cmo を括弧で囲んだリストとし
288: て表現する. それぞれの要素はカンマで区切る.
289: 例えば,
1.73 ohara 290: \begin{quote}
291: (17, {\sl int32}, (CMO\_NULL), (2, {\sl int32} $n$))
292: \end{quote}
1.82 tam 293: は CMO expression である. ここで, 小文字の斜体で表された``{\sl int32}''
294: は 4バイトの任意のデータを表す記号であり, ``{\sl int32} $n$'' は同じく 4
295: バイトのデータであるが以下の説明で $n$ と表すことを示す. また数字 17, 2
296: などは 4バイトのデータで整数値としてみたときの値を意味する. CMO\_NULL は
297: 識別子(すなわち数字 1 と等価)である. この記法から上記のデータは 20 バイ
1.90 ohara 298: トの大きさのデータであることが分かる. なお, CMO expression は単なる表記
299: 法であることに特に注意してほしい.
1.81 ohara 300:
1.90 ohara 301: さて, この記法のもとで cmo\_int32 を次のデータ構造であると定義する.
1.73 ohara 302: \begin{quote}
1.81 ohara 303: cmo\_int32 := (CMO\_INT32, {\sl int32})
1.73 ohara 304: \end{quote}
1.82 tam 305: 同様に, cmo\_null, cmo\_string, cmo\_list, cmo\_mathcap のシンタッ
306: クスは次のように定義される.
1.81 ohara 307: \begin{quote}
308: cmo\_null := (CMO\_NULL) \\
309: cmo\_string := (CMO\_STRING, {\sl int32} $n$, {\sl string} $s$) \\
310: cmo\_list := (CMO\_LIST, {\sl int32} $m$, {\sl cmo} $c_1$, $\ldots$,
311: {\sl cmo} $c_m$) \\
312: cmo\_mathcap := (CMO\_MATHCAP, {\sl cmo\_list})
313: \end{quote}
1.82 tam 314: ただし, {\sl string}は適当な長さのバイト列を表す. $s$ のバイト長は $n$
315: と一致することが要求される.
1.76 tam 316:
1.50 ohara 317: \section{mathcap について}
1.30 ohara 318:
1.82 tam 319: OpenXM 規約では, 通信時に用いられるメッセージの種類を各ソフトウェアが制
320: 限する方法を用意している. これは各ソフトウェアの実装によってはすべてのメッ
321: セージをサポートするのが困難な場合があるからである. また, 各ソフトウェア
322: でメッセージの種類を拡張したい場合にも有効である. この制限(あるいは拡張)
323: は mathcap と呼ばれるデータ構造によって行われる. この節では mathcap のデー
324: タ構造と, 具体的なメッセージの制限の手続きについて説明する.
325:
326: では, 手続きについて説明しよう.
327:
328: 第一にサーバの機能を制限するには次のようにする. クライアントが mathcap
329: オブジェクトをサーバへ送ると, サーバは受け取ったmathcap をスタックに積む.
330: 次にクライアントが命令 SM\_setMathCap を送ると, サーバはスタックの最上位
331: に積まれている mathcap オブジェクトを取り出し, mathcap で設定されていな
332: いメッセージをクライアントへ送らないように制限を行う.
333:
1.86 tam 334: 第二にクライアントを制限するには次のようにする. クライアントがサーバに命令 \\
335: SM\_mathcap を送ると, サーバは mathcap オブジェクトをスタックに積む.
1.82 tam 336: さらに命令 SM\_popCMO を送ると, サーバはスタックの最上位のオブジェクト
1.73 ohara 337: (すなわち mathcap オブジェクト)をボディとするメッセージをクライアントに
1.82 tam 338: 送付する. クライアントはそのオブジェクトを解析して, 制限をかける.
1.50 ohara 339:
1.82 tam 340: 次に mathcap のデータ構造について説明する.
1.90 ohara 341: mathcap は cmo の一種であるので, すでに説明したように
342: \begin{quote}
343: cmo\_mathcap := (CMO\_MATHCAP, {\sl cmo\_list})
344: \end{quote}
345: の構造をもつ(\ref{sec:cmo} 節を参照のこと).
1.82 tam 346: ボディは cmo\_list オブジェクトでなければならない.
1.67 tam 347:
1.90 ohara 348: さて, mathcap オブジェクトのボディの cmo\_list オブジェクトは以下の条件
349: を満たすことを要求される. まず, その cmo\_list オブジェクトは少なくとも
350: リスト長が 3 以上でなければならない.
1.77 tam 351: \begin{quote}
1.90 ohara 352: (CMO\_LIST, {\sl int32}, {\sl cmo} $a$, {\sl cmo} $b$, {\sl cmo} $c$, $\ldots$)
1.77 tam 353: \end{quote}
1.56 tam 354:
1.90 ohara 355: 第一要素 $a$ はまた cmo\_list であり, リスト長は 4 以上, $a_1$ は
356: cmo\_int32 でバージョンを表す, $a_2$, $a_3$, $a_4$ は cmo\_string であり,
357: それぞれシステムの名前, バージョン, HOSTTYPE を表すことになっている.
1.77 tam 358: \begin{quote}
1.81 ohara 359: (CMO\_LIST, {\sl int32},
360: {\sl cmo\_int32} $a_1$, {\sl cmo\_string} $a_2$, {\sl cmo\_string}
361: $a_3$, {\sl cmo\_string} $a_4$, $\ldots$)
1.77 tam 362: \end{quote}
1.56 tam 363:
1.90 ohara 364: 第二要素 $b$ の部分は次のようなリスト構造をしている.
365: この $b_1$, $b_2$, $\ldots$, $b_n$ はすべて cmo\_int32 である.
1.82 tam 366: \ref{sec:oxsm} 節で説明したが,
1.81 ohara 367: スタックマシンへの命令はすべて {\sl int32} で表されていたことに注意しよ
1.82 tam 368: う. 各 $b_i$ は利用可能な命令をボディとした cmo\_int32 となっている.
1.77 tam 369: \begin{quote}
1.90 ohara 370: (CMO\_LIST, {\sl int32} $n$,
371: {\sl cmo\_int32} $b_1$, {\sl cmo\_int32} $b_2$,
372: $\ldots$, {\sl cmo\_int32} $b_n$)
1.77 tam 373: \end{quote}
1.58 tam 374:
1.90 ohara 375: 第三要素 $c$ は以下のようなリスト構造をしている.
1.77 tam 376: \begin{quote}
1.90 ohara 377: (CMO\_LIST, {\sl int32} $m$, \\
1.79 tam 378: \hspace{10mm} (CMO\_LIST, {\sl int32} $l_1$, {\sl cmo\_int32} $c_{11}$,
1.90 ohara 379: {\sl cmo} $c_{12}$, $\ldots$, {\sl cmo} $c_{1l_1}$), \\
1.79 tam 380: \hspace{10mm} (CMO\_LIST, {\sl int32} $l_2$, {\sl cmo\_int32} $c_{21}$,
1.90 ohara 381: {\sl cmo} $c_{22}$, $\ldots$, {\sl cmo} $c_{1l_2}$), \\
382: \hspace{10mm} $\ldots$ \\
1.79 tam 383: \hspace{10mm} (CMO\_LIST, {\sl int32} $l_m$, {\sl cmo\_int32} $c_{m1}$,
1.90 ohara 384: {\sl cmo} $c_{m2}$, $\ldots$, {\sl cmo} $c_{1l_m}$))
1.77 tam 385: \end{quote}
1.90 ohara 386: {\Large 以下、全然説明が分かりません。}
1.84 tam 387: どの $c_{i1}$ にも cmo\_int32 が入っており,
388: OX\_COMMAND 以外の, 受け取れるメッセージの識別子が入っている.
1.82 tam 389: $c_{i2}$ 以降については最初の $c_{i1}$ の値によってそれぞれ異なる.
1.84 tam 390: ここでは, OX\_DATA の場合についてのみ説明する.
1.82 tam 391: この $c_{i1}$ が OX\_DATA の場合,
1.90 ohara 392: $c_{i1}$, $c_{i2}$, $\ldots$, $c_{il_i}$ を要素とする cmo\_list は
1.82 tam 393: CMO 形式についての情報を表しており, $l_i=2$ と決められている.
394: $c_{i1}$ にはもちろんのこと OX\_DATA が入っており,
395: $c_{i2}$ は以下の図のような cmo\_list になっている.
1.84 tam 396: 各要素は cmo\_int32 であり,
1.82 tam 397: 受け取ることが可能な CMO 形式のタグが入る.
1.79 tam 398: \begin{quote}
399: (CMO\_LIST, {\sl int32} $k$,
400: {\sl cmo\_int32} $c_{i21}$, {\sl cmo\_int32} $c_{i22}$,
1.90 ohara 401: $\ldots$, {\sl cmo\_int32} $c_{i2k}$)
1.79 tam 402: \end{quote}
1.50 ohara 403:
1.90 ohara 404: 具体的な mathcap の例をあげよう. 名前が ``ox\_test'', バージョンナンバー
1.91 tam 405: が 199911250 のサーバで, PC-UNIX 上で動いており,
1.90 ohara 406: さらに, このサーバのスタックマシンが命令 SM\_popCMO, SM\_popString,
1.91 tam 407: SM\_mathcap, SM\_executeStringByLocalParser を利用可能,
408: かつ, cmo\_int32, cmo\_string, cmo\_mathcap, cmo\_list のみに制限したい
409: ときの mathcap は
410: \begin{quote}
411: (CMO\_LIST, 3, \\
412: \ \ (CMO\_LIST, 4, (CMO\_INT32, $199911250$), (CMO\_STRING, 7, "ox\_test"), \\
413: \ \ \ \ (CMO\_STRING, 9, "199911250"), (CMO\_STRING, 4, "i386")) \\
414: \ \ (CMO\_LIST, $5$, (CMO\_INT32, SM\_popCMO), \\
415: \ \ \ \ (CMO\_INT32, SM\_popString), (CMO\_INT32, SM\_mathcap), \\
416: \ \ \ \ (CMO\_INT32, SM\_executeStringByLocalParser)) \\
417: \ \ (CMO\_LIST, $1$, \\
418: \ \ \ \ (CMO\_LIST, $2$, (CMO\_INT32, OX\_DATA), \\
419: \ \ \ \ \ \ (CMO\_LIST, $4$, (CMO\_INT32, CMO\_INT32), \\
420: \ \ \ \ \ \ \ \ (CMO\_INT32, CMO\_STRING), (CMO\_INT32, CMO\_MATHCAP), \\
421: \ \ \ \ \ \ \ \ (CMO\_INT32, CMO\_LIST)))))
1.79 tam 422: \end{quote}
1.91 tam 423: になる.
1.31 tam 424:
425:
426: \section{セキュリティ対策}
427:
1.82 tam 428: OpenXM 規約は TCP/IP を用いて通信を行うことを考慮している. ネットワーク
429: によって接続される現代の多くのソフトウェアと同様, OpenXM 規約もまた通信
430: 時のセキュリティについて注意している. 以下, このことについて説明しよう.
431:
1.90 ohara 432: 第一に OpenXM では侵入者に攻撃の機会をできるだけ与えないようにするため,
433: サーバは接続が必要になった時のみ起動している. しかし, これだけでは接続
434: を行なう一瞬のすきを狙われる可能性もある. そこで接続を行なう時に, 接続
435: を行なうポート番号を毎回変えている. こうすることで, 特定のポート番号を
436: 狙って接続を行なう手口を防ぐことができる.
437:
438: さらにもう一段安全性を高めるために, 接続時に一時パスワードをクライアント
439: が作成し, そのパスワードを使って認証を行なう. このパスワードは一旦使用
440: されれば無効になるので, もし仮になんらかの手段でパスワードが洩れたとして
441: も安全である.
442:
443: なお, メッセージ自体には特に暗号化などの処置を行っていないので, そのまま
444: ではパケット盗聴などを受ける可能性がある. 現在の実装では, 必要ならば
445: ssh を利用して対応している.
1.80 tam 446:
1.31 tam 447:
448: \section{他のプロジェクト}
449:
1.82 tam 450: 他のプロジェクトについても触れておこう.
1.31 tam 451:
1.66 tam 452: \begin{itemize}
1.90 ohara 453: \item ESPRIT OpenMath Project
1.31 tam 454:
1.90 ohara 455: http://www.openmath.org/omsoc/
1.85 tam 456:
1.92 ! tam 457: 数学的対象の SGML 的表記の標準化を目指した大規模なプロジェクト. 異なる種
1.90 ohara 458: 類の数式処理システムの間で情報を交換するときに, OpenMath で定義された表
459: 現を利用することができる. 実際の情報交換の手続きにはいろいろなものが考
460: えられるが, 例えば MCP (Mathematical Computation Protocol) なる手続きが
461: 考案されている. MCP によって送信されるデータは, 本文に OpenMath 形式で
462: 数式を記述したテキストで, いささかメイルに似ていなくもない. 実際にこの
1.92 ! tam 463: 方法で GAP と Axiom の間で通信が行われている.
1.85 tam 464:
1.66 tam 465: \item NetSolve
1.31 tam 466:
467: http://www.cs.utk.edu/netsolve/
1.85 tam 468:
1.90 ohara 469: NetSolve はクライアント・サーバ型の分散システムであり, 単なる計算システ
470: ム以上のものを目指している. クライアントは必要に応じて, サーバを呼び出
471: して計算をさせる. NetSolve の特徴は, サーバの呼び出しに Agent というソ
472: フトウェアを介在させることである. Agent は呼び出し先などを決定するデー
473: タベース的役割を果たす. また Agent によって負荷分散が可能になる. 現在
474: の NetSolve は RPC を基礎にして実装されている.
1.31 tam 475:
1.66 tam 476: \item MP
1.31 tam 477:
478: http://symbolicNet.mcs.kent.edu/SN/areas/protocols/mp.html
479:
1.91 tam 480: 科学技術計算を行なうソフトウェア間で数学的なデータを効率的に交換
481: させることを目的としたプロトコルを作成している. 木構造を用いて
482: 簡単, かつ柔軟なものを目指しており, データの表現方法や交換方法に
483: 負わずにソフトウェアを作ることができるようにしようとしている.
484: 現在すでに, C 言語で利用可能なライブラリが提供されている.
1.86 tam 485:
1.66 tam 486: \item MCP
1.31 tam 487:
1.92 ! tam 488: http://horse.mcs.kent.edu/\~{}pwang/
! 489:
! 490: 数学的な計算を行なうための HTTP スタイルのプロトコル.
! 491: クライアント・サーバモデルを採用しており,
! 492: ピアツーピアのストリームコネクションを行なう.
! 493: RPC よりも, telnet でサーバにログインして計算を行なう感覚に近い.
! 494: 数学的なオブジェクトを MP や MathML で定められた方法で
! 495: 表現することが考えられている.
! 496: すでに OpenMath を用いた実装が存在する.
1.86 tam 497:
498:
1.66 tam 499: \end{itemize}
1.31 tam 500:
501:
502: \section{現在提供されているソフトウェア}
503:
1.82 tam 504: 現在 OpenXM 規約に対応しているクライアントにはasir, sm1, Mathematica がある.
505: これらのクライアントから OpenXM 規約に対応したサーバを呼び出すこと
506: ができる. 現在 OpenXM 規約に対応しているサーバソフトウェアには, asir,
507: sm1, gnuplot, Mathematica, PHC pack などがあり,
508: それぞれ ox\_asir, ox\_sm1, ox\_sm1\_gnuplot, ox\_math, ox\_sm1\_phc
509: という名前で提供されている. また, OpenMath
1.70 ohara 510: 規約の XML 表現で表現されたオブジェクトと CMO 形式のオブジェクトを変換す
1.82 tam 511: るソフトウェアが JAVA によって実装されており, OMproxy という名前で提供さ
512: れている.
1.33 tam 513:
1.50 ohara 514: \begin{thebibliography}{99}
1.66 tam 515: \bibitem{Ohara-Takayama-Noro-1999}
516: 小原功任, 高山信毅, 野呂正行:
1.86 tam 517: {Open asir 入門}, 1999, 数式処理,
518: Vol 7, No 2, 2--17. (ISBN4-87243-086-7, SEG 出版, Tokyo).
519:
1.50 ohara 520: \bibitem{OpenXM-1999}
1.53 tam 521: 野呂正行, 高山信毅:
1.86 tam 522: {Open XM の設計と実装
523: --- Open message eXchange protocol for Mathematics},
524: 1999/11/22
1.49 tam 525: \end{thebibliography}
1.1 tam 526:
527: \end{document}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>