[BACK]Return to genkou19991125.tex CVS log [TXT][DIR] Up to [local] / OpenXM / doc

Annotation of OpenXM/doc/genkou19991125.tex, Revision 1.99

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>