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