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

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>