=================================================================== RCS file: /home/cvs/OpenXM/doc/Attic/genkou19991125.tex,v retrieving revision 1.13 retrieving revision 1.41 diff -u -p -r1.13 -r1.41 --- OpenXM/doc/Attic/genkou19991125.tex 1999/12/19 15:02:37 1.13 +++ OpenXM/doc/Attic/genkou19991125.tex 1999/12/22 11:58:58 1.41 @@ -1,184 +1,255 @@ \documentclass{jarticle} -\title{\bf Open XM($B%?%$%H%kL$Dj(B)} +\title{タイトル未定} \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) \\ +前川 将秀\thanks{神戸大学理学部数学科}, +野呂 正行\thanks{富士通研究所}, +小原 功任\thanks{金沢大学理学部計算科学教室}, \\ +奥谷 行央 +%\thanks{神戸大学大学院自然科学研究科博士課程前期課程数学専攻}, +\thanks{神戸大学大学院自然科学研究科数学専攻}, +高山 信毅\thanks{神戸大学理学部数学教室}, +田村 恭士 +%\thanks{神戸大学大学院自然科学研究科博士課程後期課程情報メディア科学専攻計算システム講座} +\thanks{神戸大学大学院自然科学研究科情報メディア科学専攻} } -\date{ 1999$BG/(B, 11$B7n(B25$BF|(B} - +\date{1999年11月25日} %\pagestyle{empty} \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 を +相互に呼び出す機能を実装したことである。 +%\footnote{この段落必要?} -$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 規約独自のデータ形式である CMO 形式(Common Mathematical Object format) +%以外にも、 MP や OpenMath の XML, binary 表現形式といった他の形式をも +%扱えるようにしてある。 +{\Huge TCP/IP 実装の話} -\section{OpenXM $B$N%a%C%;!<%8$N9=B$(B} -$BA0@a$G8+$?$h$&$K!"(B OpenXM $B$N%a%C%;!<%8$O(B -$BJ#?t$NDj$5$l$F$*$j!"(B -$Bl9g$K$O!"(B -$B$=$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 -CMO $BAX$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(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!#(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 はサーバ・クライアントモデルを採用していて、 +サーバはスタックマシンの構造を持つ。 +サーバが行うのは基本的に次の事柄に限られる。 +クライアントからメッセージを受け取るとサーバは、 +まずメッセージの識別子を調べ、 SM 形式のデータでなければスタックに積む。 +SM 形式のデータであればメッセージのボディから +スタックマシンのオペコードを取りだし、 +あらかじめ規約で定められた動作を行なう。 -%$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 +%上の説明でわかるように、 +サーバはクライアントからの指示なしに、 +自らメッセージを送らないことに注意しなければならない。 +%(例外? ox\_asir の mathcap)。 -$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 +サーバがクライアントから受け取ったメッセージはすべてスタックに積まれる。 +次いでサーバに SM 形式のデータを送ると、 +初めてサーバはデータをスタックに積む以外のなんらかの動作を行なう。 +このとき、必要があればサーバはスタックから必要なだけデータを取り出す。 +ここで、クライアントからの命令による動作中にたとえエラーが発生したとしても +サーバはエラーオブジェクトをスタックに積むだけで、 +明示されない限りエラーを返さないことに注意しなければならない。 -$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 +結果が生じる動作をサーバが行なった場合、 +サーバは動作の結果をスタックに積む。 +サーバに行なわせた動作の結果をクライアントが知りたい場合、 +スタックからデータを取り出し送信を行なう命令に対応した SM 形式のデータを +サーバ側へ送ればよい。 + +{\Huge 以下、書き直し} + +クライアントがサーバへ計算を行なわせ、結果を得るという手順を追っていくと、 +次のようになる。 + +\begin{enumerate} +\item まず、クライアントがサーバへ計算させたいデータを送る。 + サーバは送られてきたデータをスタックに積む。 +\item クライアントがサーバに「計算を行なう動作に対応したデータ」を + 送ると、サーバは必要なだけスタックからデータを取り出し、 + 実行した計算の結果をスタックに積む。 +\item 最後に「データを取り出し送信を行なう命令に対応したデータ」を + サーバへ送ると、サーバはスタックから計算結果の入っている + データを取り出し、クライアントへ送出する。 +\end{enumerate} + + +\section{CMO のデータ構造} + +OpenXM 間でやりとりされるメッセージを実際に作成する場合、 +CMO 形式で定義されている多倍長整数を理解しておくと、 +CMO 形式の他のデータ構造だけでなく、 OX 形式、 SM 形式のデータを +理解する助けになると思えるので、 CMO 形式の多倍長整数の +データ構造について説明する。 + +CMO 形式で定義されているデータは多倍長整数以外にも +文字列やリスト構造などがある。どのようなデータであるかは +データの先頭にあるタグを見れば判別できるようになっている。 +これはメッセージのデータの判別の仕方とおなじである。 +なお、タグは各データ毎に 32 bit の整数で表されており、 +多倍長整数は 20 となっている。 +ここで 32 bit の整数の表現方法について説明する必要がある。 +OpenXM ではバイト列で 32 bit の整数 20 を +{\tt 00 00 00 14} と表す方法と {\tt 14 00 00 00} と表す方法がある。 +この表現方法の違いはクライアントとサーバの最初の接続時に +双方の合意で決定することになっている。 +なお、合意がない場合には +前者の表現方法(以後、この表現方法を network byte order と呼ぶ)を +使うことになっている。 +また、負の数を表現する必要があるときには、 +2 の補数表現を使うことになっている。 + +表現したい多倍長整数の絶対値を 2 進数で表した場合の桁数を $n$ と +したとき、次にくるデータは $[(n+31)/32]$ を 32 bit の整数となる。 +これは多倍長整数の絶対値を $2^{32}$ 進数で表した場合の桁数ととってもよい。 +ただし、表現したい数が負の場合は $[(n+31)/32]$ を 32 bit の整数で表した値を + 2 の補数表現で負にして、正の場合と区別する。 + +表現したい多倍長整数の絶対値が $2^{32}$ 進数で $(b_0 b_1 ... b_k)_{2^{32}}$ +と表せるとき、次にくるデータは $b_0$, $b_1$, $\cdots$, $b_k$ を +それぞれ 32 bit の整数で表現した値となる。 +%以下は書き直しの必要があるかも... +なお、 GNU MP LIBRARY を用いると、 +C 言語から多倍長整数や任意精度浮動小数を扱うことができる。 +$b_0$, $b_1$, $\cdots$, $b_k$ をそれぞれ 32 bit 整数で表現した値は +この GNU MP LIBRARY で用いられている多倍長整数で使われている形式を +参考にして合わせてある。 + +ここで具体例をだそう。 +$4294967298 = 1 \times 2^{32} + 2$ を network byte order の多倍長整数で +表現すると、 \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 +となる。また、同じ表現方法で $-1$ を表現すると、 \begin{center} {\tt 00 00 00 14 ff ff ff ff 00 00 00 01} \end{center} -$B$H$J$k!#(B +となる。 -\section{MathCap $B$K$D$$$F(B} +\section{MathCap について} -%$BA0@a$G8+$?$h$&$K!"(B 1 $B$D$N%a%C%;!<%8$ND9$5$O7h$^$C$F$$$J$$!#(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 +この MathCap データのリスト構造は大きく分けて 3 つの部分に分かれる。 +最初の {\tt [199901160,"ox\_asir"]} の部分にはサーバの情報が入っている。 +%この最初の要素がまたリスト構造となっており、 +最初の要素はバージョンナンバーを、次の要素はサーバの名前を表している。 -$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 +しかし、これだけでは侵入者が接続を行なう一瞬のすきを +狙ってくる可能性もある。 +そこで接続を行なう時に、 +接続を待つポート番号をランダムに決めている。 +こうすることで、特定のポート番号を狙って接続を行なう +瞬間を待つ手口を幾らか防ぐことができる。 -$B$J$*!"@\B3$,3NN)$7$?8e$N%a%C%;!<%8$NAw$N%W%m%8%'%/%H(B} +なお、接続が確立した後のメッセージの送受信に関しては、 +特に暗号化などの処置が行なわれているわけではない。 +もし必要があれば、通信路の暗号化を行なう機能がある +ソフトウェアを使うことを考えている。 -$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 +以下は書いてる途中。 + +NetSolve + +http://www.cs.utk.edu/netsolve/ + + +MP + +http://symbolicNet.mcs.kent.edu/SN/areas/protocols/mp.html + + +MCP + +http://horse.mcs.kent.edu/~pwang/ + + +\section{現在提供されているソフトウェア} + +現在 OpenXM 規格に対応しているクライアントには +asir, sm1, Mathematica がある。 +これらのクライアントから +OpenXM 規格に対応したサーバを呼び出すことができる。 +現在 OpenXM 規約に対応しているサーバソフトウェアには、 + asir, sm1, gnuplot, Mathematica などがあり、 +それぞれ ox\_asir, ox\_sm1, ox\_math という名前で提供されている。 +また、 OpenMath 規格の XML 表現で表現されたデータと CMO 形式の +データを変換するソフトウェアが JAVA によって実装されており、 +OMproxy という名前で提供されている。 + \end{document}