=================================================================== RCS file: /home/cvs/OpenXM/doc/Attic/genkou19991125.tex,v retrieving revision 1.21 retrieving revision 1.85 diff -u -p -r1.21 -r1.85 --- OpenXM/doc/Attic/genkou19991125.tex 1999/12/20 11:02:00 1.21 +++ OpenXM/doc/Attic/genkou19991125.tex 1999/12/25 10:00:48 1.85 @@ -1,291 +1,633 @@ \documentclass{jarticle} -\title{\bf Open XM($B%?%$%H%kL$Dj(B)} -\author{ -Maekawa, Masahide (Oct., 1999 -- : CVS server) \\ -Noro, Masayuki (Jan., 1996 -- : OpenXM Protocol, asir99) \\ -Ohara, Katsuyoshi (Jan., 1998 -- : ox\_math) \\ -Okutani, Yukio (Oct., 1999 -- : asir contrib) \\ -Takayama, Nobuki (Jan., 1996 -- : OpenXM Protocol, kan) \\ -Tamura, Yasushi (Nov., 1998 -- : OpenMath proxy) \\ +%% $OpenXM: OpenXM/doc/genkou19991125.tex,v 1.84 1999/12/25 09:05:48 tam Exp $ + +\usepackage{jssac} +\title{ +1. 意味もない修飾過剰な語句は排除しましょう. \\ +2. せっかく fill しているのをいじらないでくれ. \\ +3. 田村が遊んでばかりでおればかり仕事をしているのはどう考えても不公平だ. +なんで仕事をしないのか, いい加減仕事をしろ, 田村. \\ +3.5 そういうご飯とかつまらない話じゃなくて, commit の情報をみれば田村が +如何に仕事をしていないのかよくわかるよ. \\ +4. いい加減, Section 8 を書け. } -\date{ 1999$BG/(B, 11$B7n(B25$BF|(B} -%\pagestyle{empty} +\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$9$k$3$H$,L\E*$G$"$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 $B5,Ls$G$N%a%C%;!<%8$N8r49$O%5!<%P$H%/%i%$%"%s%H$N4V$G9T$J$o$l$k!#(B -$B%5!<%P$O%9%?%C%/%^%7%s$G$"$k$H2>Dj$5$l$F$*$j!"(B -$B%5!<%P$,%/%i%$%"%s%H$+$il9g!"(B -$B%/%i%$%"%s%H$+$i%5!<%P$X7W;;$5$;$?$$%G!<%?$r%a%C%;!<%8$H$7$FAw$j!"(B -$B$=$7$F$=$N7k2L$r%5!<%P$+$i%a%C%;!<%8$Ge$2$F$$$/$@$1$G!"%5!<%P$O7W;;$r9T$J$*$&$H$O$7$J$$!#(B -$Bl9g!"(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 $B7A<0$GDj5A$5$l$F$$$kB?G\D9@0?t$rM}2r$7$F$*$/$H!"(B -CMO $B7A<0$NB>$N%G!<%?9=B$$@$1$G$J$/!"(B OX $B7A<0!"(B SM $B7A<0$N%G!<%?$r(B -$BM}2r$9$k=u$1$K$J$k$H;W$($k$N$G!"(B CMO $B7A<0$NB?G\D9@0?t$N(B -$B%G!<%?9=B$$K$D$$$F@bL@$9$k!#(B +OpenXM 規約ではサーバはスタックマシンであると定義している. 以下, OpenXM +スタックマシンと呼ぶ. この節ではOpenXM スタックマシンの構造について説明 +しよう. -CMO $B7A<0$GDj5A$5$l$F$$$k%G!<%?$OB?G\D9@0?t0J30$K$b(B -$BJ8;zNs$d%j%9%H9=B$$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%a%C%;!<%8$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 -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!#(B -$B$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 -$BI=8=$7$?$$B?G\D9@0?t$N@dBPCM$,(B $2^{32}$ $B?J?t$G(B $(b_0 b_1 ... b_k)_{2^{32}}$ -$B$HI=$;$k$H$-!"$l(B 32 bit $B$N@0?t$GI=8=$7$?CM$H$J$k!#(B +#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 -$B$3$3$G6qBNNc$r$@$=$&!#(B -$4294967298 = 1 \times 2^{32} + 2$ $B$r(B network byte order $B$NB?G\D9@0?t$G(B -$BI=8=$9$k$H!"(B -\begin{center} - {\tt 00 00 00 14 00 00 00 02 00 00 00 02 00 00 00 01} -\end{center} -$B$H$J$k!#$^$?!"F1$8I=8=J}K!$G(B $-1$ $B$rI=8=$9$k$H!"(B -\begin{center} - {\tt 00 00 00 14 ff ff ff ff 00 00 00 01} -\end{center} -$B$H$J$k!#(B -$B$J$*!"(B GNU MP LIBRARY $B$rMQ$$$k$H!"(B -C $B8@8l$+$iB?G\D9@0?t$dG$0U@:EYIbF0>.?t$r07$&$3$H$,$G$-$k!#(B -$B$3$N(B GNU MP LIBRARY $B$GMQ$$$i$l$F$$$kB?G\D9@0?t$N7A<0$H(B -CMO $B7A<0$NB?G\D9@0?t$N(B tag $B0J9_$N%G!<%?$OA4$/F1$8$K9g$o$;$F$"$k!#(B +#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} -\section{MathCap $B$K$D$$$F(B} +%以下, どういうときに結果をスタックに積むかエラーの場合どうするかの説明が +%必要であろう. -$B%5!<%P$*$h$S%/%i%$%"%s%HAPJ}$H$b$K(B OpenXM $B$G5,Dj$5$l$F$$$k(B -$B$9$Y$F$N%a%C%;!<%8$rM}2r$G$-$k$o$1$G$O$J$$!#(B -$B$=$3$G!"(B OpenXM $B$G$OAjpJs$,F~$C$F$$$k!#(B -%$B$3$N:G=i$NMWAG$,$^$?%j%9%H9=B$$H$J$C$F$*$j!"(B -$B:G=i$NMWAG$O%P!<%8%g%s%J%s%P!<$r!"A0$rI=$7$F$$$k!#(B +この中で CMO\_ERROR2, CMO\_NULL, CMO\_INT32, CMO\_DATUM, CMO\_STRING, +CMO\_MATHCAP, CMO\_LIST で識別されるオブジェクトは最も基本的なオブジェ +クトであって, すべての OpenXM 対応システムに実装されていなければならない. -$BpJs$rI=$7$F$$$k$H$$$C$?$3$H$,M}2r$G$-$k$3$H$H!"(B -$B%G!<%?$,o$K@\B3$rBT$D$3$H$K$h$C$F!"(B -$B?/F~Z$r9T$J$&$h$&$K$J$C$F$$$k!#$3$N%Q%9%o!<%I$O0lC6;HMQ$5$l$k$H(B -$BL58z$K$J$k$N$G!"$b$72>$K$J$s$i$+$Ne$G$O$3$N%Q%9%o!<%I$,$o$+$C$F$7$^$&$?$a!"(B -$BF10l$N%3%s%T%e!<%?>e$K0-0U$N$"$k%f!<%6$O$$$J$$$H2>Dj$7$F$$$k(B -$B$3$H$KCm0U$7$J$1$l$P$J$i$J$$!#(B +% CMO 形式の多倍長整数は, Gnu MPライブラリ等を参考にしており, +% 符号付き絶対値表現を用いている. +% タグ以降の形式は次のようになる. -$B$J$*!"@\B3$,3NN)$7$?8e$N%a%C%;!<%8$NAw0 \\ +% 0 & f=0 \\ +% -1 & f<0 \\ \end{array} \right. \] +% である. -\section{$BB>$N%W%m%8%'%/%H(B} +% ここで具体例をだそう. +% $4294967298 = 1 \times 2^{32} + 2$ を CMO 形式の +% ネットワークバイトオーダー, 多倍長整数で表現すると, +% \begin{center} +% {\tt 00 00 00 14 00 00 00 02 00 00 00 02 00 00 00 01} +% \end{center} +% となる. また, 同じ表現方法で $-1$ を表現すると, +% \begin{center} +% {\tt 00 00 00 14 ff ff ff ff 00 00 00 01} +% \end{center} +% となる. -$BB>$N%W%m%8%'%/%H$K$D$$$F4v$D$+>R2p$9$k!#(B -OpenMath $B%W%m%8%'%/%H$O?t3XE*$J%*%V%8%'%/%H$r(B -$B%3%s%T%e!<%?>e$GI=8=$9$kJ}K!$r7hDj$7$F$$$k!#(B -$B3F%=%U%H%&%'%"4V$G%*%V%8%'%/%H$r8r49$9$k:]$N(B -$B%*%V%8%'%/%H$NJQ49$l(B ox\_asir, ox\_sm1, ox\_math $B$H$$$&L>A0$GDs6!$5$l$F$$$k!#(B -$B$^$?!"(B OpenMath $B5,3J$N(B XML $BI=8=$GI=8=$5$l$?%G!<%?$H(B CMO $B7A<0$N(B -$B%G!<%?$rJQ49$9$k%=%U%H%&%'%"$,(B JAVA $B$K$h$C$FA0$GDs6!$5$l$F$$$k!#(B +次に mathcap のデータ構造について説明する. +mathcap は CMO の一種であるので, すでに説明したように \\ +\begin{tabular}{|c|c|} \hline +ヘッダ & \hspace{10mm} ボディ \hspace{10mm} \\ \hline +\end{tabular} \\ +の構造を持ちヘッダの値は 5 である(\ref{sec:cmo} 節を参照のこと). +ボディは cmo\_list オブジェクトでなければならない. + +%\begin{quote} +% cmo\_mathcap := (CMO\_MATHCAP,{\sl cmo} obj) +%\end{quote} + +さて, 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$ は 32 ビット整数でバージョンナンバーを, +$a_2$, $a_3$, $a_4$ は文字列であり, +それぞれシステムの名前, , 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$ の部分は次のようなリスト構造をしている. +この $b_1$, $b_2$, $\cdots$, $b_n$ はすべて cmo\_int32 である. +\ref{sec:oxsm} 節で説明したが, +スタックマシンへの命令はすべて {\sl int32} で表されていたことに注意しよ +う. 各 $b_i$ は利用可能な命令をボディとした cmo\_int32 となっている. +\begin{quote} + (CMO\_LIST, {\sl int32} $n$, + {\sl cmo\_int32} $b_1$, {\sl cmo\_int32} $b_2$, + $\cdots$, {\sl cmo\_int32} $b_n$) +\end{quote} + +第三要素 $C$ は以下のようなリスト構造をしている. +\begin{quote} + (CMO\_LIST, {\sl int32} $m$, \\ + \hspace{10mm} (CMO\_LIST, {\sl int32} $l_1$, {\sl cmo\_int32} $c_{11}$, + {\sl cmo} $c_{12}$, $\cdots$, {\sl cmo} $c_{1l_1}$) \\ + \hspace{10mm} (CMO\_LIST, {\sl int32} $l_2$, {\sl cmo\_int32} $c_{21}$, + {\sl cmo} $c_{22}$, $\cdots$, {\sl cmo} $c_{1l_2}$) \\ + \hspace{10mm} $\vdots$ \\ + \hspace{10mm} (CMO\_LIST, {\sl int32} $l_m$, {\sl cmo\_int32} $c_{m1}$, + {\sl cmo} $c_{m2}$, $\cdots$, {\sl cmo} $c_{1l_m}$)) +\end{quote} +どの $c_{i1}$ にも cmo\_int32 が入っており, +OX\_COMMAND 以外の, 受け取れるメッセージの識別子が入っている. +$c_{i2}$ 以降については最初の $c_{i1}$ の値によってそれぞれ異なる. +ここでは, OX\_DATA の場合についてのみ説明する. +この $c_{i1}$ が OX\_DATA の場合, +$c_{i1}$, $c_{i2}$, $\cdots$, $c_{il_i}$ を要素とする cmo\_list は +CMO 形式についての情報を表しており, $l_i=2$ と決められている. +$c_{i1}$ にはもちろんのこと OX\_DATA が入っており, +$c_{i2}$ は以下の図のような cmo\_list になっている. +各要素は cmo\_int32 であり, +受け取ることが可能な CMO 形式のタグが入る. +\begin{quote} + (CMO\_LIST, {\sl int32} $k$, + {\sl cmo\_int32} $c_{i21}$, {\sl cmo\_int32} $c_{i22}$, + $\cdots$, {\sl cmo\_int32} $c_{i2k}$) +\end{quote} + +具体的な mathcap の例をあげよう. +名前が ``ox\_test'', バージョンナンバーが 199911250 のサーバで, +PC-UNIX 上で動いていれば, +$A$ の部分は +\begin{quote} +(CMO\_LIST, 4, (CMO\_INT32, $199911250$), (CMO\_STRING, 7, "ox\_test"), + (CMO\_STRING, 9, "199911250"), (CMO\_STRING, 4, "i386")) +\end{quote} +となる. +%({\Large 修正をみて, ただしく直すこと}) + +さらに, このサーバのスタックマシンが +命令 SM\_popCMO, SM\_popString, SM\_mathcap, +SM\_executeStringByLocalParser を利用可能 +%(実際にはこのような命令コードは存在しない) +%{\Large じゃあ書くな} +であれば, $B$ の部分は +\begin{quote} +(CMO\_LIST, {\sl int32} $5$, + (CMO\_INT32, SM\_popCMO), (CMO\_INT32, SM\_popString), + (CMO\_INT32, SM\_mathcap), + (CMO\_INT32, SM\_executeStringByLocalParser)) +\end{quote} +となり, +CMO 形式の 32 ビット整数, 文字列, mathcap , リスト構造のみが +受け取れるときには, $C$ の部分は +\begin{quote} + (CMO\_LIST, {\sl int32} $1$, \\ + \ \ (CMO\_LIST, {\sl int32} $2$, (CMO\_INT32, OX\_DATA), \\ + \ \ \ \ (CMO\_LIST, {\sl int32} $4$, + (CMO\_INT32, CMO\_INT32), (CMO\_INT32, CMO\_STRING), + (CMO\_INT32, CMO\_MATHCAP), (CMO\_INT32, CMO\_LIST)))) +\end{quote} +となる. + +% なお, この mathcap では, データの論理構造が理解できるかどうか +% までは分からないので注意する必要がある. + +\section{セキュリティ対策} + +OpenXM 規約は TCP/IP を用いて通信を行うことを考慮している. ネットワーク +によって接続される現代の多くのソフトウェアと同様, OpenXM 規約もまた通信 +時のセキュリティについて注意している. 以下, このことについて説明しよう. + +{\large\bf 意味不明なことを書いているが, } + +OpenXM では侵入者に攻撃の機会をできるだけ与えないようにするため, +接続が必要になった時のみ接続を待つようにし, +常に接続に関与するといったことは避けている. + +(表現を少しかえただけではだめでしょう. 内容がわからないんだから. ) + +しかし, これだけでは侵入者が接続を行なう一瞬のすきを狙われる可能性もある. +そこで接続を行なう時に, 接続を待つ port 番号をランダムに決めている. +こうすることで, 特定の port 番号を狙って接続を行なう手口を幾ら +か防ぐことができる. + +さらにもう一段安全性を高めるために, 接続時に 1 回だけ使用可能なパスワー +ドをクライアントが作成し, そのパスワードを使って認証を行なう. +このパスワードは一旦使用されれば無効にするので, +もし仮になんらかの手段でパスワードが洩れたとしても安全である. + +なお, 上記の port 番号とパスワードは安全な手段で送られていると仮定してい +る. また, 同一のコンピュータ上に悪意のあるユーザはいないと仮定しているこ +とに注意しなければならない. なぜなら, 現在の実装ではサーバ, およびクライ +アントの動作しているコンピュータ上ではこの port 番号とパスワードがわかっ +てしまうためである. + +なお, 接続が確立した後のメッセージの送受信に関しては, 特に暗号化などの処 +置を行っているわけではない. もし必要があれば, 通信路の暗号化を行なう機能 +があるソフトウェア ssh を使うことにしている. + + +\section{他のプロジェクト} + +他のプロジェクトについても触れておこう. + +\begin{itemize} +\item OpenMath + +http://www.openmath.org/omsoc/ A.M.Cohen + +このプロジェクトは数学的なオブジェクトをコンピュータ上で表現する方 +法を規定している. +%各ソフトウェア間でオブジェクトを交換する際のオブジェクトの変換手順に +%ついても定められている. +表現方法は幾つかの段階で定められていて, +XML 表現やバイナリ表現などが用意されている. + + +\item NetSolve + +http://www.cs.utk.edu/netsolve/ + +ネットワークを使い, 計算機の資源を + + +\item MP + +http://symbolicNet.mcs.kent.edu/SN/areas/protocols/mp.html + +\item MCP + +http://horse.mcs.kent.edu/~pwang/ +\end{itemize} + + +\section{現在提供されているソフトウェア} + +現在 OpenXM 規約に対応しているクライアントにはasir, sm1, Mathematica がある. +これらのクライアントから OpenXM 規約に対応したサーバを呼び出すこと +ができる. 現在 OpenXM 規約に対応しているサーバソフトウェアには, asir, +sm1, gnuplot, Mathematica, PHC pack などがあり, +それぞれ ox\_asir, ox\_sm1, ox\_sm1\_gnuplot, ox\_math, ox\_sm1\_phc +という名前で提供されている. また, OpenMath +規約の XML 表現で表現されたオブジェクトと CMO 形式のオブジェクトを変換す +るソフトウェアが JAVA によって実装されており, OMproxy という名前で提供さ +れている. + +\begin{thebibliography}{99} +\bibitem{Ohara-Takayama-Noro-1999} +小原功任, 高山信毅, 野呂正行: +{Open asir 入門}, 1999, 数式処理, Vol 7, No 2, 2--17. (ISBN4-87243-086-7, SEG 出版, Tokyo). +\bibitem{OpenXM-1999} +野呂正行, 高山信毅: +{Open XM の設計と実装 --- Open message eXchange protocol for Mathematics}, +1999/11/22 +\end{thebibliography} \end{document}