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