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

Diff for /OpenXM/doc/Attic/genkou19991125.tex between version 1.26 and 1.43

version 1.26, 1999/12/20 16:01:35 version 1.43, 1999/12/22 13:59:41
Line 1 
Line 1 
 \documentclass{jarticle}  \documentclass{jarticle}
   
 \title{\bf Open XM($B%?%$%H%kL$Dj(B)}  \title{タイトル未定}
 \author{  \author{
 %Maekawa, Masahide  (Oct., 1999 -- : CVS server) \\  前川 将秀\thanks{神戸大学理学部数学科},
 $BA0@n(B $B$^$5$R$G(B,  野呂 正行\thanks{富士通研究所},
 %$B",4A;zD4$YCf!#(B commit $B8+$?$i65$($F$M!#$I$&$;L@F|J9$1$k$1$I!#(B  小原 功任\thanks{金沢大学理学部計算科学教室}, \\
 %Noro, Masayuki     (Jan., 1996 -- : OpenXM Protocol, asir99) \\  奥谷 行央
 $BLnO$(B $B@59T(B,  %\thanks{神戸大学大学院自然科学研究科博士課程前期課程数学専攻},
 %Ohara, Katsuyoshi  (Jan., 1998 -- : ox\_math) \\  \thanks{神戸大学大学院自然科学研究科数学専攻},
 $B>.86(B $B8yG$(B, \\  高山 信毅\thanks{神戸大学理学部数学教室},
 %Okutani, Yukio     (Oct., 1999 -- : asir contrib) \\  田村 恭士
 $B1|C+(B $B9,IW(B,  %\thanks{神戸大学大学院自然科学研究科博士課程後期課程情報メディア科学専攻計算システム講座}
 %Takayama, Nobuki   (Jan., 1996 -- : OpenXM Protocol, kan) \\  \thanks{神戸大学大学院自然科学研究科情報メディア科学専攻}
 $B9b;3(B $B?.5#(B,  
 %Tamura, Yasushi    (Nov., 1998 -- : OpenMath proxy) \\  
 $BEDB<(B $B63;N(B  
 }  }
 \date{1999$BG/(B11$B7n(B25$BF|(B}  \date{1999年11月25日}
   
 %\pagestyle{empty}  %\pagestyle{empty}
   
 \begin{document}  \begin{document}
 \maketitle  \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?t3XE*$J%G!<%?$r4^$s$@%a%C%;!<%8$J$I$rMQ$$$F(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  なお、 OpenXM とは Open message eXchange protocol for Mathematics の略である。
 $BH/C<$OLnO$@59T$H9b;3?.5#$K$h$j!"(B asir $B$H(B kan/sm1 $B$r(B  OpenXM の開発の発端は野呂と高山により、
 $BAj8_$K8F$S=P$95!G=$r<BAu$7$?$3$H$G$"$k!#(B  asir と kan/sm1 を相互に呼び出す機能を実装したことである。
 $B8=:_$NL\I8$O!"%U%j!<$N?t3X%=%U%H$rAj8_$K@\B3$7$F(B  
 $B9%$-$J8@8l$+$i4JC1$KB>$N?t3X%=%U%H$r;H$($k$h$&$K$9$k$3$H$G$"$k!#(B  
 $B$J$*!"(B OpenXM $B$H$O(B Open message eXchange protocol for Mathematics $B$N(B  
 $BN,$G$"$k!#(B  
   
 $BH/C<$H$J$C$?(B asir $B$H(B kan/sm1 $B$G$N<BAu;~$K$O!"(B  %発端となった asir と kan/sm1 での実装時には、
 $B$*8_$$$KAj<jB&$N%3%^%s%IJ8;zNs$rAw$C$F$$$?!#(B  初期の実装では、相手側のローカル言語の文法に従った文字列を送っていた。
 $B$3$NJ}K!$O8=:_$N(B OpenXM $B5,Ls$G$b7A$rJQ$($F2DG=$G$O$"$k$,!"(B  現在の OpenXM 規約では共通表現形式によるメッセージを用いている。
 $B;H$$$d$9$$H?LL!"8zN(E*$G$"$k$H$O$$$$Fq$$!#(B  この方法では相手側のソフトが asir なのか kan/sm1 なのかを判別するなどして、
 $B$5$i$K!"$3$NJ}K!$G$OAj<jB&$N%=%U%H$,(B asir $B$J$N$+(B kan/sm1 $B$J$N$+$r(B  相手側のローカル言語の文法に合わせた文字列を作成する必要がなくなる。
 $BH=JL$7$F!"Aj<jB&$K9g$o$;$F%3%^%s%IJ8;zNs$r:n@.$9$kI,MW$,$"$k!#(B  しかし、ローカル言語の文法に従った文字列を送る方法も、
   効率的であるとはいい難いが、使いやすい。
   そのため、 OpenXM 規約では共通表現形式の中の文字列として、
   ローカル言語の文法に従った文字列を用いた
   メッセージの交換も可能となっている。
   
 $B$3$l0J30$NJ}K!$H$7$F!"(B  %OpenXM 規約独自のデータ形式である CMO 形式(Common Mathematical Object format)
 OpenXM $B5,Ls$G$O6&DLI=8=7A<0$K$h$k%a%C%;!<%8$bMQ0U$7$F$$$k!#(B  %以外にも、 MP や OpenMath の XML, binary 表現形式といった他の形式をも
 OpenXM $B5,LsFH<+$N%G!<%?7A<0$G$"$k(B CMO $B7A<0(B(Common Mathematical Object format)  %扱えるようにしてある。
 $B0J30$K$b!"(B MP $B$d(B OpenMath $B$N(B XML, binary $BI=8=7A<0$H$$$C$?B>$N7A<0$r$b(B  
 $B07$($k$h$&$K$7$F$"$k!#(B  
 $B$J$*!"8=:_$N(B OpenXM $B5,Ls$G$O!"(B  
 $BA0=R$N%3%^%s%IJ8;zNs$b(B CMO $B7A<0$J$I$N2?$i$+$N%G!<%?7A<0$NCf$N(B  
 $BJ8;zNs$H$7$FI=8=$7$FAw$kI,MW$,$"$k!#(B  
   
 OpenXM $B5,Ls$G$N%a%C%;!<%8$N8r49$O%5!<%P$H%/%i%$%"%s%H$N4V$G9T$J$o$l$k!#(B  OpenXM 規約では通信路の確保の方法に幾らかの自由度があるが、
 $B%5!<%P$O%9%?%C%/%^%7%s$G$"$k$H2>Dj$5$l$F$*$j!"(B  現在は TCP/IP ソケットを用いた実装しかない。
 $B%5!<%P$,%/%i%$%"%s%H$+$i<u$1<h$C$?%a%C%;!<%8$O$9$Y$F%9%?%C%/$K@Q$^$l$k!#(B  %通信の実現方法は通信路のとりかたにより変わる。
 OpenXM $B$N%a%C%;!<%8$NCf$K$O%5!<%P$K9T$J$o$;$?$$F0:n$KBP1~$9$k%G!<%?$,$"$j!"(B  そこで、以後ここでは具体的な実装は TCP/IP ソケットを
 $B$3$N%a%C%;!<%8$r<u$1<h$C$?%5!<%P$O$=$l$KBP1~$9$kF0:n$r(B  用いていると仮定する。
 $B9T$J$&$3$H$,4|BT$5$l$F$$$k!#(B  
 $B$?$@$7!"%5!<%P$OL?Na$5$l$J$$8B$j2?$bF0:n$r9T$J$*$&$H$O$7$J$$!#(B  
   
   
 \section{OpenXM $B$N%a%C%;!<%8$N9=B$(B}  \section{OpenXM のメッセージの構造}
   
 OpenXM $B$N%a%C%;!<%8$OJ#?t$N<oN`$N%G!<%?$rI=8=$9$k$3$H$,2DG=$G$"$k!#(B  OpenXM で規定されている TCP/IP 実装によるメッセージは
 $B%a%C%;!<%8$,$I$N$h$&$J%G!<%?$J$N$+$O!"(B  バイトストリームとなっており、
 $B@hF,$K$"$k(B tag $B$r$_$l$PJ,$+$k$h$&$K$J$C$F$$$k!#(B  次のような構造になっている。
 $B$3$N(B tag $B$r$_$k$3$H$K$h$C$F!"(B  
 CMO $B7A<0$d!"(B OpenMath $B$N(B XML $BI=8=$J$I$N!"(B  
 $B%a%C%;!<%8$K4^$^$l$F$$$k%G!<%?$N<oN`$,J,$+$k$h$&$K$J$C$F$$$k!#(B  
   
 $B%a%C%;!<%8$NCf$N<B:]$K%G!<%?$NF~$C$F$$$kItJ,$O(B  \begin{tabular}{|c|c|} \hline
  tag $B0J9_$K$"$k(B body $B$NItJ,$G$"$k!#(B  ヘッダ  & \hspace{10mm} ボディ \hspace{10mm} \\ \hline
 body $B$NCf$N%G!<%?$,$I$N$h$&$K3JG<$5$l$F$$$k$+$O(B  \end{tabular}
 $B3F%G!<%?7A<0$,$=$l$>$lFHN)$K7h$a$i$l$k$h$&$K$J$C$F$$$k!#(B  
 $B$b$7!"(B OpenXM $B5,Ls$G%a%C%;!<%8$N$d$j$H$j$r9T$J$$$?$$$,!"(B  
 $B$^$@5,Ls$GDj5A$5$l$F$$$J$$%G!<%?7A<0$r;H$$$?$$>l9g$O!"(B  
 tag $B$r$^$@;H$o$l$F$J$5$=$&$JCM(B  
 ($B%7%9%F%`8GM-$NI=8=$N$?$a$K?d>)$5$l$F$$$kCM$,$"$k(B)  
 $B$K@_Dj$7!"(B body $B$NItJ,$K%G!<%?$rKd$a9~$a$P$h$$!#(B  
 $B$J$*!"$9$Y$F$N%a%C%;!<%8$K(B body $B$,I,MW$H$$$&$o$1$G$O$J$/!"(B  
 body $B$N$J$$%a%C%;!<%8$b(B OpenXM $B5,Ls$K$OB8:_$9$k$3$H$K(B  
 $BCm0U$7$J$1$l$P$J$i$J$$!#(B  
   
 $B%5!<%P$KBP$9$kF0:n$KBP1~$7$?%G!<%?$O(B SM $B7A<0$H$7$FDj5A$5$l$F$$$k!#(B  ヘッダの長さは 8 バイトであると定められている。
 SM $B7A<00J30$N%G!<%?$G$O!"%5!<%P$O<u$1<h$C$?%G!<%?$r%9%?%C%/$K@Q$`(B  ボディの長さはメッセージごとに異なっているが、
 $B0J30$NF0:n$r$7$J$$$3$H$K$J$C$F$$$k!#(B  長さは $0$ でもよい。
 $B$D$^$j!"(B SM $B7A<0$N%G!<%?$,%G!<%?$r<u$1<h$k0J30$NF0:n$r(B  
 $B%5!<%P$K9T$J$o$;$kM#0l$N%G!<%?7A<0$G$"$k!#(B  
 $B$3$N%G!<%?$r<u$1<h$k0J30$NF0:n$NCf$K$O!"(B  
 $B%G!<%?$K$J$s$i$+$N2C9)$r;\$9F0:n$bF~$C$F$$$k!#(B  
 $B$3$N%G!<%?$K$J$s$i$+$N2C9)$r;\$9F0:n$NCf$K$O(B  
 $B?t3XE*$J1i;;$r9T$J$&F0:n$b4^$^$l$F$$$k!#(B  
 $B0J8e!"%G!<%?$K$J$s$i$+$N2C9)$r;\$9F0:n$N$3$H$r7W;;$H8F$V$3$H$K$9$k!#(B  
   
   ヘッダは次の二つの情報を持っている。
   \begin{enumerate}
   \item   前半の 4 バイト。メッセージの種類を表わす識別子であり、
           タグと呼ばれる。
   \item   後半の 4 バイト。メッセージにつけられた通し番号である。
   \end{enumerate}
   それぞれの 4 バイトは 32 ビット整数とみなされて扱われる。
   この場合に用いられる整数の表現方法の説明については後述するが、
   基本的に表現方法はいくつかの選択肢から選ぶことが可能となっており、
   またその選択は通信路の確立時に一度だけなされることに注意しなければならない。
   
 \section{OpenXM $B$N7W;;$N?J9TJ}K!(B}  ボディの中身はタグによるメッセージの種類によって
   それぞれ独立に決められるようになっている。
   もし、システム固有の表現を OpenXM 規約のメッセージに
   埋め込んで使いたい場合には、
   このような用途のために推奨されている整数値の範囲がタグにはあるので
   タグの値をこの推奨されている範囲に設定し、
   システム固有の表現をボディに埋め込めばよい。
   
 $B%/%i%$%"%s%H$,%5!<%P$X$J$s$i$+$N7W;;$r9T$J$o$;$k>l9g!"(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$G<u$1<h$k$3$H$K$h$C$F7W;;$O9T$J$o$l$k!#(B  
 $B$?$@$7!"%5!<%P$O7k2L$NAw?.$9$i$bL?Na$5$l$J$1$l$P9T$J$&$3$H$O$J$/!"(B  
 $B%/%i%$%"%s%H$O7k2L$r<u$1<h$i$:$K%5!<%P$K<!!9$H(B  
 $B7W;;$r9T$J$o$;$k$3$H$b2DG=$G$"$k!#(B  
   
 $B%5!<%P$,%/%i%$%"%s%H$+$i<u$1<h$C$?%a%C%;!<%8$O$9$Y$F%9%?%C%/$K@Q$^$l$k!#(B  \section{OpenXM の計算モデル}
 $B$?$@$7!"$3$N$^$^$G$O<u$1<h$C$?%a%C%;!<%8$K4^$^$l$k%G!<%?$r(B  
 $B%9%?%C%/$K@Q$_>e$2$F$$$/$@$1$G!"%5!<%P$O7W;;$r9T$J$*$&$H$O$7$J$$!#(B  
 $B<!$$$G%5!<%P$K9T$J$o$;$?$$F0:n$KBP1~$7$?%G!<%?$rAw$k$H!"(B  
 $B=i$a$F%5!<%P$O7W;;$J$I$N!"$J$s$i$+$NF0:n$r9T$J$&!#(B  
 $B$3$N$H$-!"I,MW$,$"$l$P%5!<%P$O%9%?%C%/$+$iI,MW$J$@$1%G!<%?$r<h$j=P$9!#(B  
 $B$3$3$G!"%/%i%$%"%s%H$+$i$NL?Na$K$h$kF0:nCf$K$?$H$(%(%i!<$,H/@8$7$?$H$7$F$b(B  
 $B%5!<%P$O%(%i!<%*%V%8%'%/%H$r%9%?%C%/$K@Q$`$@$1$G!"(B  
 $BL@<($5$l$J$$8B$j%(%i!<$rJV$5$J$$$3$H$KCm0U$7$J$1$l$P$J$i$J$$!#(B  
   
 $B7k2L$,@8$8$kF0:n$r%5!<%P$,9T$J$C$?>l9g!"(B  {\Huge この節では計算モデルの話をしなければいけません}
 $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!<%?$r<h$j=P$7Aw?.$r9T$J$&L?Na$KBP1~$7$?(B SM $B7A<0$N%G!<%?$r(B  
 $B%5!<%PB&$XAw$l$P$h$$!#(B  
   
 $B%/%i%$%"%s%H$,%5!<%P$X7W;;$r9T$J$o$;!"7k2L$rF@$k$H$$$&<j=g$rDI$C$F$$$/$H!"(B  OpenXM 規約での計算とはメッセージを交換することである。
 $B<!$N$h$&$K$J$k!#(B  また、 OpenXM 規約ではクライアント・サーバモデルを採用しているので、
   メッセージの交換はサーバとクライアントの間で行なわれる。
   クライアントからサーバへメッセージを送り、
   サーバからクライアントがメッセージを受け取ることによって
   計算の結果が得られる。
   
   サーバはスタックマシンであると仮定されており、
   サーバがクライアントから受け取ったメッセージはすべてスタックに積まれる。
   ただし、OpenXM のメッセージの中にはサーバに行なわせたい動作に
   対応するデータがあり、
   このメッセージを受け取ったサーバはそれに対応する動作を
   行なうことが期待されている。
   しかし、サーバは命令されない限り何も動作を行なおうとはしない。
   このため、クライアントはサーバの状態を気にせずにメッセージを送り、
   一旦メッセージを送付し終えた後、
   サーバへ送ったメッセージの結果を
   サーバから待つことなしに次の動作に移ることができる。
   
   なお、サーバに対する動作に対応したデータは SM 形式として定義されている。
   SM 形式以外のデータでは、サーバは受け取ったデータをスタックに積む
   以外の動作をしないことになっている。
   つまり、 SM 形式のデータがサーバにデータを受け取る以外の動作を
   行なわせる唯一のデータ形式である。
   
   
   \section{OpenXM の計算の進行方法}
   
   OpenXM における計算とはメッセージの交換のことである。
   既に計算モデルの節で説明したが、
   OpenXM はサーバ・クライアントモデルを採用していて、
   サーバはスタックマシンの構造を持つ。
   サーバが行うのは基本的に次の事柄に限られる。
   クライアントからメッセージを受け取るとサーバは、
   まずメッセージの識別子を調べ、 SM 形式のデータでなければスタックに積む。
   SM 形式のデータであればメッセージのボディから
   スタックマシンのオペコードを取りだし、
   あらかじめ規約で定められた動作を行なう。
   
   %上の説明でわかるように、
   サーバはクライアントからの指示なしに、
   自らメッセージを送らないことに注意しなければならない。
   %(例外? ox\_asir の mathcap)。
   
   サーバがクライアントから受け取ったメッセージはすべてスタックに積まれる。
   次いでサーバに SM 形式のデータを送ると、
   初めてサーバはデータをスタックに積む以外のなんらかの動作を行なう。
   このとき、必要があればサーバはスタックから必要なだけデータを取り出す。
   ここで、クライアントからの命令による動作中にたとえエラーが発生したとしても
   サーバはエラーオブジェクトをスタックに積むだけで、
   明示されない限りエラーを返さないことに注意しなければならない。
   
   結果が生じる動作をサーバが行なった場合、
   サーバは動作の結果をスタックに積む。
   サーバに行なわせた動作の結果をクライアントが知りたい場合、
   スタックからデータを取り出し送信を行なう命令に対応した SM 形式のデータを
   サーバ側へ送ればよい。
   
   {\Huge 以下、書き直し}
   
   クライアントがサーバへ計算を行なわせ、結果を得るという手順を追っていくと、
   次のようになる。
   
 \begin{enumerate}  \begin{enumerate}
 \item   $B$^$:!"%/%i%$%"%s%H$,%5!<%P$X7W;;$5$;$?$$%G!<%?$rAw$k!#(B  \item   まず、クライアントがサーバへ計算させたいデータを送る。
         $B%5!<%P$OAw$i$l$F$-$?%G!<%?$r%9%?%C%/$K@Q$`!#(B          サーバは送られてきたデータをスタックに積む。
 \item   $B%/%i%$%"%s%H$,%5!<%P$K!V7W;;$r9T$J$&F0:n$KBP1~$7$?%G!<%?!W$r(B  \item   クライアントがサーバに「計算を行なう動作に対応したデータ」を
         $BAw$k$H!"%5!<%P$OI,MW$J$@$1%9%?%C%/$+$i%G!<%?$r<h$j=P$7!"(B          送ると、サーバは必要なだけスタックからデータを取り出し、
         $B<B9T$7$?7W;;$N7k2L$r%9%?%C%/$K@Q$`!#(B          実行した計算の結果をスタックに積む。
 \item   $B:G8e$K!V%G!<%?$r<h$j=P$7Aw?.$r9T$J$&L?Na$KBP1~$7$?%G!<%?!W$r(B  \item   最後に「データを取り出し送信を行なう命令に対応したデータ」を
         $B%5!<%P$XAw$k$H!"%5!<%P$O%9%?%C%/$+$i7W;;7k2L$NF~$C$F$$$k(B          サーバへ送ると、サーバはスタックから計算結果の入っている
         $B%G!<%?$r<h$j=P$7!"%/%i%$%"%s%H$XAw=P$9$k!#(B          データを取り出し、クライアントへ送出する。
 \end{enumerate}  \end{enumerate}
   
   
 \section{CMO $B$N%G!<%?9=B$(B}  \section{CMO のデータ構造}
   
 OpenXM $B4V$G$d$j$H$j$5$l$k%a%C%;!<%8$r<B:]$K:n@.$9$k>l9g!"(B  OpenXM 間でやりとりされるメッセージを実際に作成する場合、
 CMO $B7A<0$GDj5A$5$l$F$$$kB?G\D9@0?t$rM}2r$7$F$*$/$H!"(B  CMO 形式で定義されている多倍長整数を理解しておくと、
 CMO $B7A<0$NB>$N%G!<%?9=B$$@$1$G$J$/!"(B OX $B7A<0!"(B SM $B7A<0$N%G!<%?$r(B  CMO 形式の他のデータ構造だけでなく、 OX 形式、 SM 形式のデータを
 $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  理解する助けになると思えるので、 CMO 形式の多倍長整数の
 $B%G!<%?9=B$$K$D$$$F@bL@$9$k!#(B  データ構造について説明する。
   
 CMO $B7A<0$GDj5A$5$l$F$$$k%G!<%?$OB?G\D9@0?t0J30$K$b(B  CMO 形式で定義されているデータは多倍長整数以外にも
 $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  なお、タグは各データ毎に 32 bit の整数で表されており、
 $BB?G\D9@0?t$O(B 20 $B$H$J$C$F$$$k!#(B  多倍長整数は 20 となっている。
 $B$3$3$G(B 32 bit $B$N@0?t$NI=8=J}K!$K$D$$$F@bL@$9$kI,MW$,$"$k!#(B  ここで 32 bit の整数の表現方法について説明する必要がある。
 OpenXM $B$G$O(B 32 bit $B$N@0?t(B 20 $B$r%P%$%HNs$G(B {\tt 00 00 00 14} $B$HI=$9J}K!$H(B  OpenXM ではバイト列で 32 bit の整数 20 を
 {\tt 14 00 00 00} $B$HI=$9J}K!$,$"$k!#(B  {\tt 00 00 00 14} と表す方法と {\tt 14 00 00 00} と表す方法がある。
 $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  なお、合意がない場合には
 $BA0<T$NI=8=J}K!(B($B0J8e!"$3$NI=8=J}K!$r(B network byte order $B$H8F$V(B)$B$r(B  前者の表現方法(以後、この表現方法を network byte order と呼ぶ)を
 $B;H$&$3$H$K$J$C$F$$$k!#(B  使うことになっている。
 $B$^$?!"Ii$N?t$rI=8=$9$kI,MW$,$"$k$H$-$K$O!"(B  また、負の数を表現する必要があるときには、
 2 $B$NJd?tI=8=$r;H$&$3$H$K$J$C$F$$$k!#(B  2 の補数表現を使うことになっている。
   
 $BI=8=$7$?$$B?G\D9@0?t$N@dBPCM$r(B 2 $B?J?t$GI=$7$?>l9g$N7e?t$r(B $n$ $B$H(B  表現したい多倍長整数の絶対値を 2 進数で表した場合の桁数を $n$ と
 $B$7$?$H$-!"<!$K$/$k%G!<%?$O(B $[(n+31)/32]$ $B$r(B 32 bit $B$N@0?t$H$J$k!#(B  したとき、次にくるデータは $[(n+31)/32]$ を 32 bit の整数となる。
 $B$3$l$OB?G\D9@0?t$N@dBPCM$r(B $2^{32}$ $B?J?t$GI=$7$?>l9g$N7e?t$H$H$C$F$b$h$$!#(B  これは多倍長整数の絶対値を $2^{32}$ 進数で表した場合の桁数ととってもよい。
 $B$?$@$7!"I=8=$7$?$$?t$,Ii$N>l9g$O(B $[(n+31)/32]$ $B$r(B 32 bit $B$N@0?t$GI=$7$?CM$r(B  ただし、表現したい数が負の場合は $[(n+31)/32]$ を 32 bit の整数で表した値を
  2 $B$NJd?tI=8=$GIi$K$7$F!"@5$N>l9g$H6hJL$9$k!#(B   2 の補数表現で負にして、正の場合と区別する。
   
 $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}}$  表現したい多倍長整数の絶対値が $2^{32}$ 進数で $(b_0 b_1 ... b_k)_{2^{32}}$
 $B$HI=$;$k$H$-!"<!$K$/$k%G!<%?$O(B $b_0$, $b_1$, $\cdots$, $b_k$ $B$r(B  と表せるとき、次にくるデータは $b_0$, $b_1$, $\cdots$, $b_k$ を
 $B$=$l$>$l(B 32 bit $B$N@0?t$GI=8=$7$?CM$H$J$k!#(B  それぞれ 32 bit の整数で表現した値となる。
 %$B0J2<$O=q$-D>$7$NI,MW$,$"$k$+$b(B...  %以下は書き直しの必要があるかも...
 $B$J$*!"(B GNU MP LIBRARY $B$rMQ$$$k$H!"(B  なお、 GNU MP LIBRARY を用いると、
 C $B8@8l$+$iB?G\D9@0?t$dG$0U@:EYIbF0>.?t$r07$&$3$H$,$G$-$k!#(B  C 言語から多倍長整数や任意精度浮動小数を扱うことができる。
 $b_0$, $b_1$, $\cdots$, $b_k$ $B$r$=$l$>$l(B 32 bit $B@0?t$GI=8=$7$?CM$O(B  $b_0$, $b_1$, $\cdots$, $b_k$ をそれぞれ 32 bit 整数で表現した値は
 $B$3$N(B GNU MP LIBRARY $B$GMQ$$$i$l$F$$$kB?G\D9@0?t$G;H$o$l$F$$$k7A<0$r(B  この GNU MP LIBRARY で用いられている多倍長整数で使われている形式を
 $B;29M$K$7$F9g$o$;$F$"$k!#(B  参考にして合わせてある。
   
 $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  $4294967298 = 1 \times 2^{32} + 2$ を network byte order の多倍長整数で
 $BI=8=$9$k$H!"(B  表現すると、
 \begin{center}  \begin{center}
         {\tt 00 00 00 14 00 00 00 02 00 00 00 02 00 00 00 01}          {\tt 00 00 00 14 00 00 00 02 00 00 00 02 00 00 00 01}
 \end{center}  \end{center}
 $B$H$J$k!#$^$?!"F1$8I=8=J}K!$G(B $-1$ $B$rI=8=$9$k$H!"(B  となる。また、同じ表現方法で $-1$ を表現すると、
 \begin{center}  \begin{center}
         {\tt 00 00 00 14 ff ff ff ff 00 00 00 01}          {\tt 00 00 00 14 ff ff ff ff 00 00 00 01}
 \end{center}  \end{center}
 $B$H$J$k!#(B  となる。
   
   
 \section{MathCap $B$K$D$$$F(B}  \section{MathCap について}
   
 $B%5!<%P$*$h$S%/%i%$%"%s%HAPJ}$H$b$K(B OpenXM $B$G5,Dj$5$l$F$$$k(B  サーバおよびクライアント双方ともに OpenXM で規定されている
 $B%a%C%;!<%8$NCf$N%G!<%?7A<0$r$9$Y$FM}2r$G$-$k$o$1$G$O$J$$!#(B  メッセージの中のデータ形式をすべて受け取れるわけではない。
 $B$7$+$b!"(B OpenXM $B5,Ls$G5,Dj$5$l$F$$$k%G!<%?7A<0$@$1$,(B  しかも、 OpenXM 規約で規定されているデータ形式だけが
 $B<uEO$7$K;H$o$l$k$H$$$&$o$1$G$O$J$$!#(B  受渡しに使われるというわけではない。
   そこで、 OpenXM では相手側が受け取ることができるデータ形式を
   収得する方法を用意している。
   
 $B$=$3$G!"(B OpenXM $B$G$OAj<jB&$,<u$1<h$k$3$H$,$G$-$k%G!<%?7A<0$N<oN`$r(B  CMO 形式で定義されている MathCap データは
 $B<}F@$9$kJ}K!$rMQ0U$7$F$$$k!#(B  %理解可能なメッセージの
 CMO $B7A<0$GDj5A$5$l$F$$$k(B MathCap $B%G!<%?$O(B  受け取ることができるデータ形式を表すデータであり、
 %$BM}2r2DG=$J%a%C%;!<%8$N(B  要求されればサーバはサーバ自身の MathCap データをスタックに積む。
 $B<u$1<h$k$3$H$,$G$-$k%G!<%?7A<0$N<oN`$rI=$9(B  また、クライアントから MathCap データをサーバへ送ることもでき、
 $B%G!<%?$G$"$j!"(B  MathCap データをサーバとクライアントの間で交換することによって、
 $BMW5a$5$l$l$P%5!<%P$O%5!<%P<+?H$N(B MathCap $B%G!<%?$r%9%?%C%/$K@Q$`!#(B  お互いに相手側が受け取ることができないデータ形式で
 $B$^$?!"%/%i%$%"%s%H$+$i(B MathCap $B%G!<%?$r%5!<%P$XAw$k$3$H$b$G$-!"(B  メッセージを送ってしまうのを防ぐことができる。
 MathCap $B%G!<%?$r%5!<%P$H%/%i%$%"%s%H$N4V$G8r49$9$k$3$H$K$h$C$F!"(B  なお、 MathCap データの中では CMO 形式で定義されている
 $B$*8_$$$KAj<jB&$,<u$1<h$k$3$H$,$G$-$J$$%G!<%?7A<0$G(B  32 bit 整数、文字列、リスト構造が使われており、
 $B%a%C%;!<%8$rAw$C$F$7$^$&$3$H$rKI$0$3$H$,$G$-$k!#(B  MathCap データに含まれている内容を理解できるためには
 $B$J$*!"(B MathCap $B%G!<%?$NCf$G$O(B CMO $B7A<0$GDj5A$5$l$F$$$k(B  必然的にこれらも理解できる必要がある。
 32 bit $B@0?t!"J8;zNs!"%j%9%H9=B$$,;H$o$l$F$*$j!"(B  
 MathCap $B%G!<%?$K4^$^$l$F$$$kFbMF$rM}2r$G$-$k$?$a$K$O(B  
 $BI,A3E*$K$3$l$i$bM}2r$G$-$kI,MW$,$"$k!#(B  
   
 OpenXM $BBP1~HG$N(B asir $B%5!<%P$G$"$k(B ox\_asir $B$,JV$9(B MathCap $B$r0J2<$K<($9!#(B  OpenXM 対応版の asir サーバである ox\_asir が返す MathCap を以下に示す。
   
 %$B$J$*!"(B $a_1$, $a_2$, $\cdots$, $a_n$ $B$rMWAG$K(B  %なお、 $a_1$, $a_2$, $\cdots$, $a_n$ を要素に
 %$B;}$D%j%9%H9=B$$r(B {\tt [$a_1$, $a_2$, $\cdots$, $a_n$]} $B!"(B  %持つリスト構造を {\tt [$a_1$, $a_2$, $\cdots$, $a_n$]} 、
 %$BJ8;zNs(B ``string'' $B$r(B {\tt "string"} $B!"(B 32 bit $B@0?t$r(B  %文字列 ``string'' を {\tt "string"} 、 32 bit 整数を
 %$B$=$l$KBP1~$9$k(B 10 $B?J?t$N@0?t$G<($9!#(B  %それに対応する 10 進数の整数で示す。
   
 %$B"-<j$G:n$C$?$N$G4V0c$($F$$$k2DG=@-$"$j!#(B  %↓手で作ったので間違えている可能性あり。
 %%$B8E$$%P!<%8%g%s!#:9$7BX$($NI,MW$"$j!#(B  %%古いバージョン。差し替えの必要あり。
 \begin{verbatim}  \begin{verbatim}
 [ [199901160,"ox_asir"],  [ [199901160,"ox_asir"],
   [276,275,258,262,263,266,267,268,274    [276,275,258,262,263,266,267,268,274
Line 233  OpenXM $BBP1~HG$N(B asir $B%5!<%P$G$"$k(B ox\_asir
Line 260  OpenXM $BBP1~HG$N(B asir $B%5!<%P$G$"$k(B ox\_asir
 ]  ]
 \end{verbatim}  \end{verbatim}
   
 $B$3$N(B MathCap $B%G!<%?$N%j%9%H9=B$$OBg$-$/J,$1$F(B 3 $B$D$NItJ,$KJ,$+$l$k!#(B  この MathCap データのリスト構造は大きく分けて 3 つの部分に分かれる。
 $B:G=i$N(B {\tt [199901160,"ox\_asir"]} $B$NItJ,$K$O%5!<%P$N>pJs$,F~$C$F$$$k!#(B  最初の {\tt [199901160,"ox\_asir"]} の部分にはサーバの情報が入っている。
 %$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!"<!$NMWAG$O%5!<%P$NL>A0$rI=$7$F$$$k!#(B  最初の要素はバージョンナンバーを、次の要素はサーバの名前を表している。
   
 $B<!$N(B {\tt [276,275,$\cdots$,271]} $B$NItJ,$O(B  次の {\tt [276,275,$\cdots$,271]} の部分は
 $B%5!<%P$KBP$9$kF0:n$KBP1~$7$?M}2r2DG=$J%G!<%?$N<oN`$rI=$7$F$$$k!#(B  サーバに対する動作に対応した理解可能なデータの種類を表している。
 $B%5!<%P$NF0:n$KBP$9$k%G!<%?$O$9$Y$F(B 32 bit $B$N@0?t$GI=$7$F$*$j!"(B  サーバの動作に対するデータはすべて 32 bit の整数で表しており、
 $B$3$N%j%9%H$OM}2r2DG=$J%G!<%?$KBP1~$9$k(B 32 bit $B@0?t$N%j%9%H$H$J$C$F$$$k!#(B  このリストは理解可能なデータに対応する 32 bit 整数のリストとなっている。
   
 $B:G8e$N(B {\tt [ [514,[1,2,3,$\cdots$,60]],[2144202544,[0,1]] ]} $B$NItJ,$O(B  最後の {\tt [ [514,[1,2,3,$\cdots$,60]],[2144202544,[0,1]] ]} の部分は
 $BM}2r2DG=$J%G!<%?$N7A<0$rI=$7$F$$$k!#(B  理解可能なデータの形式を表している。
 $B$3$NItJ,$O$5$i$K(B {\tt [514,[1,2,3,$\cdots$,60]]} $B$H(B  この部分はさらに {\tt [514,[1,2,3,$\cdots$,60]]} と
 {\tt [2144202544,[0,1]]} $B$KJ,$1$k$3$H$,$G$-!"(B  {\tt [2144202544,[0,1]]} にの部分に分けることができ、
 %%$B$3$N%j%9%H$NMWAG$O$^$?%j%9%H$H$J$C$F$*$j!"(B  それぞれが一つのデータ形式についての情報となっている。
 %$B$3$N:G8e$NItJ,$b$^$?%j%9%H$H$J$C$F$*$j!"(B  どのデータ形式についての情報かは最初の要素にある整数値をみれば
 %$B$"$k%G!<%?7A<0$GM}2r2DG=$J$b$N$rI=8=$7$?%j%9%H$rMWAG$H$7$F$$$k!#(B  分かるようになっている。
 %{\tt [514,[1, 2, $\cdots$]]} $B$N:G=i$N(B 514 $B$O$3$N%j%9%H$,(B CMO $B7A<0(B  この整数値は CMO 形式では 514 となっている。
 %$B$G$NM}2r2DG=$J%G!<%?$rI=$7$F$$$k$3$H$r<($7$F$*$j!"(B  最初のデータ形式を区別する整数値以後の要素は
 %$B$=$N8e$N%j%9%H$G$O(B CMO $BAX$GDj5A$5$l$F$$$k%G!<%?$N$&$A!"(B  各データ形式によってどのように使われるか定まっている。
 %$BM}2r2DG=$J%G!<%?$N(B tag $B$,JB$s$G$$$k!#(B  CMO 形式では理解可能なデータのタグがリストの中に収まっている。
 %$BA0@a$G(B CMO $B7A<0$G$OB?G\D9@0?t$rI=$9(B tag $B$,(B 20 $B$G$"$k$3$H$r=R$Y$?$,!"(B  前節で CMO 形式では多倍長整数を表すタグが 20 であることを述べたが、
 %$B$3$N%j%9%H$K(B 20 $B$,4^$^$l$F$$$k$N$G!"(B ox\_asir $B$O(B CMO $B7A<0$N(B  このリストに 20 が含まれているので、
 %$BB?G\D9@0?t$,M}2r$G$-$k$3$H$,$o$+$k!#(B  ox\_asir は CMO 形式の多倍長整数を受け取れることがわかる。
   
 $B:G=i$N%j%9%H$,%5!<%P$N>pJs$rI=$7$F$$$k$H$$$C$?$3$H$,M}2r$G$-$k$3$H$H!"(B  %%このリストの要素はまたリストとなっており、
 $B%G!<%?$,<u$1<h$l$k$3$H$H$O$^$C$?$/JLJ*$G$"$k$N$G(B  %この最後の部分もまたリストとなっており、
 $BCm0U$9$kI,MW$,$"$k!#(B  %あるデータ形式で理解可能なものを表現したリストを要素としている。
   %{\tt [514,[1, 2, $\cdots$]]} の最初の 514 はこのリストが CMO 形式
   %での理解可能なデータを表していることを示しており、
   %その後のリストでは CMO 層で定義されているデータのうち、
   %理解可能なデータのタグが並んでいる。
   
   なお、データが受け取れることと、
   データの論理構造が理解できることとはまったく別物であるので
   注意する必要がある。
   
 \section{security $BBP:v(B}  
   
 OpenXM $B$G$O4v$i$+$N%;%-%e%j%F%#BP:v$r9T$J$C$F$$$k!#(B  \section{セキュリティ対策}
   
 $B$^$:!"@\B3$,I,MW$K$J$C$?;~$K!"%/%i%$%"%s%H$,%5!<%PB&$+$i$N(B  OpenXM では幾らかのセキュリティ対策を考えている。
 $B@\B3$rBT$D$h$&$K$J$C$F$$$k!#$3$l$O>o$K@\B3$rBT$D$3$H$K$h$C$F!"(B  OpenXM に対応したソフトウェアをクラックしても
 $B?/F~<T$K@\B3$N5!2q$rM?$($F$7$^$&$3$H$r8:$i$9$?$a$G$"$k!#(B  大した利点はないと思えるが、それは設計上の話であって、
   予期せぬ手段で攻撃を受けた場合にどのような事態を
   招くかは想像し難い。
   
 $B<!$K!"%/%i%$%"%s%H$,@\B3Kh$K@\B3$rBT$D(B port $BHV9f$r%i%s%@%`$K7hDj$9$k(B  そこで、 OpenXM では侵入者に攻撃の機会を
 $B$3$H$K$J$C$F$$$k!#$3$l$K$h$j!"?/F~<T$,$I$3$K@\B3$r9T$J$($P$h$$$N$+(B  できるだけ与えないようにしている。
 $B$o$+$j$K$/$/$7$F$$$k!#(B  具体的には、接続が必要になった時のみ接続を待つようにし、
   常に接続に関与するといったことは避けている。
   
 $B:G8e$K!"@\B3;~$K%/%i%$%"%s%H$,(B 1 $B2s$N$_M-8z$J%Q%9%o!<%I$rH/9T$7!"(B  しかし、これだけでは侵入者が接続を行なう一瞬のすきを
 $BG'>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$+$N<jCJ$G%Q%9%o!<%I$,1L$l$?$H$7$F$b(B  そこで接続を行なう時に、
 $B0BA4$G$"$k!#$J$*!"$3$N%Q%9%o!<%I$O0BA4$J<jCJ$GAw$i$l$F$$$J$$$H(B  接続を待つポート番号をランダムに決めている。
 $B$$$1$J$$!#$^$?!"8=:_$N<BAu$G$O%5!<%P!"$*$h$S%/%i%$%"%s%H$NF0:n$7$F$$$k(B  こうすることで、特定のポート番号を狙って接続を行なう
 $B%3%s%T%e!<%?>e$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<u?.$K4X$7$F$O!"(B  さらにもう一段安全性を高めるために、
 $BFC$K0E9f2=$J$I$N=hCV$,9T$J$o$l$F$$$k$o$1$G$O$J$$!#(B  接続時に 1 回だけ使用可能なパスワードを作成し、
 $B$b$7I,MW$,$"$l$P!"DL?.O)$N0E9f2=$r9T$J$&5!G=$,$"$k(B  そのパスワードを使って認証を行なう。
 $B%=%U%H%&%'%"$r;H$&$3$H$r9M$($F$$$k!#(B  このパスワードは一旦使用されれば無効にするので、
   もし仮になんらかの手段でパスワードが洩れたとしても安全である。
   
   なお、上記のポート番号とパスワードは安全な手段で送られて
   いると仮定している。
   また、同一のコンピュータ上に悪意のあるユーザはいないと仮定している
   ことに注意しなければならない。
   なぜなら、現在の実装ではサーバ、およびクライアントの動作している
   コンピュータ上ではこのポート番号とパスワードがわかってしまうためである。
   
 \section{$BB>$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  \section{他のプロジェクト}
 $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<j=g$K$D$$$F$b=R$Y$i$l$F$$$k!#(B  
 $BI=8=J}K!$O0l$D$@$1$G$J$/!"(B XML $BI=8=$d(B binary $BI=8=$J$I$,(B  
 $BMQ0U$5$l$F$$$k!#(B  
   
 %$B0J2<!"D4$Y$kI,MW$"$j!#(B  他のプロジェクトについても触れておこう。
 %NetSolve  
   
 %MP  OpenMath プロジェクトは数学的なオブジェクトを
   コンピュータ上で表現する方法を決定している。
   各ソフトウェア間でオブジェクトを交換する際の
   オブジェクトの変換手順についても述べられている。
   表現方法は一つだけでなく、 XML 表現や binary 表現などが
   用意されている。
   詳細は
   
 %MCP  http://www.openmath.org/omsoc/index.html A.M.Cohen
   
 \section{$B8=:_Ds6!$5$l$F$$$k%=%U%H%&%'%"(B}  
   
 $B8=:_(B OpenXM $B5,3J$KBP1~$7$F$$$k%/%i%$%"%s%H%=%U%H%&%'%"$K$O(B  以下は書いてる途中。
 asir, sm1, Mathematica $B$,$"$k!#(B  
 $B$3$l$i$N%/%i%$%"%s%H%=%U%H%&%'%"$+$i(B  NetSolve
 OpenXM $B5,3J$KBP1~$7$?%5!<%P$r8F$S=P$9$3$H$,$G$-$k!#(B  
 $B8=:_(B OpenXM $B5,Ls$KBP1~$7$F$$$k%5!<%P%=%U%H%&%'%"$K$O!"(B  http://www.cs.utk.edu/netsolve/
  asir, sm1, gnuplot, Mathematica $B$J$I$,$"$j!"(B  
 $B$=$l$>$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  MP
 $B%G!<%?$rJQ49$9$k%=%U%H%&%'%"$,(B JAVA $B$K$h$C$F<BAu$5$l$F$*$j!"(B  
 OMproxy $B$H$$$&L>A0$GDs6!$5$l$F$$$k!#(B  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}  \end{document}

Legend:
Removed from v.1.26  
changed lines
  Added in v.1.43

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