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

Diff for /OpenXM/doc/Attic/genkou19991125.tex between version 1.65 and 1.124

version 1.65, 1999/12/23 22:58:32 version 1.124, 2000/01/07 09:27:02
Line 1 
Line 1 
 \documentclass{jarticle}  \documentclass{jarticle}
   
 %% $OpenXM: OpenXM/doc/genkou19991125.tex,v 1.64 1999/12/23 22:04:16 tam Exp $  %% $OpenXM: OpenXM/doc/genkou19991125.tex,v 1.123 2000/01/07 09:20:32 tam Exp $
   
 \usepackage{jssac}  \usepackage{jssac}
 \title{タイのトル}  
 \title{意味もない修飾過剰な語句は排除しましょう。}  
   
 \author{前 川 将 秀\affil{神戸大学理学部}  \title{OpenXM プロジェクトの現状について}
                 \mail{maekawa@math.sci.kobe-u.ac.jp}  \author{奥 谷   行 央\affil{神戸大学大学院自然科学研究科}
   \and  野 呂 正 行\affil{富士通研究所}  
                 \mail{noro@para.flab.fujitsu.co.jp}  
   \and  小 原 功 任\affil{金沢大学理学部}  
                 \mail{ohara@kappa.s.kanazawa-u.ac.jp}  
   \and  奥 谷 行 央\affil{神戸大学大学院自然科学研究科}  
                 \mail{okutani@math.sci.kobe-u.ac.jp}                  \mail{okutani@math.sci.kobe-u.ac.jp}
   \and  高 山 信 毅\affil{神戸大学理学部}    \and  小 原   功 任\affil{金沢大学理学部}
                   \mail{ohara@kappa.s.kanazawa-u.ac.jp}
     \and  高 山   信 毅\affil{神戸大学理学部}
                 \mail{takayama@math.sci.kobe-u.ac.jp}                  \mail{takayama@math.sci.kobe-u.ac.jp}
   \and  田 村  恭 士\affil{神戸大学大学院自然科学研究科}    \and  田 村   恭 士\affil{神戸大学大学院自然科学研究科}
                 \mail{tamura@math.sci.kobe-u.ac.jp}                  \mail{tamura@math.sci.kobe-u.ac.jp}
     \and  野 呂   正 行\affil{富士通研究所}
                   \mail{noro@para.flab.fujitsu.co.jp}
     \and  前 川   将 秀\affil{神戸大学理学部}
                   \mail{maekawa@math.sci.kobe-u.ac.jp}
 }  }
 \art{}  \art{}
   
Line 26 
Line 25 
   
 \section{OpenXMとは}  \section{OpenXMとは}
   
 OpenXM は数学プロセス間でメッセージを交換するための規約である。  OpenXM は数学プロセス間でメッセージを交換するための規約である.  数学プロ
 数学プロセス間でメッセージをやりとりすることにより、  セス間でメッセージをやりとりすることにより, ある数学プロセスから他の数学
 ある数学プロセスから他の数学プロセスを呼び出して計算を行なったり、  プロセスを呼び出して計算を行なったり, 他のマシンで計算を行なわせたりする
 他のマシンで計算を行なわせたりすることが目的である。  ことが目的である.  なお, OpenXM とは Open message eXchange protocol for
 なお、 OpenXM とは Open message eXchange protocol for Mathematics の略である。  Mathematics の略である.  OpenXM の開発の発端は野呂と高山により, asir と
 OpenXM の開発の発端は野呂と高山により、  kan/sm1 を相互に呼び出す機能を実装したことである.
 asir と kan/sm1 を相互に呼び出す機能を実装したことである。  
   
 %{\bf\large 以下の説明がなぜ必要なのかは全然分からないけれど、}  初期の実装では, 相手側のローカル言語の文法に従った文字列を送っていた.
 初期の実装では、相手側のローカル言語の文法に従った文字列を送っていた。  この方法では相手側のソフトが asir なのか kan/sm1 なのかを判別するなどし
 この方法では相手側のソフトが asir なのか kan/sm1 なのかを判別するなどして、  て, 相手側のローカル言語の文法に合わせた文字列を作成しなければならない.
 相手側のローカル言語の文法に合わせた文字列を作成しなければならない。  このローカル言語の文法に従った文字列を送る方法は, 効率的であるとはいい難
 このローカル言語の文法に従った文字列を送る方法は、  いが, 使いやすいとも言える.
 効率的であるとはいい難いが、使いやすいとも言える。  
   
 現在の OpenXM 規約では共通表現形式によるメッセージを用いている。  現在の OpenXM 規約では共通表現形式によるメッセージを用いている.  上記の
 上記の文字列を送る方法の利点を生かすため、  文字列を送る方法の利点を生かすため, OpenXM 規約では共通表現形式の中の文
 OpenXM 規約では共通表現形式の中の文字列として、  字列として, ローカル言語の文法に従った文字列を用いたメッセージの交換も可
 ローカル言語の文法に従った文字列を用いたメッセージの交換も可能となっている。  能となっている.
 %{\large\bf しかし、こんな細かいことをここで説明しなければ  
 %ならない理由がやっぱり分からないなぁ。構成的におかしいと思うけどなぁ。意  
 %味不明。}  
   
 OpenXM 規約では通信の方法に幾らかの自由度があるが、  OpenXM 規約では通信の方法に自由度があるが, 現在のところは TCP/IP を用い
 現在のところは TCP/IP を用いた通信しか実装されていない。  た通信しか実装されていない.
 そこで、この論文では具体的な実装は TCP/IP を用いていると仮定する。  \footnote{ただし asir には MPI を用いた実装もある.}
   そこで, この論文では TCP/IP を用いた実装に準拠してOpenXM の説明をする.
   
 \section{OpenXM のメッセージの構造}  
   
 通信の方法によってメッセージの構造は変わる。  \section{OpenXM のメッセージの構造}\label{sec:messages}
 前節で仮定したとおり、この論文では TCP/IP の場合についてのみ説明を行なう。  
   
 OpenXM 規約で規定されているメッセージはバイトストリームとなっており、  通信の方法によってメッセージの構造は変わる.  この論文では TCP/IP の場合
 次のような構造になっている。  についてのみ説明を行なう.
   
   OpenXM 規約で規定されているメッセージはバイトストリームとなっており, 次
   のような構造になっている.
   \begin{center}
 \begin{tabular}{|c|c|}  \begin{tabular}{|c|c|}
 \hline  \hline
 ヘッダ  & \hspace{10mm} ボディ \hspace{10mm} \\  ヘッダ  & \hspace{10mm} ボディ \hspace{10mm} \\
 \hline  \hline
 \end{tabular}  \end{tabular}
   \end{center}
   ヘッダの長さは 8 バイトであると定められている.  ボディの長さはメッセージ
   ごとに異なっているが, 長さは $0$ でもよい.
   
 ヘッダの長さは 8 バイトであると定められている。  ヘッダは次の二つの情報を持っている.
 ボディの長さはメッセージごとに異なっているが、  
 長さは $0$ でもよい。  
   
 ヘッダは次の二つの情報を持っている。  
 \begin{enumerate}  \begin{enumerate}
 \item   前半の 4 バイト。メッセージの種類を表わす識別子であり、  \item
         タグと呼ばれる。  前半の 4 バイト.  メッセージの種類を表す識別子であり, タグと呼ばれる.
 \item   後半の 4 バイト。メッセージにつけられた通し番号である。  \item
   後半の 4 バイト.  メッセージにつけられた通し番号である.
 \end{enumerate}  \end{enumerate}
 それぞれの 4 バイトは 32 ビット整数とみなされて扱われる。  それぞれの 4 バイトは 32 ビット整数とみなされて扱われる.
 この場合に用いられる整数の表現方法については後述するが、  
 基本的に表現方法はいくつかの選択肢から選ぶことが可能となっており、  
 またその選択は通信路の確立時に一度だけなされることに注意しなければならない。  
 現在のOpenXM 規約では、タグ(整数値)として  
 以下のものが定義されている。  
   
   この場合に用いられる 32 ビット整数の表現方法について説明しておこう.  問
   題になるのは負数の表現とバイトオーダーの問題である.  まず, 負数を表す必
   要があるときには2の補数表現を使うことになっている.  次にバイトオーダーで
   あるが, OpenXM 規約は複数のバイトオーダーを許容する.  ただし一つの通信路
   ではひとつのバイトオーダーのみが許され, 通信路の確立時に一度だけ選ばれる.
   
   現在のOpenXM 規約では, タグ(整数値)として以下のものが定義されている.
   
 \begin{verbatim}  \begin{verbatim}
 #define OX_COMMAND              513  #define OX_COMMAND               513
 #define OX_DATA                 514  #define OX_DATA                  514
 #define OX_SYNC_BALL            515  #define OX_SYNC_BALL             515
 #define OX_DATA_WITH_LENGTH     521  #define OX_DATA_WITH_LENGTH      521
 #define OX_DATA_OPENMATH_XML    523  #define OX_DATA_OPENMATH_XML     523
 #define OX_DATA_OPENMATH_BINARY 524  #define OX_DATA_OPENMATH_BINARY  524
 #define OX_DATA_MP              525  #define OX_DATA_MP               525
 \end{verbatim}  \end{verbatim}
   
 ボディの構造はメッセージの種類によって異なる。  ボディの構造はメッセージの種類によって異なる.  OX\_COMMAND で識別される
 この論文では OX\_DATA と OX\_COMMAND で識別されるメッセージについてのみ、  メッセージはスタックマシンへの命令であり, それ以外のメッセージは何らかの
 説明する。  オブジェクトを表している.  この論文では OX\_DATA と OX\_COMMAND で識別さ
   れるメッセージについてのみ, 説明する.
   
 既存のメッセージでは対応できない場合は、新しい識別子を定義することで新し  既存のメッセージでは対応できない場合は, 新しい識別子を定義することで新し
 い種類のメッセージを作成することができる。この方法は各数学ソフトウェアの  い種類のメッセージを作成することができる.  この方法は各数学ソフトウェア
 固有の表現を含むメッセージを作成したい場合などに有効である。新しい識別子  の固有の表現を含むメッセージを作成したい場合などに有効である.  新しい識
 の定義方法については、\cite{OpenXM-1999} を参照すること。  別子の定義方法については, \cite{OpenXM-1999} を参照すること.
   
   
 \section{OpenXM の計算モデル}  \section{OpenXM の計算モデル}
   
 OpenXM 規約での計算とはメッセージを交換することである。また、 OpenXM 規  OpenXM 規約での計算とはメッセージを交換することである.  また, OpenXM 規
 約ではクライアント・サーバモデルを採用しているので、メッセージの交換はサー  約ではクライアント・サーバモデルを採用しているので, メッセージの交換はサー
 バとクライアントの間で行なわれる。クライアントからサーバへメッセージを送  バとクライアントの間で行なわれる.
 り、クライアントがサーバからメッセージを受け取ることによって計算の結果が  \footnote{現在, 主に野呂が OpenXM の計算モデルの拡張を考えている.  効率
 得られる。  的な分散計算のアルゴリズムの多くはサーバ同士の通信も要求するからである.}
   クライアントからサーバへメッセージを送り, クライアントがサーバからメッセー
   ジを受け取ることによって計算の結果が得られる.  このメッセージのやりとり
   はクライアントの主導で行われる.  つまり, クライアントは自由にメッセージ
   をサーバに送付してもよいが, サーバからは自発的にメッセージが送付されるこ
   とはない.  この原理はサーバはスタックマシンであることで実現される.  スタッ
   クマシンの構造については \ref{sec:oxsm} 節で述べる.
   
 サーバはスタックマシンである。サーバがクライアントから受け取ったメッセー  サーバがクライアントから受け取ったオブジェクト(つまり OX\_COMMAND でない
 ジは、タグが OX\_COMMAND でなければすべてスタックに積まれる。タグが  メッセージのボディ)はすべてスタックに積まれる.  スタックマシンへの命令
 OX\_COMMAND となっているメッセージはスタックマシンへの命令であり、このメッ  (OX\_COMMAND で識別されるメッセージのボディ)を受け取ったサーバは命令に対
 セージを受け取ったサーバはそれに対応する動作を行なうことが期待されている。  応する動作を行なう.  このとき, 命令によってはスタックからオブジェクトを
   取り出すことがあり, また(各数学システムでの)計算結果をスタックに積むこと
   がある.  もし, 与えられたデータが正しくないなどの理由でエラーが生じた場
   合にはサーバはエラーオブジェクトをスタックに積む.  計算結果をクライアン
   トが得る場合にはスタックマシンの命令 SM\_popCMO または SM\_popString を
   サーバに送らなければならない.  これらの命令を受け取ってはじめて, サーバ
   からクライアントへメッセージが送られる.
   
 %{\large\bf 意味不明な書き方だけど、}  まとめると, クライアントがサーバへメッセージを送り, 計算の結果を得るとい
 サーバはメッセージを受け取らない限り、自ら何か動作を行なおうとはしない。  う手順は以下のようになる.
 これはクライアントが毎回サーバへメッセージを送るたびに、  
 いつもサーバからのメッセージを待つ必要がないことを意味する。  
 このため、クライアントはサーバの状態を気にせずにメッセージを送り、  
 一旦メッセージを送付し終えた後、  
 送ったメッセージの結果をサーバから待つことなしに次の動作に移ることができる。  
   
 \section{OpenXM の計算の進行方法}  \begin{enumerate}
   \item
   まず, クライアントがサーバへオブジェクトを送る.  サーバは送られてきたオ
   ブジェクトをスタックに積む.
   \item
   クライアントがサーバに計算の命令を送ると, サーバはあらかじめ定めれらた動
   作を行う.  一部の命令はスタックの状態を変更する.  例えば
   SM\_executeFunction, \\ SM\_executeStringByLocalParser などの命令は, ス
   タック上のオブジェクトから計算を行う.  SM\_popCMO もしくは SM\_popString
   は, スタックの最上位のオブジェクトを取りだし, クライアントに送り返す.
   \end{enumerate}
   
 %前の節と重複しているのでもう少しちゃんと考えて欲しいのだけれど、  
   
 %サーバが行うのは基本的に次の事柄だけである。  \section{OpenXM スタックマシン}\label{sec:oxsm}
 %クライアントからメッセージを受け取ると、  
 %サーバはまずメッセージの識別子を調べ、  
 %タグが OX\_COMMAND のメッセージでなければスタックに積む。  
 %タグが OX\_COMMAND のメッセージであればメッセージのボディから  
 %スタックマシンの命令コードを取りだし、  
 %あらかじめ規約で定められた動作を行なう。  
   
 前節の説明でわかるように、  OpenXM 規約ではサーバはスタックマシンであると定義している.  以下, OpenXM
 サーバはクライアントからの指示なしに、  スタックマシンと呼ぶ.  この節ではOpenXM スタックマシンの構造について説明
 自らメッセージを送らない。  しよう.
 %(例外? ox\_asir の mathcap)。  
   
 サーバがクライアントから受け取ったメッセージはすべてスタックに積まれている。  まず, OpenXM 規約は通信時にやりとりされる共通のデータ形式については規定
 次いでサーバにスタックマシンへの命令を送ると、  するが, OpenXM スタックマシンがスタックに積む, オブジェクトの構造までは
 初めてサーバはデータをスタックに積む以外のなんらかの動作を行なう。  規定しない.  つまり, オブジェクトの構造は各数学システムごとに異なってい
 このとき、必要があればサーバはスタックから必要なだけデータを取り出す。  るということである.  このことは通信路からデータを受け取った際に, 各数学
 ここで、クライアントからの命令による動作中にたとえエラーが発生したとしても  システムが固有のデータ構造に変換してからスタックに積むことを意味する.
 サーバはエラーオブジェクトをスタックに積むだけで、  この変換は1対1対応である必要はない.  もちろん, 恣意的に変換してよいわけ
 明示されない限りエラーすらもクライアントへ返さないことに  ではなく, 数学システムごとに変換方法をあらかじめ定めておく必要がある.
 注意しなければならない。  このような共通のデータ形式と各システムでの固有のデータ形式との変換の問題
   は OpenXM に限ったことではない.  OpenMath (\ref{sec:other} 節を参照のこ
   と) ではこの変換を行うソフトウェアを Phrasebook と呼んでいる.
   
 結果が生じる動作をサーバが行なった場合、  次に OpenXM スタックマシンの命令コードについて説明する.  OpenXM スタック
 サーバは動作の結果をスタックに積む。  マシンにおけるすべての命令は 4 バイトの長さを持つ.  OpenXM 規約の他の規
 サーバに行なわせた動作の結果をクライアントが知りたい場合、  定と同様に, 4 バイトのデータは32ビット整数と見なされるので, この論文でも
 スタックからデータを取り出し送信を行なう命令をサーバ側へ送ればよい。  その表記にしたがう.  OpenXM スタックマシンに対する命令はスタックに積まれ
   ることはない.  現在のところ, OpenXM 規約では以下の命令が定義されている.
   
 %{\Huge 以下、書き直し}  \begin{verbatim}
   #define SM_popSerializedLocalObject               258
   #define SM_popCMO                                 262
   #define SM_popString                              263
   #define SM_mathcap                                264
   #define SM_pops                                   265
   #define SM_setName                                266
   #define SM_evalName                               267
   #define SM_executeStringByLocalParser             268
   #define SM_executeFunction                        269
   #define SM_beginBlock                             270
   #define SM_endBlock                               271
   #define SM_shutdown                               272
   #define SM_setMathCap                             273
   #define SM_executeStringByLocalParserInBatchMode  274
   #define SM_getsp                                  275
   #define SM_dupErrors                              276
   #define SM_DUMMY_sendcmo                          280
   #define SM_sync_ball                              281
   #define SM_control_kill                          1024
   #define SM_control_to_debug_mode                 1025
   #define SM_control_exit_debug_mode               1026
   #define SM_control_ping                          1027
   #define SM_control_start_watch_thread            1028
   #define SM_control_stop_watch_thread             1029
   #define SM_control_reset_connection              1030
   \end{verbatim}
   
 クライアントがサーバへメッセージを送り、  スタックマシンに対する命令の中には実行によって結果が返ってくるものがある.
 計算の結果を得るという手順を追っていくと次のようになる。  結果が返ってくる命令を実行した場合, サーバはその結果をスタックに積む.
   たとえば, 命令 SM\_executeStringByLocalParser はスタックに積まれているオ
   ブジェクトをサーバ側のローカル言語の文法に従った文字列とみなして計算を行
   なうが, 行なった計算の結果はスタックに積まれる.
   
 \begin{enumerate}  なお, 命令の実行中にエラーが起こり, 結果が得られなかった場合には,
 \item   まず、クライアントがサーバへメッセージを送る。  エラーオブジェクトがスタックに積まれる.
         サーバは送られてきたメッセージをスタックに積む。  
 \item   クライアントがサーバにスタックマシンへの命令を送ると、  
         サーバは必要なだけスタックからデータを取り出し、  
         実行した結果をスタックに積む。  
 \item   最後に「スタックからデータを取り出し送信を行なう命令」を  
         サーバへ送ると、サーバはスタックから計算結果の入っている  
         データを取り出し、クライアントへ送出する。  
 \end{enumerate}  
   
   \section{CMO のデータ構造}\label{sec:cmo}
   
 \section{CMO のデータ構造}  OpenXM 規約では, 数学的オブジェクトを表現する方法として CMO 形式(Common
   Mathematical Object format)を定義している.  この CMO 形式にしたがったデー
   タは, 識別子が OX\_DATA であるようなメッセージのボディになることを想定し
   ている.
   
 OpenXM 規約では、数学的オブジェクトを表現する方法として  CMO 形式におけるデータ構造は次のような構造をもつ.
 CMO 形式(Common Mathematical Object format)を定義している。  \begin{center}
 この CMO 形式を使ってメッセージを送るには、  \begin{tabular}{|c|c|}
 タグを OX\_DATA にすればよい。  \hline
 CMO 形式におけるデータ構造について以下で説明するが、  ヘッダ        & \hspace{10mm} ボディ \hspace{10mm} \\
 %OpenXM 規約で定義されているメッセージを実際に作成する場合、  \hline
 CMO 形式で定義されている多倍長整数を理解しておくと、  \end{tabular}
 CMO 形式の他のデータ構造だけでなく、  \end{center}
 OpenXM 規約で定義されている様々なデータ構造を理解する助けになると思えるので、  ヘッダは4バイトである.  ボディの長さはそれぞれのデータによって異なるが,
 ここでは CMO 形式の多倍長整数のデータ構造についてのみ説明する。  0でもよい.
   
 CMO 形式で定義されているデータは多倍長整数以外にも  メッセージと同様にヘッダは4バイト単位に管理される.  すなわち, CMO では
 文字列やリスト構造などがある。どのようなデータであるかは  ヘッダは一つだけの情報を含む.  この4バイトのヘッダのことをタグともいう.
 データの先頭 4 バイトにある(メッセージの識別子とは別にある)タグを見れば  さて, CMO では, タグによってボディの論理的構造が決定する.  すなわち, タ
 判別できるようになっている。  グはそれぞれのデータ構造と1対1に対応する識別子である.  それぞれの論理的
 これはメッセージの種類の判別の仕方とおなじである。  構造は\cite{OpenXM-1999} に詳述されている.  現在の OpenXM 規約では以下の
 なお、タグは各データ毎に 32 bit の整数で表されており、  CMO が定義されている.
 多倍長整数は 20 となっている。  
 よく使われると思われる CMO 形式のタグをあげておく。  
 \begin{verbatim}  \begin{verbatim}
 #define CMO_INT32    2 /* 32 ビット整数 */  #define CMO_ERROR2                         0x7f000002
 #define CMO_STRING   4 /* 文字列        */  #define CMO_NULL                           1
 #define CMO_MATHCAP  5 /* mathcap(後述) */  #define CMO_INT32                          2
 #define CMO_LIST    17 /* リスト構造    */  #define CMO_DATUM                          3
 #define CMO_ZZ      20 /* 多倍長整数    */  #define CMO_STRING                         4
   #define CMO_MATHCAP                        5
   #define CMO_ARRAY                          16
   #define CMO_LIST                           17
   #define CMO_ATOM                           18
   #define CMO_MONOMIAL32                     19
   #define CMO_ZZ                             20
   #define CMO_QQ                             21
   #define CMO_ZERO                           22
   #define CMO_DMS_GENERIC                    24
   #define CMO_DMS_OF_N_VARIABLES             25
   #define CMO_RING_BY_NAME                   26
   #define CMO_RECURSIVE_POLYNOMIAL           27
   #define CMO_LIST_R                         28
   #define CMO_INT32COEFF                     30
   #define CMO_DISTRIBUTED_POLYNOMIAL         31
   #define CMO_POLYNOMIAL_IN_ONE_VARIABLE     33
   #define CMO_RATIONAL                       34
   #define CMO_64BIT_MACHINE_DOUBLE           40
   #define CMO_ARRAY_OF_64BIT_MACHINE_DOUBLE  41
   #define CMO_128BIT_MACHINE_DOUBLE          42
   #define CMO_ARRAY_OF_128BIT_MACHINE_DOUBLE 43
   #define CMO_BIGFLOAT                       50
   #define CMO_IEEE_DOUBLE_FLOAT              51
   #define CMO_INDETERMINATE                  60
   #define CMO_TREE                           61
   #define CMO_LAMBDA                         62
 \end{verbatim}  \end{verbatim}
   
 ここで 32 bit の整数の表現方法について説明する必要がある。  この中で CMO\_ERROR2, CMO\_NULL, CMO\_INT32, CMO\_DATUM, CMO\_STRING,
 OpenXM 規約ではバイトストリームで 32 bit の整数 20 を  CMO\_MATHCAP, CMO\_LIST で識別されるオブジェクトは最も基本的なオブジェ
 {\tt 00 00 00 14} と表す方法と {\tt 14 00 00 00} と表す方法がある。  クトであって, すべての OpenXM 対応システムに実装されていなければならない.
 この表現方法の違いはクライアントとサーバの最初の接続時に  
 双方の合意で決定することになっている。  
 なお、合意がない場合には前者の表現方法  
 (以後、この表現方法をネットワークバイトオーダーと呼ぶ)を  
 使うことになっている。  
 また、負の数を表現する必要があるときには、  
 2 の補数表現を使うことになっている。  
   
 CMO 形式の多倍長整数は、 Gnu MPライブラリ等を参考にしており、  これらについての解説を行う前に記法について, 少し説明しておく.  この論文
 符合付き絶対値表現を用いている。  では, 大文字で CMO\_INT32 と書いた場合には, 上記で定義した識別子を表す.
 タグ以降の形式は次のようになる。  また CMO\_INT32 で識別されるオブジェクトのクラス(あるいはデータ構造) を
   cmo\_int32 と小文字で表すことにする.
   
 \begin{tabular}{|c|c|c|c|c|} \hline  さて cmo を表現するための一つの記法を導入する.  この記法は CMO expression
 $f$ & $b_0$ & $b_1$ & $\cdots$ & $b_{n-1}$ \\ \hline  と呼ばれている.  その正確な形式的定義は \cite{OpenXM-1999} を参照すること.
 \end{tabular}  
   
 ここで、 1 つの枠は 4 バイトを表し、  CMO expssion は Lisp 風表現の一種で, cmo を括弧で囲んだリストとして表現
 $f$ は符合付き 32 ビット整数を、  する.  それぞれの要素はカンマで区切る.  例えば,
 $b_0$, $b_1$, $\cdots$, $b_{n-1}$ は符合なし 32 ビット整数を表している。  \begin{quote}
 さらに、 $|f| = n$ が成り立たなければならない。  (17, {\sl int32}, (CMO\_NULL), (2, {\sl int32} $n$))
 このオブジェクトは  \end{quote}
 \[ \mbox{sgn}(f) \times \{ b_0 (2^{32})^0 + b_1 (2^{32})^1 + \cdots  は CMO expression である.  ここで, 小文字の斜体で表された``{\sl int32}''
         + b_{n-1} (2^{32})^{n-1} \}     \]  は 4 バイトの任意のデータを表す記号であり, ``{\sl int32} $n$'' は同じく
 という整数であると定義されている。  4 バイトのデータであるが以下の説明で $n$ と表すことを示す.  また数字 17,
 ただし、  2 などは 4 バイトのデータで整数値としてみたときの値を意味する.  CMO\_NULL
 \[ \mbox{sgn}(f) = \left\{ \begin{array}{ll}  は識別子(すなわち数字 1 と等価)である.  この記法から上記のデータは 20 バ
         1       & f>0 \\  イトの大きさのデータであることが分かる.  なお, CMO expression は単なる表
         0       & f=0 \\  記法であることに特に注意してほしい.
         -1      & f<0 \\ \end{array} \right.    \]  
 である。  
   
 ここで具体例をだそう。  さて, この記法のもとで cmo\_int32 を次のデータ構造であると定義する.
 $4294967298 = 1 \times 2^{32} + 2$ を CMO 形式の  \begin{quote}
 ネットワークバイトオーダー、多倍長整数で表現すると、  cmo\_int32 := (CMO\_INT32,  {\sl int32})
 \begin{center}  \end{quote}
         {\tt 00 00 00 14 00 00 00 02 00 00 00 02 00 00 00 01}  同様に, cmo\_null, cmo\_string, cmo\_list, cmo\_mathcap のシンタッ
 \end{center}  クスは次のように定義される.
 となる。また、同じ表現方法で $-1$ を表現すると、  \begin{quote}
 \begin{center}  cmo\_null := (CMO\_NULL) \\
         {\tt 00 00 00 14 ff ff ff ff 00 00 00 01}  cmo\_string := (CMO\_STRING, {\sl int32} $n$, {\sl string} $s$) \\
 \end{center}  cmo\_list := (CMO\_LIST, {\sl int32} $m$, {\sl cmo} $c_1$, $\ldots$,
 となる。  {\sl cmo} $c_m$) \\
   cmo\_mathcap := (CMO\_MATHCAP, {\sl cmo\_list})
   \end{quote}
   ただし, {\sl string}は適当な長さのバイト列を表す.  $s$ のバイト長は $n$
   と一致することが要求される.
   
   
 \section{mathcap について}  \section{mathcap について}
   
 OpenXM 規約では、通信時に用いられるメッセージの種類を  OpenXM 規約では, 通信時に用いられるメッセージの種類を各ソフトウェアが制
 各ソフトウェアが制限する方法を用意している。  限する方法を用意している.  これは各ソフトウェアの実装によってはすべての
 これは各ソフトウェアの実装によってはすべてのメッセージを  メッセージをサポートするのが困難な場合があるからである.  また, 各ソフト
 サポートするのが困難な場合があるからである。  ウェアでメッセージの種類を拡張したい場合にも有効である.  この制限(あるい
 また、各ソフトウェアでメッセージの種類を拡張したい場合にも有効である。  は拡張) は mathcap と呼ばれるデータ構造によって行われる.  この節では
 この制限(あるいは拡張)は CMO 形式で定義されている mathcap と  mathcap のデータ構造と, 具体的なメッセージの制限の手続きについて説明する.
 呼ばれるデータ構造によって行われる。  
 この節では mathcap のデータ構造と、  
 具体的なメッセージの制限の手続きについて説明する。  
   
 まず、手続きについて説明しよう。  まず, 手続きについて説明しよう.
 クライアント側の mathcap をサーバへ送ると、  
 すでに説明したように、サーバは受け取った mathcap をスタックに積み上げる。  
 次にクライアントはスタックマシンへの命令をサーバへ送ることにより、  
 サーバはスタックに積まれている mathcap を取り出し、  
 mathcap で設定されていないメッセージをクライアント側へ  
 送らないように設定する。  
 サーバ側の mathcap が欲しい場合には以下のようにする。  
 クライアントがサーバに mathcap を要求すると、  
 サーバはサーバ自身の mathcap をスタックに積む。  
 さらにサーバにスタックからデータを取り出し送信を行なう命令を送れば、  
 サーバはスタックにある mathcap をクライアントへ送出する。  
 このようにしてクライアントはサーバ側の mathcap を受け取れるわけである。  
   
 次に mathcap のデータ構造について説明する。  第一にサーバの機能を制限するには次のようにする.  クライアントが mathcap
 mathcap は CMO 形式で定義されており、  オブジェクトをサーバへ送ると, サーバは受け取ったmathcap をスタックに積む.
 1 つの CMO 形式のオブジェクトを持つ。  次にクライアントが命令 SM\_setMathCap を送ると, サーバはスタックの最上位
 そのオブジェクトは以下で説明する 3 つの要素からなるリストでなければならない。  に積まれている mathcap オブジェクトを取り出し, mathcap で設定されていな
   いメッセージをクライアントへ送らないように制限を行う.
   
 \[      \begin{tabular}{|c|c|c|} \hline  第二にクライアントを制限するには次のようにする.  まず, クライアントがサー
         $A$ & $B$ & $C$ \\ \hline  バに命令 SM\_mathcap を送ると, サーバは mathcap オブジェクトをスタックに
         \end{tabular}   \]  積む.  さらに命令 SM\_popCMO を送ると, サーバはスタックの最上位のオブジェ
   クト(すなわち mathcap オブジェクト)をボディとするメッセージをクライアン
   トに送付する.  クライアントはそのオブジェクトを解析して, 制限をかける.
   
 最初の要素 $A$ の部分は以下の図のようなリスト構造をしており、  次に mathcap のデータ構造について説明する.
 $a_1$ は 32 ビット整数でバージョンナンバーを、  mathcap は cmo の一種であるので, すでに説明したように
 $a_2$ は文字列でシステムの名前を表すことになっている。  \begin{quote}
   cmo\_mathcap := (CMO\_MATHCAP, {\sl cmo\_list})
   \end{quote}
   の構造をもつ(\ref{sec:cmo} 節を参照のこと).
   ボディは cmo\_list オブジェクトでなければならない.
   
 \[      \begin{tabular}{|c|c|} \hline  さて, mathcap オブジェクトのボディの cmo\_list オブジェクトは以下の条件
         $a_1$ & $a_2$   \\ \hline  を満たすことを要求される.  まず, その cmo\_list オブジェクトは少なくとも
         \end{tabular}   \]  リスト長が 3 以上でなければならない.
   \begin{quote}
   (CMO\_LIST, {\sl int32}, {\sl cmo} $a$, {\sl cmo} $b$, {\sl cmo} $c$, $\ldots$)
   \end{quote}
   
 2 番目の要素 $B$ の部分は次のようなリスト構造をしている。  第一要素 $a$ はまた cmo\_list であり, リスト長は 4 以上, $a_1$ は
 この $b_1$, $b_2$, $\cdots$, $b_n$ はすべて 32 ビットの整数である。  cmo\_int32 でバージョンを表す.  $a_2$, $a_3$, $a_4$ は cmo\_string であ
 スタックマシンへの命令はすべて 32 ビットの整数で表しており、  り, それぞれ数学システムの名前, バージョン, HOSTTYPE を表すことになって
 各 $b_i$ は利用可能な命令に対応する 32 ビットの整数となっている。  いる.
   \begin{quote}
   (CMO\_LIST, {\sl int32},
   {\sl cmo\_int32} $a_1$, {\sl cmo\_string} $a_2$, {\sl cmo\_string}
   $a_3$, {\sl cmo\_string} $a_4$, $\ldots$)
   \end{quote}
   
 \[      \begin{tabular}{|c|c|c|c|} \hline  第二要素 $b$ も cmo\_list であり, OpenXM スタックマシンを制御するために
         $b_1$ & $b_2$ & $\cdots$ & $b_n$        \\ \hline  用いられる.  各 $b_i$ は cmo\_int32 であり, ボディはスタックマシンの命令
         \end{tabular}   \]  コードである.  \ref{sec:oxsm} 節で説明したが, スタックマシンへの命令はす
   べて {\sl int32} で表されていたことに注意しよう.
   \begin{quote}
   (CMO\_LIST, {\sl int32} $n$,
   {\sl cmo\_int32} $b_1$, $\ldots$, {\sl cmo\_int32} $b_n$)
   \end{quote}
   
 3 番目の要素 $C$ は以下のようなリスト構造をしている。  第三要素 $c$ は以下のような cmo\_list であり, オブジェクトの送受信を制御
 \[  \overbrace{  するために用いられる.  送受信の制御はメッセージの種類ごとに行われる.
         \begin{tabular}{|c|c|c|c|} \hline  \begin{quote}
         $c_1$ & $c_2$ & $\cdots$ & $c_n$        \\ \hline  (CMO\_LIST, {\sl int32} $m$, {\sl cmo\_list} $\ell_1$, $\ldots$,
         \end{tabular}  {\sl cmo\_list} $\ell_m$)
    }^{C}        \]  \end{quote}
 %$n$ は OX\_COMMAND 以外の受け取れるメッセージのタグの種類の数に等しい。  各 $\ell_i$ が制御のための情報を表す.  どの $\ell_i$ も一つ以上の要素を
 %要素数は 1 でももちろん構わない。  持っており, 第一要素は必ず cmo\_int32 となっていなければならない.  これ
 各 $c_i$ もまた以下のようなリスト構造となっており、  は制御すべきメッセージの識別子を入れるためである.
 どの $c_i$ も最初の要素が 32 ビットの整数となっている。  
 \[  \overbrace{  
         \begin{tabular}{|c|c|c|c|c|} \hline  
         $c_{i1}$ (32 ビットの整数) & $c_{i2}$ & $c_{i3}$ &  
                 $\cdots$ & $c_{im}$     \\ \hline  
         \end{tabular}  
    }^{c_i}      \]  
 このリストの最初の整数値は受け取れるメッセージのタグが入っている。  
 $c_{i2}$ 以降については最初の $c_{i1}$ の値によってそれぞれ異なる。  
 ここでは、最初の要素が OX\_DATA の場合についてのみ説明する。  
 この $c_{i1}$ が OX\_DATA の場合、  
 リスト $c_i$ は CMO 形式についての情報を表しており、  
 $m=2$ と決められている。  
 $c_{i1}$ にはもちろんのこと OX\_DATA が入っており、  
 $c_{i2}$ は以下の図のようなリスト構造になっている。  
 各要素は 32 ビットの整数であり、  
 受け取ることが可能な CMO 形式のタグが入る。  
 \[  \overbrace{  
         \begin{tabular}{|c|c|c|c|c|} \hline  
         $c_{i21}$ & $c_{i22}$ & $\cdots$ & $c_{i2l}$    \\ \hline  
         \end{tabular}  
    }^{c_{i2}}   \]  
   
 %なお、 mathcap データの中では CMO 形式で定義されている  各 $\ell_i$ の構造はメッセージの種類によって異なる.  ここでは, OX\_DATA
 %32 bit 整数、文字列、リスト構造が使われており、  の場合についてのみ説明する.  第一要素が OX\_DATA の場合, リスト $\ell_i$
 %mathcap データに含まれている内容を理解できるためには  は以下のような構造となっている.  各 $c_i$ は cmo\_int32 であり, そのボディ
 %必然的にこれらも理解できる必要がある  は CMO の識別子である.  $c_i$ で指示された CMO のみが送受信することを許
 %(ってことは CMO 形式のところでこれらを  される.
 %説明しなければならないってことです)。  \begin{quote}
   (CMO\_LIST, 2, (CMO\_INT32, OX\_DATA), \\
   \ \ (CMO\_LIST, {\sl int32} $k$, {\sl cmo\_int32} $c_1$,
   $\ldots$, {\sl cmo\_int32} $c_k$))
   \end{quote}
   
 具体的な mathcap の例をあげよう。  具体的な mathcap の例をあげよう.  名前が ``ox\_test'', バージョンナンバー
 %なお、 $a_1$, $a_2$, $\cdots$, $a_n$ を要素に  が 199911250 のサーバで, Linux 上で動いており, このサーバのスタックマシ
 %持つリスト構造を {\tt [$a_1$, $a_2$, $\cdots$, $a_n$]} 、  ンが命令 SM\_popCMO, SM\_popString, SM\_mathcap,
 %文字列 ``string'' を {\tt "string"} 、 32 bit 整数を  SM\_executeStringByLocalParser を利用可能で, かつ オブジェクトを
 %それに対応する 10 進数の整数で示す。  cmo\_int32, cmo\_string, cmo\_mathcap, cmo\_list のみに制限したいときの
 名前が ``ox\_test'' 、バージョンナンバーが 199911250 のサーバであれば、  mathcap は
 $A$ の部分は  \begin{quote}
 \begin{tabular}{|c|c|} \hline  (CMO\_MATHCAP, (CMO\_LIST, 3, \\
 199911250 & "ox\_test" \\ \hline  $\quad$ (CMO\_LIST, 4, (CMO\_INT32, $199911250$), (CMO\_STRING, 7, ``ox\_test''), \\
 \end{tabular}  $\qquad$ (CMO\_STRING, 9, ``199911250''), (CMO\_STRING, 4, ``i386'')) \\
 となる。  $\quad$ (CMO\_LIST, $5$, (CMO\_INT32, SM\_popCMO), \\
 さらに、このサーバのスタックマシンが  $\qquad$ (CMO\_INT32, SM\_popString), (CMO\_INT32, SM\_mathcap), \\
 命令コード 2, 3, 5, 7, 11 番を利用可能  $\qquad$ (CMO\_INT32, SM\_executeStringByLocalParser)) \\
 (実際にはこのような命令コードは存在しない)であれば、 $B$ の部分は  $\quad$ (CMO\_LIST, $1$, (CMO\_LIST, $2$, (CMO\_INT32, OX\_DATA), \\
 \begin{tabular}{|c|c|c|c|c|} \hline  $\qquad$ (CMO\_LIST, $4$, (CMO\_INT32, CMO\_INT32), \\
 2 & 3 & 5 & 7 & 11 \\ \hline  $\qquad\quad$ (CMO\_INT32, CMO\_STRING), (CMO\_INT32, CMO\_MATHCAP), \\
 \end{tabular}  $\qquad\quad$ (CMO\_INT32, CMO\_LIST))))))
 となり、  \end{quote}
 CMO 形式の 32 ビット整数、文字列、 mathcap 、リスト構造のみが  になる.
 受け取れるときには、 $C$ の部分は  
   
 \begin{tabular}{|c|} \hline  
         \\[-5mm]  
         \begin{tabular}{|c|c|} \hline  
                 & \\[-5mm]  
                 OX\_DATA &  
                 \begin{tabular}{|c|c|c|c|} \hline  
                 CMO\_INT32 & CMO\_STRING & CMO\_MATHCAP & CMO\_LIST \\ \hline  
                 \end{tabular} \\[0.8mm] \hline  
         \end{tabular} \\[1.4mm] \hline  
 \end{tabular}  
   
 となる。  \section{セキュリティ対策}
 CMO\_ZZ がないので、このサーバは多倍長整数が  
 送られてこないことを期待している。  
   
 なお、データが受け取れることと、  OpenXM 規約は TCP/IP を用いて通信を行うことを考慮している.  したがって
 データの論理構造が理解できることとはまったく別物であるので  ネットワークによって接続される現代の多くのソフトウェアと同様, OpenXM 規
 注意する必要がある。  約もまた通信時のセキュリティについて注意している.  以下, このことについ
   て説明しよう.
   
   第一に OpenXM では侵入者に攻撃の機会をできるだけ与えないようにするため,
   サーバは接続が必要になった時のみ起動している.  しかし, これだけでは接続
   を行なう一瞬のすきを狙われる可能性もある.  そこで接続を行なう時に, 接続
   を行なうポート番号を毎回変えている.  こうすることで, 特定のポート番号を
   狙って接続を行なう手口を防ぐことができる.
   
 \section{セキュリティ対策}  さらにもう一段安全性を高めるために, 接続時に一時パスワードをクライアント
   が作成し, そのパスワードを使って認証を行なう.  このパスワードは一旦使用
   されれば無効になるので, もし仮になんらかの手段でパスワードが洩れたとして
   も安全である.
   
 OpenXM 規約は TCP/IP を用いて通信を行うことを考慮している。  なお, メッセージ自体には特に暗号化などの処置を行っていないので, そのまま
 ネットワークによって接続される現代の多くのソフトウェアと同様、  ではパケット盗聴などを受ける可能性がある.  現在の実装では, 必要ならば
 OpenXM 規約もまた通信時のセキュリティについて注意している。  ssh を利用して対応している.
 以下、このことについて説明しよう。  
   
 {\large\bf 意味不明なことを書いているが、}  
   
 侵入者に攻撃の機会をできるだけ与えないようするた  \section{OpenXM 以外のプロジェクト}\label{sec:other}
 めに、接続が必要になった時のみ接続を待つようにし、  
 常に接続に関与するといったことは避けている(やっぱり意味不明である)。  
   
 また、侵入者が接続を行なう一瞬のすきを狙ってくる可能性もあるので、  OpenXM 以外にも数式処理システム間の通信や数学データの共通表現を目指した
 接続を行なう時に接続を待つポート番号をランダムに決めている(誰が決めてい  プロジェクトは存在する.  ここでは他のプロジェクトについても触れておこう.
 るのかはやっぱり不明であるが)。  
 さらにもう一段安全性を高めるために、  
 接続時に 1 回だけ使用可能なパスワードを作成し、  
 そのパスワードを使って認証を行なう(誰がパスワードを決めて誰が認証を行っ  
 ているのかが不明だけど)。  
 このパスワードは一旦使用されれば無効にするので、  
 もし仮になんらかの手段でパスワードが洩れたとしても安全だと考えている。  
   
 %なお、上記のポート番号とパスワードは安全な手段で送られて  \begin{itemize}
 %いると仮定している。  \item ESPRIT OpenMath Project
 %また、同一のコンピュータ上に悪意のあるユーザはいないと仮定している  
 %ことに注意しなければならない。  
 %なぜなら、現在の実装ではサーバ、およびクライアントの動作している  
 %コンピュータ上ではこのポート番号とパスワードがわかってしまうためである。  
   
 なお、接続が確立した後のメッセージの送受信に関しては、  http://www.nag.co.uk/projects/openmath/omsoc/
 特に暗号化などの処置を行っているわけではない。  
 もし必要があれば、通信路の暗号化を行なう機能がある  
 ソフトウェア ssh を使うことを考えている。  
   
 \section{他のプロジェクト}  数学的対象の SGML 的表記の標準化を目指した大規模なプロジェクト.  このプ
   ロジェクトでは数学データを数学的意味を保ったままで如何に表現すべきかとい
   う問題を追求している.  したがって既存の表現, 例えば \TeX による数式の表
   現と OpenMath による数式の表現とでは, 本質的に意味が異なる.  OpenMath で
   定義された表現は, 異なる種類の数式処理システムの間で情報を交換するときに
   利用することができる.  しかしながら, 数学システム同士の通信, 例えばある
   数学システムから別の数学システムを呼び出して計算させる方法などは, このプ
   ロジェクトの対象外である. OpenXM における共通データ形式と数学システム固
   有のオブジェクトとの変換は OpenMath 規約の Phrasebook と同じアイデアを用
   いている.
   
 他のプロジェクトについても触れておこう。  
   
 OpenMath プロジェクトは数学的なオブジェクトを  \item NetSolve
 コンピュータ上で表現する方法を決定している。  
 各ソフトウェア間でオブジェクトを交換する際の  
 オブジェクトの変換手順についても述べられている。  
 表現方法は一つだけでなく、 XML 表現や binary 表現などが  
 用意されている。  
 詳細は  
   
 http://www.openmath.org/omsoc/index.html A.M.Cohen  http://www.cs.utk.edu/netsolve/
   
   NetSolve はクライアント・サーバ型の分散システムであり, 単なる計算システ
   ム以上のものを目指している.  クライアントは必要に応じて, サーバを呼び出
   して計算をさせる.  NetSolve の特徴は, サーバの呼び出しに Agent というソ
   フトウェアを介在させることである.  Agent は呼び出し先などを決定するデー
   タベース的役割を果たす.  また Agent によって負荷分散が可能になる.  現在
   の NetSolve は RPC を基礎にして実装されている.
   
 以下は書いてる途中。  
   
 NetSolve  \item MP (Multi Project)
   
 http://www.cs.utk.edu/netsolve/  http://symbolicnet.mcs.kent.edu/SN/areas/protocols/mp.html
   
   数学的なデータの共通表現を提供するプロジェクト.  MP の主な関心は, この
   共通表現の最適化である.  数学システム間で, 命令を送信したりデータを受
   け渡す仕組み(control integration)は, このプロジェクトの対象外である.
   MP は既存の control integration に対して補完的役割を果たす.
   
 MP  MP では数式を構文木の一種(annotated syntax tree)と捉える.  annotated
   syntax tree には数学的な意味を保ったまま表現されているという特徴がある
   (この点は OpenMath と似ている).  MP が提供する共通表現とは, この構文木の
   バイナリエンコーディング, つまりバイト列での表現のことである.  MP の定義
   する表現ではバイト列の長さが最適化されている.  また, バイトオーダーの選
   択も可能である(\ref{sec:messages} 節参照のこと).
   
 http://symbolicNet.mcs.kent.edu/SN/areas/protocols/mp.html  このプロジェクトでは C 言語および GNU Common Lisp で実装を行なっている.
   C 言語による実装(MP-C ライブラリ)は上記のウェブページから収得可能である.
   このライブラリを用いて通信を行なうには, なんらかの control integration
   が必要である.  control integration としては, ソケット, MPI, PVM などが利
   用できる.
   
   
 MCP  \item MCP (Mathematical Computation Protocol)
   
 http://horse.mcs.kent.edu/~pwang/  http://horse.mcs.kent.edu/\~{}pwang/
   
   数学的なデータや命令を含むメッセージをやりとりするための
   HTTP に似たプロトコル.
   MCP は control integration であり,
   クライアント・サーバ型の通信モデルを採用している.
   MCP のメッセージはヘッダとボディから構成されている.
   ヘッダはテキストであり, 最初に現れる空行でヘッダとボディは
   区切られている.
   
   数式はボディに記述されて送られる.
   数式の表現方法としては MP や OpenMath で定められたものを
   使用することが考えられている.
   実際, 数式の表現に OpenMath 規約の XML 表現を用いた実装があり,
   GAP と Axiom の間で通信が行なわれている.
   この場合, MCP によって送信されるメッセージは
   ボディに OpenMath 形式で数式を記述したテキストである.
   
   \end{itemize}
   
   
 \section{現在提供されているソフトウェア}  \section{現在提供されているソフトウェア}
   
 現在 OpenXM 規格に対応しているクライアントには  現在 OpenXM 規約に対応しているクライアントにはasir, sm1, Mathematica が
 asir, sm1, Mathematica がある。  ある.  これらのクライアントから OpenXM 規約に対応したサーバを呼び出すこ
 これらのクライアントから  とができる.  また OpenXM 規約に対応しているサーバには, asir, sm1,
 OpenXM 規格に対応したサーバを呼び出すことができる。  Mathematica, gnuplot, PHC pack などがあり, それぞれ ox\_asir, ox\_sm1,
 現在 OpenXM 規約に対応しているサーバソフトウェアには、  ox\_math, ox\_sm1\_gnuplot, ox\_sm1\_phc という名前で提供されている.
  asir, sm1, gnuplot, Mathematica などがあり、  さらに OpenMath 規約の XML 表現で表現されたオブジェクトと CMO 形式のオブ
 それぞれ ox\_asir, ox\_sm1, ox\_sm1\_gnuplot, ox\_math  ジェクトを相互変換するソフトウェアが JAVA によって実装されており,
 という名前で提供されている。  OMproxy という名前で提供されている.
 また、 OpenMath 規格の XML 表現で表現されたオブジェクトと CMO 形式の  
 オブジェクトを変換するソフトウェアが JAVA によって実装されており、  
 OMproxy という名前で提供されている。  
   
 \begin{thebibliography}{99}  \begin{thebibliography}{99}
   \bibitem{OpenMath1.0}
   O. Caprotti, A. M. Cohen: The OpenMath Standard, February 1999.
   (http://www.nag.co.uk/projects/OpenMath/omstd/partI.ps.gz)
   
   \bibitem{NetSolve1.2b}
   H. Casanova, J. Dongarra, A. Karainov, J. Wasniewski:
   Users' Guide to NetSolve, October 27 1998.
   (http://www.cs.utk.edu/netsolve/download/ug.ps)
   
   \bibitem{MP}
   S. Gray, N. Kajler, P. S. Wang:
   Design and Implementation of MP,
   a Protocol for Efficient Exchange of Mathematical Expressions,
   {\it Journal of Symbolic Computation}, {\bf 11}, 1996, 1--25.
   (ftp://ftp.mcs.kent.edu/dist/MP/mp-jsc-96.ps.gz)
   
 \bibitem{OpenXM-1999}  \bibitem{OpenXM-1999}
 野呂正行, 高山信毅:  野呂 正行, 高山 信毅: {Open XM の設計と実装 --- Open message eXchange protocol for Mathematics}, December 31 1999.
 {Open XM の設計と実装 --- Open message eXchange protocol for Mathematics},  (http://www.math.sci.kobe-u.ac.jp/openxxx/openxm-jp.tex)
 1999/11/22  
 \bibitem{Ohara-Takayama-Noro-1999}  \bibitem{Ohara-Takayama-Noro-1999}
 小原功任, 高山信毅, 野呂正行:  小原 功任, 高山 信毅, 野呂 正行: Open asir 入門,
 {Open asir 入門}, 1999, 数式処理, Vol 7, No 2, 2--17. (ISBN4-87243-086-7, SEG 出版, Tokyo).  {\it 数式処理}, {\bf Vol 7}(No 2), 1999, 2--17.
   (ISBN 4-87243-086-7, SEG 出版, Tokyo).
   
   \bibitem{ISSAC99}
   P. S. Wang:
   Design and Protocol for Internet Accessible Mathematical Computation,
   {\it Proceedings of the 1999 International Symposium on Symbolic and Algebraic Computation}, 1999, 291--298.
   (ISBN 1-58113-073-2, ACM, New York 1999.).
   
 \end{thebibliography}  \end{thebibliography}
   
 \end{document}  \end{document}

Legend:
Removed from v.1.65  
changed lines
  Added in v.1.124

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