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

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

1.1       tam         1: \documentclass{jarticle}
                      2:
1.90    ! ohara       3: %% $OpenXM: OpenXM/doc/genkou19991125.tex,v 1.89 1999/12/25 13:58:52 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.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'', バージョンナンバー
        !           405: が 199911250 のサーバで, PC-UNIX 上で動いていれば, $a$ の部分は
1.79      tam       406: \begin{quote}
1.86      tam       407: (CMO\_LIST, 4, (CMO\_INT32, $199911250$), (CMO\_STRING, 7, "ox\_test"), \\
                    408: \ \    (CMO\_STRING, 9, "199911250"), (CMO\_STRING, 4, "i386"))
1.79      tam       409: \end{quote}
1.84      tam       410: となる.
1.81      ohara     411:
1.90    ! ohara     412: さらに, このサーバのスタックマシンが命令 SM\_popCMO, SM\_popString,
        !           413: SM\_mathcap, SM\_executeStringByLocalParser を利用可能であれば, $b$ の部
        !           414: 分を
1.79      tam       415: \begin{quote}
1.88      tam       416: (CMO\_LIST, $5$,
1.86      tam       417:        (CMO\_INT32, SM\_popCMO), \\
                    418: \ \    (CMO\_INT32, SM\_popString), (CMO\_INT32, SM\_mathcap), \\
                    419: \ \    (CMO\_INT32, SM\_executeStringByLocalParser))
1.79      tam       420: \end{quote}
1.90    ! ohara     421: にし, cmo\_int32, cmo\_string, cmo\_mathcap, cmo\_list のみに制限したい
        !           422: ときは$c$ の部分を
1.79      tam       423: \begin{quote}
1.88      tam       424:   (CMO\_LIST, $1$, \\
                    425:   \ \ (CMO\_LIST, $2$, (CMO\_INT32, OX\_DATA), \\
                    426:   \ \ \ \ (CMO\_LIST, $4$, (CMO\_INT32, CMO\_INT32), \\
1.87      tam       427:   \ \ \ \ \ \ (CMO\_INT32, CMO\_STRING), (CMO\_INT32, CMO\_MATHCAP), \\
                    428:   \ \ \ \ \ \ (CMO\_INT32, CMO\_LIST))))
1.79      tam       429: \end{quote}
1.90    ! ohara     430: にする.
1.31      tam       431:
                    432:
                    433: \section{セキュリティ対策}
                    434:
1.82      tam       435: OpenXM 規約は TCP/IP を用いて通信を行うことを考慮している. ネットワーク
                    436: によって接続される現代の多くのソフトウェアと同様, OpenXM 規約もまた通信
                    437: 時のセキュリティについて注意している. 以下, このことについて説明しよう.
                    438:
1.90    ! ohara     439: 第一に OpenXM では侵入者に攻撃の機会をできるだけ与えないようにするため,
        !           440: サーバは接続が必要になった時のみ起動している.  しかし, これだけでは接続
        !           441: を行なう一瞬のすきを狙われる可能性もある.  そこで接続を行なう時に, 接続
        !           442: を行なうポート番号を毎回変えている.  こうすることで, 特定のポート番号を
        !           443: 狙って接続を行なう手口を防ぐことができる.
        !           444:
        !           445: さらにもう一段安全性を高めるために, 接続時に一時パスワードをクライアント
        !           446: が作成し, そのパスワードを使って認証を行なう.  このパスワードは一旦使用
        !           447: されれば無効になるので, もし仮になんらかの手段でパスワードが洩れたとして
        !           448: も安全である.
        !           449:
        !           450: なお, メッセージ自体には特に暗号化などの処置を行っていないので, そのまま
        !           451: ではパケット盗聴などを受ける可能性がある.  現在の実装では, 必要ならば
        !           452: ssh を利用して対応している.
1.80      tam       453:
1.31      tam       454:
                    455: \section{他のプロジェクト}
                    456:
1.82      tam       457: 他のプロジェクトについても触れておこう.
1.31      tam       458:
1.66      tam       459: \begin{itemize}
1.90    ! ohara     460: \item ESPRIT OpenMath Project
1.31      tam       461:
1.90    ! ohara     462: http://www.openmath.org/omsoc/
1.85      tam       463:
1.90    ! ohara     464: 数学的対象のSGML的表記の標準化を目指した大規模なプロジェクト.  異なる種
        !           465: 類の数式処理システムの間で情報を交換するときに, OpenMath で定義された表
        !           466: 現を利用することができる.  実際の情報交換の手続きにはいろいろなものが考
        !           467: えられるが, 例えば MCP (Mathematical Computation Protocol) なる手続きが
        !           468: 考案されている.  MCP によって送信されるデータは, 本文に OpenMath 形式で
        !           469: 数式を記述したテキストで, いささかメイルに似ていなくもない.  実際にこの
        !           470: 方法でGAP とAxiomの間で通信が行われている.
1.85      tam       471:
1.66      tam       472: \item NetSolve
1.31      tam       473:
                    474: http://www.cs.utk.edu/netsolve/
1.85      tam       475:
1.90    ! ohara     476: NetSolve はクライアント・サーバ型の分散システムであり, 単なる計算システ
        !           477: ム以上のものを目指している.  クライアントは必要に応じて, サーバを呼び出
        !           478: して計算をさせる.  NetSolve の特徴は, サーバの呼び出しに Agent というソ
        !           479: フトウェアを介在させることである.  Agent は呼び出し先などを決定するデー
        !           480: タベース的役割を果たす.  また Agent によって負荷分散が可能になる.  現在
        !           481: の NetSolve は RPC を基礎にして実装されている.
1.31      tam       482:
1.66      tam       483: \item MP
1.31      tam       484:
                    485: http://symbolicNet.mcs.kent.edu/SN/areas/protocols/mp.html
                    486:
1.86      tam       487: 数学的なデータの効率的な交換のためのプロトコル.
                    488: 交換するデータの木構造について詳しい.
                    489:
1.66      tam       490: \item MCP
1.31      tam       491:
                    492: http://horse.mcs.kent.edu/~pwang/
1.86      tam       493:
1.90    ! ohara     494: HTTP プロトコルを用いて, リモートの計算機で計算を行なう.
1.86      tam       495:
1.66      tam       496: \end{itemize}
1.31      tam       497:
                    498:
                    499: \section{現在提供されているソフトウェア}
                    500:
1.82      tam       501: 現在 OpenXM 規約に対応しているクライアントにはasir, sm1, Mathematica がある.
                    502: これらのクライアントから OpenXM 規約に対応したサーバを呼び出すこと
                    503: ができる. 現在 OpenXM 規約に対応しているサーバソフトウェアには, asir,
                    504: sm1, gnuplot, Mathematica, PHC pack などがあり,
                    505: それぞれ ox\_asir, ox\_sm1, ox\_sm1\_gnuplot, ox\_math, ox\_sm1\_phc
                    506: という名前で提供されている. また, OpenMath
1.70      ohara     507: 規約の XML 表現で表現されたオブジェクトと CMO 形式のオブジェクトを変換す
1.82      tam       508: るソフトウェアが JAVA によって実装されており, OMproxy という名前で提供さ
                    509: れている.
1.33      tam       510:
1.50      ohara     511: \begin{thebibliography}{99}
1.66      tam       512: \bibitem{Ohara-Takayama-Noro-1999}
                    513: 小原功任, 高山信毅, 野呂正行:
1.86      tam       514:        {Open asir 入門}, 1999, 数式処理,
                    515:        Vol 7, No 2, 2--17. (ISBN4-87243-086-7, SEG 出版, Tokyo).
                    516:
1.50      ohara     517: \bibitem{OpenXM-1999}
1.53      tam       518: 野呂正行, 高山信毅:
1.86      tam       519:        {Open XM の設計と実装
                    520:                --- Open message eXchange protocol for Mathematics},
                    521:        1999/11/22
1.49      tam       522: \end{thebibliography}
1.1       tam       523:
                    524: \end{document}

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