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

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

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

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