=================================================================== RCS file: /home/cvs/OpenXM/doc/Attic/genkou19991125.tex,v retrieving revision 1.6 retrieving revision 1.121 diff -u -p -r1.6 -r1.121 --- OpenXM/doc/Attic/genkou19991125.tex 1999/12/18 15:11:12 1.6 +++ OpenXM/doc/Attic/genkou19991125.tex 2000/01/07 08:24:52 1.121 @@ -1,168 +1,555 @@ \documentclass{jarticle} -\title{\bf Open XM($B%?%$%H%kL$Dj(B)} -\author{ - Maekawa \\ - Noro \\ - : \\ - : \\ -} -\date{ 1999$BG/(B, 11$B7n(B25$BF|(B} +%% $OpenXM: OpenXM/doc/genkou19991125.tex,v 1.120 2000/01/07 06:04:13 tam Exp $ -%\pagestyle{empty} +\usepackage{jssac} +\title{OpenXM プロジェクトの現状について} +\author{奥 谷   行 央\affil{神戸大学大学院自然科学研究科} + \mail{okutani@math.sci.kobe-u.ac.jp} + \and 小 原   功 任\affil{金沢大学理学部} + \mail{ohara@kappa.s.kanazawa-u.ac.jp} + \and 高 山   信 毅\affil{神戸大学理学部} + \mail{takayama@math.sci.kobe-u.ac.jp} + \and 田 村   恭 士\affil{神戸大学大学院自然科学研究科} + \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{} + \begin{document} \maketitle -\section{OpenXM $B$N7W;;%b%G%k(B} +\section{OpenXMとは} -OpenXM $B$O?t3X%=%U%H4V$G%a%C%;!<%8$r8r49$9$k$?$a$N5,Ls$G$"$k!#(B -OpenXM $B$H$O(B Open message eXchange protocol for Mathematics $B$NN,$G$"$k!#(B -$B?t3X%=%U%H4V$G%a%C%;!<%8$r$d$j$H$j$5$;$k$3$H$K$h$j!"(B -$B$"$k?t3X%=%U%H$+$iB>$N?t3X%=%U%H$r8F$S=P$7$F7W;;$r9T$J$C$?$j!"(B -$BB>$N%^%7%s$G7W;;$r9T$J$o$;$?$j$G$-$k$h$&$K$9$k!#(B -$BH/C<$OLnO$@59T$H9b;3?.5#$K$h$j!"(B asir $B$H(B kan/sm1 $B$r(B -$BAj8_$K8F$S=P$95!G=$r$N?t3X%=%U%H$r;H$($k$h$&$K$9$k$3$H$G$"$k!#(B +OpenXM は数学プロセス間でメッセージを交換するための規約である. 数学プロ +セス間でメッセージをやりとりすることにより, ある数学プロセスから他の数学 +プロセスを呼び出して計算を行なったり, 他のマシンで計算を行なわせたりする +ことが目的である. なお, OpenXM とは Open message eXchange protocol for +Mathematics の略である. OpenXM の開発の発端は野呂と高山により, asir と +kan/sm1 を相互に呼び出す機能を実装したことである. -$BH/C<$H$J$C$?(B asir $B$H(B kan/sm1 $B$G$N$N7A<0$r$b(B -$B07$($k$h$&$K$7$F$"$k!#(B +現在の OpenXM 規約では共通表現形式によるメッセージを用いている. 上記の +文字列を送る方法の利点を生かすため, OpenXM 規約では共通表現形式の中の文 +字列として, ローカル言語の文法に従った文字列を用いたメッセージの交換も可 +能となっている. +OpenXM 規約では通信の方法に自由度があるが, 現在のところは TCP/IP を用い +た通信しか実装されていない. +\footnote{ただし asir には MPI を用いた実装もある.} +そこで, この論文では TCP/IP を用いた実装に準拠してOpenXM の説明をする. -\section{OpenXM $B$N%a%C%;!<%8$N9=B$(B} -OpenXM $B$G5,Dj$7$F$$$k%a%C%;!<%8$OO@M}E*$K(B -OX $BAX!"(B SM $BAX!"(B CMO $BAX$KJ,$1$k$3$H$,$G$-$k!#(B -$B$3$NCf$G!"%a%C%;!<%8$H$7$FAw$k$3$H$,2DG=$J$N$O(B -OX $BAX$GDj5A$5$l$?$b$N$@$1$G$"$j!"(B -SM $BAX!"(B CMO $BAX$GDj5A$5$l$F$$$k%G!<%?$O(B -OX $BAX$GDj5A$5$l$F$$$k%G!<%?$N0lIt$KKd$a9~$^$l$F(B -$BAw$i$l$k!#(B -SM $BAX!"(B CMO $BAX$GDj5A$5$l$F$$$k%G!<%?0J30$K$b(B -$BA0=R$N(B MP $B$d(B OpenMath $B$N(B XML, binary $BI=8=$b(B -OX $BAX$KKd$a9~$^$l$FAw$i$l$k$o$1$G$"$k$,!"(B -$B$I$N$h$&$J%G!<%?$,Kd$a9~$^$l$F$$$k$+$O!"(B -OX $BAX$N@hF,$N(B tag $B$r8+$l$PH=JL$G$-$k$h$&$K$J$C$F$$$k!#(B +\section{OpenXM のメッセージの構造}\label{sec:messages} +通信の方法によってメッセージの構造は変わる. この論文では TCP/IP の場合 +についてのみ説明を行なう. -\section{OpenXM $B$N7W;;$N?J9TJ}K!(B} +OpenXM 規約で規定されているメッセージはバイトストリームとなっており, 次 +のような構造になっている. +\begin{center} +\begin{tabular}{|c|c|} +\hline +ヘッダ & \hspace{10mm} ボディ \hspace{10mm} \\ +\hline +\end{tabular} +\end{center} +ヘッダの長さは 8 バイトであると定められている. ボディの長さはメッセージ +ごとに異なっているが, 長さは $0$ でもよい. -OpenXM $B5,Ls$G$N%a%C%;!<%8$N8r49$O%5!<%P$H%/%i%$%"%s%H$N4V$G(B -$B9T$J$o$l$k!#%/%i%$%"%s%H$+$i%5!<%P$X7W;;$5$;$?$$%G!<%?$r(B -$B%a%C%;!<%8$H$7$FAw$j!"Dj$5$l$F$*$j!"l9g$K$O!"$=$l$KBP1~$9$kF0:n$r9T$J$&!#(B -$B$3$N$H$-!"I,MW$,$"$l$P%5!<%P$O%9%?%C%/$+$i%G!<%?$rl9g!"(B -$B%5!<%P$OF0:n$N7k2L$r%9%?%C%/$K@Q$s$G$$$k!#(B -$B%5!<%P$K9T$J$o$;$?F0:n$N7k2L$r%/%i%$%"%s%H$,CN$j$?$$>l9g!"(B -$B%9%?%C%/$+$i%G!<%?$rl9g!"(B -CMO $BAX$GDj5A$5$l$F$$$kB?G\D9@0?t$rM}2r$7$F$*$/$H!"(B -CMO $BAX$NB>$N%G!<%?9=B$$@$1$G$J$/!"(B OX $BAX!"(B SM $BAX$N%G!<%?$r(B -$BM}2r$9$k=u$1$K$J$k$H;W$($k$N$G!"(B CMO $BAX$NB?G\D9@0?t$N(B -$B%G!<%?9=B$$K$D$$$F@bL@$9$k!#(B +OpenXM 規約ではサーバはスタックマシンであると定義している. 以下, OpenXM +スタックマシンと呼ぶ. この節ではOpenXM スタックマシンの構造について説明 +しよう. -CMO $BAX$GDj5A$5$l$F$$$k%G!<%?$OB?G\D9@0?t0J30$K$b(B -$BJ8;zNs$d%j%9%H$J$I$,$"$k!#$I$N$h$&$J%G!<%?$G$"$k$+$O(B -$B%G!<%?$N@hF,$K$"$k(B tag $B$r8+$l$PH=JL$G$-$k$h$&$K$J$C$F$$$k!#(B -$B$3$l$O(B OX $BAX$G$N%G!<%?$NH=JL$N;EJ}$H$*$J$8$G$"$k!#(B -$B$J$*!"(B tag $B$O3F%G!<%?Kh$K(B 32 bit $B$N@0?t$GI=$5$l$F$*$j!"(B -$BB?G\D9@0?t$O(B 20 $B$H$J$C$F$$$k!#(B -$B$3$3$G(B 32 bit $B$N@0?t$NI=8=J}K!$K$D$$$F@bL@$9$kI,MW$,$"$k!#(B -%$B:r:#$N%3%s%T%e!<%?;v>p$+$i!"(B -%32 bit $B@0?t$b(B 8 bit $BC10L$G07$&$[$&$,ET9g$,$h$$!#(B -OpenXM $B$G$O(B 8 bit $BC10L$G(B $( \mbox{\tt 00 00 00 14})_{2^8}$ $B$HI=$9J}K!$H(B -$( \mbox{\tt 14 00 00 00})_{2^8}$ $B$HI=$9J}K!$,$"$k!#(B -$B$3$NI=8=J}K!$N0c$$$O%/%i%$%"%s%H$H%5!<%P$N:G=i$N@\B3;~$K(B -$BAPJ}$N9g0U$G7hDj$9$k$3$H$K$J$C$F$$$k!#$J$*!"9g0U$,$J$$>l9g$K$O(B -$BA0l9g$N7e?t$r(B $n$ $B$H(B -$B$7$?$H$-!"l9g$N7e?t$H$H$C$F$b$h$$!#(B -$B$?$@$7!"I=8=$7$?$$?t$,Ii$N>l9g$O$3$N(B 32 bit $B$N@0?tCM$O(B 2 $B$NJd?tI=8=$GIi$K$J$k!#(B +次に OpenXM スタックマシンの命令コードについて説明する. OpenXM スタック +マシンにおけるすべての命令は 4 バイトの長さを持つ. OpenXM 規約の他の規 +定と同様に, 4 バイトのデータは32ビット整数と見なされるので, この論文でも +その表記にしたがう. OpenXM スタックマシンに対する命令はスタックに積まれ +ることはない. 現在のところ, OpenXM 規約では以下の命令が定義されている. -%$BI=8=$7$?$$B?G\D9@0?t$,Ii$G$"$C$F$b$3$l0J9_$N@bL@$O@5$N>l9g$H(B -%$BJQ$o$i$J$$$N$G!"0J8eB?G\D9@0?t$O@5$H$_$J$9!#(B +\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} -$BI=8=$7$?$$B?G\D9@0?t$N@dBPCM$,(B $2^{32}$ $B?J?t$G(B $(b_0 b_1 ...)_{2^{32}}$ -$B$HI=$;$k$H$-!"$N%W%m%8%'%/%H(B} +さて, この記法のもとで cmo\_int32 を次のデータ構造であると定義する. +\begin{quote} +cmo\_int32 := (CMO\_INT32, {\sl int32}) +\end{quote} +同様に, cmo\_null, cmo\_string, cmo\_list, cmo\_mathcap のシンタッ +クスは次のように定義される. +\begin{quote} +cmo\_null := (CMO\_NULL) \\ +cmo\_string := (CMO\_STRING, {\sl int32} $n$, {\sl string} $s$) \\ +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{$B8=:_Ds6!$5$l$F$$$k%=%U%H%&%'%"(B} +\section{mathcap について} + +OpenXM 規約では, 通信時に用いられるメッセージの種類を各ソフトウェアが制 +限する方法を用意している. これは各ソフトウェアの実装によってはすべての +メッセージをサポートするのが困難な場合があるからである. また, 各ソフト +ウェアでメッセージの種類を拡張したい場合にも有効である. この制限(あるい +は拡張) は mathcap と呼ばれるデータ構造によって行われる. この節では +mathcap のデータ構造と, 具体的なメッセージの制限の手続きについて説明する. + +まず, 手続きについて説明しよう. + +第一にサーバの機能を制限するには次のようにする. クライアントが mathcap +オブジェクトをサーバへ送ると, サーバは受け取ったmathcap をスタックに積む. +次にクライアントが命令 SM\_setMathCap を送ると, サーバはスタックの最上位 +に積まれている mathcap オブジェクトを取り出し, mathcap で設定されていな +いメッセージをクライアントへ送らないように制限を行う. + +第二にクライアントを制限するには次のようにする. まず, クライアントがサー +バに命令 SM\_mathcap を送ると, サーバは mathcap オブジェクトをスタックに +積む. さらに命令 SM\_popCMO を送ると, サーバはスタックの最上位のオブジェ +クト(すなわち mathcap オブジェクト)をボディとするメッセージをクライアン +トに送付する. クライアントはそのオブジェクトを解析して, 制限をかける. + +次に mathcap のデータ構造について説明する. +mathcap は cmo の一種であるので, すでに説明したように +\begin{quote} +cmo\_mathcap := (CMO\_MATHCAP, {\sl cmo\_list}) +\end{quote} +の構造をもつ(\ref{sec:cmo} 節を参照のこと). +ボディは cmo\_list オブジェクトでなければならない. + +さて, mathcap オブジェクトのボディの cmo\_list オブジェクトは以下の条件 +を満たすことを要求される. まず, その cmo\_list オブジェクトは少なくとも +リスト長が 3 以上でなければならない. +\begin{quote} +(CMO\_LIST, {\sl int32}, {\sl cmo} $a$, {\sl cmo} $b$, {\sl cmo} $c$, $\ldots$) +\end{quote} + +第一要素 $a$ はまた cmo\_list であり, リスト長は 4 以上, $a_1$ は +cmo\_int32 でバージョンを表す. $a_2$, $a_3$, $a_4$ は cmo\_string であ +り, それぞれ数学システムの名前, バージョン, HOSTTYPE を表すことになって +いる. +\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} + +第二要素 $b$ も cmo\_list であり, OpenXM スタックマシンを制御するために +用いられる. 各 $b_i$ は cmo\_int32 であり, ボディはスタックマシンの命令 +コードである. \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} + +第三要素 $c$ は以下のような cmo\_list であり, オブジェクトの送受信を制御 +するために用いられる. 送受信の制御はメッセージの種類ごとに行われる. +\begin{quote} +(CMO\_LIST, {\sl int32} $m$, {\sl cmo\_list} $\ell_1$, $\ldots$, +{\sl cmo\_list} $\ell_m$) +\end{quote} +各 $\ell_i$ が制御のための情報を表す. どの $\ell_i$ も一つ以上の要素を +持っており, 第一要素は必ず cmo\_int32 となっていなければならない. これ +は制御すべきメッセージの識別子を入れるためである. + +各 $\ell_i$ の構造はメッセージの種類によって異なる. ここでは, OX\_DATA +の場合についてのみ説明する. 第一要素が OX\_DATA の場合, リスト $\ell_i$ +は以下のような構造となっている. 各 $c_i$ は cmo\_int32 であり, そのボディ +は CMO の識別子である. $c_i$ で指示された 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 の例をあげよう. 名前が ``ox\_test'', バージョンナンバー +が 199911250 のサーバで, Linux 上で動いており, このサーバのスタックマシ +ンが命令 SM\_popCMO, SM\_popString, SM\_mathcap, +SM\_executeStringByLocalParser を利用可能で, かつ オブジェクトを +cmo\_int32, cmo\_string, cmo\_mathcap, cmo\_list のみに制限したいときの +mathcap は +\begin{quote} +(CMO\_MATHCAP, (CMO\_LIST, 3, \\ +$\quad$ (CMO\_LIST, 4, (CMO\_INT32, $199911250$), (CMO\_STRING, 7, ``ox\_test''), \\ +$\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), \\ +$\qquad$ (CMO\_INT32, SM\_executeStringByLocalParser)) \\ +$\quad$ (CMO\_LIST, $1$, (CMO\_LIST, $2$, (CMO\_INT32, OX\_DATA), \\ +$\qquad$ (CMO\_LIST, $4$, (CMO\_INT32, CMO\_INT32), \\ +$\qquad\quad$ (CMO\_INT32, CMO\_STRING), (CMO\_INT32, CMO\_MATHCAP), \\ +$\qquad\quad$ (CMO\_INT32, CMO\_LIST)))))) +\end{quote} +になる. + + +\section{セキュリティ対策} + +OpenXM 規約は TCP/IP を用いて通信を行うことを考慮している. したがって +ネットワークによって接続される現代の多くのソフトウェアと同様, OpenXM 規 +約もまた通信時のセキュリティについて注意している. 以下, このことについ +て説明しよう. + +第一に OpenXM では侵入者に攻撃の機会をできるだけ与えないようにするため, +サーバは接続が必要になった時のみ起動している. しかし, これだけでは接続 +を行なう一瞬のすきを狙われる可能性もある. そこで接続を行なう時に, 接続 +を行なうポート番号を毎回変えている. こうすることで, 特定のポート番号を +狙って接続を行なう手口を防ぐことができる. + +さらにもう一段安全性を高めるために, 接続時に一時パスワードをクライアント +が作成し, そのパスワードを使って認証を行なう. このパスワードは一旦使用 +されれば無効になるので, もし仮になんらかの手段でパスワードが洩れたとして +も安全である. + +なお, メッセージ自体には特に暗号化などの処置を行っていないので, そのまま +ではパケット盗聴などを受ける可能性がある. 現在の実装では, 必要ならば +ssh を利用して対応している. + + +\section{OpenXM 以外のプロジェクト}\label{sec:other} + +OpenXM 以外にも数式処理システム間の通信や数学データの共通表現を目指した +プロジェクトは存在する. ここでは他のプロジェクトについても触れておこう. + +\begin{itemize} +\item ESPRIT OpenMath Project + +http://www.nag.co.uk/projects/openmath/omsoc/ + +数学的対象の SGML 的表記の標準化を目指した大規模なプロジェクト. このプ +ロジェクトでは数学データを数学的意味を保ったままで如何に表現すべきかとい +う問題を追求している. したがって既存の表現, 例えば \TeX による数式の表 +現と OpenMath による数式の表現とでは, 本質的に意味が異なる. OpenMath で +定義された表現は, 異なる種類の数式処理システムの間で情報を交換するときに +利用することができる. しかしながら, 数学システム同士の通信, 例えばある +数学システムから別の数学システムを呼び出して計算させる方法などは, このプ +ロジェクトの対象外である. OpenXM における共通データ形式と数学システム固 +有のオブジェクトとの変換は OpenMath 規約の Phrasebook と同じアイデアを用 +いている. + + +\item NetSolve + +http://www.cs.utk.edu/netsolve/ + +NetSolve はクライアント・サーバ型の分散システムであり, 単なる計算システ +ム以上のものを目指している. クライアントは必要に応じて, サーバを呼び出 +して計算をさせる. NetSolve の特徴は, サーバの呼び出しに Agent というソ +フトウェアを介在させることである. Agent は呼び出し先などを決定するデー +タベース的役割を果たす. また Agent によって負荷分散が可能になる. 現在 +の NetSolve は RPC を基礎にして実装されている. + + +\item MP (Multi Project) + +http://symbolicnet.mcs.kent.edu/SN/areas/protocols/mp.html + +数学的なデータの共通表現を提供するプロジェクト. MP の主な関心は, この +共通表現の最適化である. 数学システム間で, 命令を送信したりデータを受 +け渡す仕組み(control integration)は, このプロジェクトの対象外である. +MP は既存の control integration に対して補完的役割を果たす. + +MP では数式を構文木の一種(annotated syntax tree)と捉える. annotated +syntax tree には数学的な意味を保ったまま表現されているという特徴がある +(この点は OpenMath と似ている). MP が提供する共通表現とは, この構文木の +バイナリエンコーディング, つまりバイト列での表現のことである. MP の定義 +する表現ではバイト列の長さが最適化されている. また, バイトオーダーの選 +択も可能である(\ref{sec:messages} 節参照のこと). + +このプロジェクトでは C 言語および GNU Common Lisp で実装を行なっている. +C 言語による実装(MP-C ライブラリ)は上記のウェブページから収得可能である. +このライブラリを用いて通信を行なうには, なんらかの control integration +が必要である. control integration としては, ソケット, MPI, PVM などが利 +用できる. + + +\item MCP (Mathematical Computation Protocol) + +http://horse.mcs.kent.edu/\~{}pwang/ + +数学的なデータや命令を含むメッセージをやりとりするための +HTTP に似たプロトコル. +MCP は control integration であり, +クライアント・サーバ型の通信モデルを採用している. +MCP のメッセージはヘッダとボディから構成されている. +ヘッダはテキストであり, 最初に現れる空行でヘッダとボディは +区切られている. + +数式はボディに記述されて送られる. +数式の表現方法としては MP や OpenMath で定められたものを +使用することが考えられている. +実際, 数式の表現に OpenMath 規約の XML 表現を用いた実装があり, +GAP と Axiom の間で通信が行なわれている. +この場合, MCP によって送信されるメッセージは +ボディに OpenMath 形式で数式を記述したテキストである. + +\end{itemize} + + +\section{現在提供されているソフトウェア} + +現在 OpenXM 規約に対応しているクライアントにはasir, sm1, Mathematica が +ある. これらのクライアントから OpenXM 規約に対応したサーバを呼び出すこ +とができる. また OpenXM 規約に対応しているサーバには, asir, sm1, +Mathematica, gnuplot, PHC pack などがあり, それぞれ ox\_asir, ox\_sm1, +ox\_math, ox\_sm1\_gnuplot, ox\_sm1\_phc という名前で提供されている. +さらに OpenMath 規約の XML 表現で表現されたオブジェクトと CMO 形式のオブ +ジェクトを相互変換するソフトウェアが JAVA によって実装されており, +OMproxy という名前で提供されている. + +\begin{thebibliography}{99} +\bibitem{NetSolve1.2b} +Henri Casanova, Jack Dongarra, Alexander Karainov, Jerzy Wasniewski: +Users' Guide to NetSolve, version 1.2.beta, October 27 1998. +(http://www.cs.utk.edu/netsolve/download/ug.ps) + +\bibitem{Ohara-Takayama-Noro-1999} +小原 功任, 高山 信毅, 野呂 正行: Open asir 入門, +{\it 数式処理}, {\bf Vol 7}(No 2), 1999, 2--17. +(ISBN 4-87243-086-7, SEG 出版, Tokyo). + +\bibitem{OpenXM-1999} +野呂 正行, 高山 信毅: {Open XM の設計と実装 --- Open message eXchange protocol for Mathematics}, 1999/11/22 +(http://www.math.sci.kobe-u.ac.jp/openxxx/openxxx.tex) + +\bibitem{OpenMath1.0} +O. Caprotti, A. M. Cohen: The OpenMath Standard, Version 1.0, February 1999. +(http://www.nag.co.uk/projects/OpenMath/omstd/partI.ps.gz) + +\bibitem{ISSAC99} +Paul 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. Order No. 505990). + +\bibitem{MP} +Simon Gray, Norbert Kajler, Paul S. Wang: +Design and Implementation of MP, +a Protocol for Efficient Exchange of Mathematical Expressions, +{\it Journal of Symbolic Computation}, 1996. +(ftp://ftp.mcs.kent.edu/dist/MP/mp-jsc-96.ps.gz) + +\end{thebibliography} \end{document}