<!--
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" [
-->
<!doctype article public "-//OASIS//DTD DocBook V3.1//EN" [

<!ENTITY license "
      <para>Permission is granted to copy, distribute and/or modify this
      document under the terms of the <ulink type='http'
      url='http://www.fsf.org/copyleft/fdl.html'><citetitle>GNU Free
      Documentation License</citetitle></ulink>, Version 1.1 or any later
      version published by the Free Software Foundation with no Invariant
      Sections, no Front-Cover Texts, and no Back-Cover Texts. You may
      obtain a copy of the <citetitle>GNU Free Documentation
      License</citetitle> from the Free Software Foundation by visiting
      <ulink type='http' url='http://www.fsf.org/'>their Web site</ulink>
      or by writing to: Free Software Foundation, Inc., 59 Temple Place -
      Suite 330, Boston, MA 02111-1307, USA.</para>

      <para>This manual contains short example programs (<quote>the
      Software</quote>). Permission is hereby granted, free of charge, to
      any person obtaining a copy of the Software, to deal in the Software
      without restriction, including without limitation the rights to use,
      copy, modify, merge, publish, distribute, sublicense, and/or sell
      copies of the Software, and to permit persons to whom the Software is
      furnished to do so, subject to the following condition:</para>

      <para>THE SOFTWARE IS PROVIDED <quote>AS IS</quote>, WITHOUT WARRANTY
      OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
      WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
      NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
      CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
      TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
      SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</para>
">

<!ENTITY % GoodStyleSheets "IGNORE">
<![%GoodStyleSheets;[
<!ENTITY legal.notice "
    <legalnotice id='xmlrpc-howto-legal'>&license;</legalnotice>
">
<!ENTITY legal.section "">
]]>

<!ENTITY legal.notice "">
<!ENTITY legal.section "
  <section id='xmlrpc-howto-legal'>
    <title>Legal Notice</title>
    &license;
  </section>
">

]>

<article id="xmlrpc-howto">
  <title>XML-RPC HOWTO</title>

  <!--
  <articleinfo>
  -->
  <artheader>
    <title>XML-RPC HOWTO</title>
    
    <pubdate>0.8.0, 2001-04-12</pubdate>
    
    <authorgroup>
      <author>
	<firstname>Eric</firstname>
	<surname>Kidd</surname>
	
	<affiliation>
	  <orgname>Source Builders</orgname>
	  <address><email>eric.kidd@pobox.com</email></address>
	</affiliation>
      </author>
      
      <author>
	<othername>And Other Contributors</othername>
      </author>

      <othercredit role='translator' lang="ja">
        <firstname>浩一</firstname>
        <surname>野本</surname>
        <contrib>日本語翻訳</contrib>
        <affiliation>
          <address>
            <email>hng@ps.ksky.ne.jp</email>
          </address>
        </affiliation>
      </othercredit>
    </authorgroup>
    
    <copyright>
      <year>2001</year>
      <holder>Eric Kidd</holder>
    </copyright>
    
    <abstract>
      <!--
      <para>Describes how to use XML-RPC to implement clients and servers
      in a variety of languages. Provides example code in Perl, Python, C,
      C++, Java, PHP and other languages. Includes sections on Zope and KDE
      2.0. Applies to all operating systems with XML-RPC support.</para>
      -->
      <para>様々な言語でクライアントおよびサーバを実装するための XML-RPC
      の使用方法を述べます。例題のプログラムは Perl, Python, C, C++,
      Java, PHP および他の言語で示しています。Zope や KDE 2.0 についても
      扱っています。XML-RPC のサポートはすべてのオペレーティングシステム
      で利用できます。</para>
    </abstract>

    &legal.notice;

    <revhistory>
      <revision>
	<revnumber>0.8.0</revnumber>
	<date>2001-04-12</date>
	<revremark>Updated section on common interfaces.  Added pointer to
	XML-RPC.Net information.</revremark>
      </revision>
      <revision>
	<revnumber>0.7.0</revnumber>
	<date>2001-04-03</date>
	<revremark>Added section on C++ proxy classes.</revremark>
      </revision>
      <revision>
	<revnumber>0.6.0</revnumber>
	<date>2001-02-02</date>
	<revremark>Added sections on Ruby, K and common
	interfaces.</revremark>
      </revision>
      <revision>
	<revnumber>0.5.0</revnumber>
	<date>2001-01-23</date>
	<revremark>Initial version.</revremark>
      </revision>
    </revhistory>
  <!--
  </articleinfo>
  -->
  </artheader>

  &legal.section;

  <section id="xmlrpc-howto-intro">
    <!--
    <title>What is XML-RPC?</title>
    -->
    <title>XML-RPC とは？</title>

    <!--
    <para><ulink url="http://www.xmlrpc.com/">XML-RPC</ulink> is a simple,
    portable way to make remote procedure calls over HTTP. It can be used
    with Perl, Java, Python, C, C++, PHP and many other programming
    languages. Implementations are available for Unix, Windows and the
    Macintosh.</para>
    -->
    <!--draft2-->
    <para><ulink url="http://www.xmlrpc.com/">XML-RPC</ulink> は HTTP 上
    でリモート手続き呼び出しを行うための簡単で手軽な方法です。Perl,
    Java, Python, C, C++, PHP や多くの他のプログラミング言語で使用できま
    す。Unix と Windows, Macintosh 上で利用可能です。
    </para>

    <!--
    <para>Here's a short XML-RPC client written in Perl. (We use Ken
    MacLeod's <ulink
    url="http://bitsko.slc.ut.us/~ken/xml-rpc/">Frontier::Client</ulink>
    module.)</para>
    -->
    <para>Perl で書かれた短い XML-RPC クライアントを示します (Ken
    MacLeod の <ulink url=
    "http://bitsko.slc.ut.us/~ken/xml-rpc/"
    >Frontier::Client</ulink> を使用します)。</para>

    <programlisting format="linespecific">use Frontier::Client;
$server = Frontier::Client->new(url => 'http://betty.userland.com/RPC2');
$name = $server->call('examples.getStateName', 41);
print "$name\n";</programlisting>

    <!--
    <para>When run, this program will connect to the remote server, get the
    state name, and print it. (State #41 should be South Dakota in this
    example.)</para>
    -->
    <para>実行すると、このプログラムはリモートのサーバに接続し、州名を得
    て、それを表示します (この例の州番号 41 は South Dakota のはずです)。
    </para>

    <!--
    <para>Here's the same program in Python. (This time, we use Fredrik
    Lundh's <ulink
    url="http://www.pythonware.com/products/xmlrpc/">xmlrpclib</ulink>.)</para>
    -->
    <para>Python での同じプログラムです (これでは Fredrik Lundh の
    <ulink url=
    "http://www.pythonware.com/products/xmlrpc/"
    >xmlrpclib</ulink> を使います)。</para>
    
    <programlisting format="linespecific">python> import xmlrpclib
python> server = xmlrpclib.Server("http://betty.userland.com/RPC2")
python> server.examples.getStateName(41)
'South Dakota'</programlisting>

    <!--
    <para>In the following chapters, you'll learn how to write XML-RPC
    clients and servers in a variety of programming languages.</para>
    -->
    <para>以降の章では、様々な言語で XML-RPC クライアントおよびサーバの書
    き方を学びます。</para>

    <section id="xmlrpc-howto-spec">
      <!--
      <title>How it Works</title>
      -->
      <title>どのように動作するのか</title>

      <!--
      <para>XML-RPC is described fully in Dave Winer's <ulink
      url="http://www.xmlrpc.com/spec">official specification</ulink>. If
      you're curious, go ahead and take a look&mdash;it's a quick and
      straight-forward read.</para>
      -->
      <!--draft2-->
      <para>XML-RPC は Dave Winer の<ulink 
      url="http://www.xmlrpc.com/spec">公式仕様書</ulink>で詳細に説明さ
      れています。興味があるなら、是非ご覧になってください。簡潔で明解な
      文書です。</para>

      <!--
      <para>On the wire, XML-RPC values are encoded as XML:</para>
      -->
      <para>通信する上で、XML-RPC の値は XML にエンコードされます
      -</para>

      <programlisting>&lt;methodCall>
  &lt;methodName>sample.sumAndDifference&lt;/methodName>
  &lt;params>
    &lt;param>&lt;value>&lt;int>5&lt;/int>&lt;/value>&lt;/param>
    &lt;param>&lt;value>&lt;int>3&lt;/int>&lt;/value>&lt;/param>
  &lt;/params>
&lt;/methodCall></programlisting>

      <!--
      <para>This is verbose, but compresses readily. It's also faster than
      you might expect&mdash;according to measurements by Rick Blair, a
      round-trip XML-RPC call takes 3 milliseconds using Hannes
      Walln&ouml;fer's Java implementation.</para>
      -->
      <!--draft2-->
      <para>上記は冗長ですが、簡単に圧縮できます。また、予想以上に速い
      です - Rick Blair の測定によれば、Hannes Walln&ouml;fer の Java
      での実装を使うと XML-RPC 呼び出しの応答時間は 3 ミリ秒です。
      </para>

    </section>

    <section id="xmlrpc-howto-types">
      <!--
      <title>Supported Data Types</title>
      -->
      <title>サポートされるデータの種別</title>

      <!--
      <para>XML-RPC supports the following data types:</para>
      -->
      <para>XML-RPC は以下のデータの種別をサポートします。</para>

      <variablelist>
	<varlistentry>
	  <term><literal>int</literal></term>
	  <listitem>
            <!--
	    <para>A signed, 32-bit integer.</para>
            -->
	    <para>符号付 32 ビット整数</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><literal>string</literal></term>
	  <listitem>
            <!--
	    <para>An ASCII string, which may contain NULL bytes. (Actually,
	    several XML-RPC implementations support Unicode, thanks to the
	    underlying features of XML.)</para>
            -->
	    <para>ASCII 文字列で空バイトも許されます。(実際にはたくさんの
	    XML-RPC の実装が Unicode をサポートしています。XML の基本機
            能に感謝。)</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><literal>boolean</literal></term>
	  <listitem>
            <!--
	    <para>Either true or false.</para>
            -->
	    <para>真か偽のどちらか</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><literal>double</literal></term>
	  <listitem>
            <!--
	    <para>A double-precision floating point number. (Accuracy may
	    be limited in some implementations.)</para>
            -->
	    <para>倍精度浮動小数点実数 (実際にはいくつかの実装で使えない
            かもしれません)</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><literal>dateTime.iso8601</literal></term>
	  <listitem>
            <!--
	    <para>A date and time. Unfortunately, since XML-RPC forbids the
	    use of timezones, this is very nearly useless.</para>
            -->
            <!--draft2-->
            <para>日付と時刻。残念ながら、XML-RPC はタイムゾーンの使用を
            禁止しているので、これはほとんど役に立ちません。</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><literal>base64</literal></term>
	  <listitem>
            <!--
	    <para>Raw binary data of any length; encoded using Base64 on
	    the wire. Very useful. (Some implementations don't like to
	    receive zero bytes of data, though.)</para>
            -->
	    <para>任意長の生のバイナリデータ - 通信上 Base64 を使用して
	    エンコードされます。とても役立ちます (けれどもいくつかの実装
	    では 0 バイトのデータ受信が行えません)。</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><literal>array</literal></term>
	  <listitem>
            <!--
	    <para>An one-dimensional array of values. Individual values may
	    be of any type.</para>
            -->
	    <para>値の一次元配列。個々の値はどんな種別でもかまいません
	    </para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><literal>struct</literal></term>
	  <listitem>
            <!--
	    <para>A collection of key-value pairs. The keys are strings;
	    the values may be of any type.</para>
            -->
	    <para>キーと値の集まり。キーは文字列です - 値はどんな種別
	    でもかまいません。</para>
	  </listitem>
	</varlistentry>
      </variablelist>
    </section>

    <section id="xmlrpc-howto-history">
      <!--
      <title>The History of XML-RPC</title>
      -->
      <title>XML-RPC の歴史</title>

      <!--
      <para>XML-RPC was inspired by two earlier protocols. The first is an
      anonymous RPC protocol designed by Dave Winer and announced in an
      <ulink
      url="http://davenet.userland.com/1998/02/27/rpcOverHttpViaXml">old
      DaveNet essay</ulink>. (This is why XML-RPC servers are often
      installed under <filename>/RPC2</filename>.) The other, more
      important inspiration was an early draft of the SOAP protocol.</para>
      -->
      <!--draft2-->
      <para>XML-RPC は、先行する二つのプロトコルから着想を得ています。そ
      の一つは、anonymous RPC であり、これは Dave Winer により設計され、
      過去に <ulink url=
      "http://davenet.userland.com/1998/02/27/rpcOverHttpViaXml"
      >DaveNet でのエッセイ</ulink>として発表されたものです (XML-RPC サー
      バが <filename>/RPC2</filename> 下にインストールされることが多いの
      はこのためです)。もう一つの、より重要な着想は、SOAP プロトコルの初
      期ドラフトによるものです。</para>

      <!--
      <para>A longer <ulink
      url="http://www.xmlrpc.com/stories/storyReader$555">history of
      XML-RPC</ulink> has been generously provided by Dave Winer. This also
      explains the relationship between XML-RPC and SOAP.</para>
      -->
      <!--draft2-->
      <para>より詳しい <ulink
      url="http://www.xmlrpc.com/stories/storyReader$555"
      >XML-RPC の歴史</ulink>という文書を Dave Winer が提供してくれてい
      ます。この文書では、XML-RPC と SOAP との関係についても説明されてい
      ます。</para>
    </section>

  </section>

  <section id="xmlrpc-howto-competition">
    <!--
    <title>XML-RPC vs. Other Protocols</title>
    -->
    <title>XML-RPC 対 他のプロトコル</title>

    <!--
    <para>XML-RPC is not the only way to make remote procedure calls. Other
    popular protocols include CORBA, DCOM and SOAP. Each of these protocols
    has advantages and disadvantages.</para>
    -->
    <para>リモート手続き呼び出しは XML-RPC が唯一の方法ではありません。
    人気のある他のプロトコルには CORBA, DCOM, SOAP などがあります。各
    プロトコルには長所と短所があります。</para>

    <!--
    <para>The opinions in the section are obviously biased; please take
    them with a grain of salt.</para>
    -->
    <!--draft2-->
    <para>この章での意見には、(著者の) 明らかな偏見も含まれています。ど
    うか、その点を考慮してお読みください。</para>

    <section id="xmlrpc-howto-corba">
      <!--
      <title>XML-RPC vs. CORBA</title>
      -->
      <title>XML-RPC 対 CORBA</title>

      <!--
      <para><ulink url="http://www.corba.org/">CORBA</ulink> is a popular
      protocol for writing distributed, object-oriented applications. It's
      typically used in multi-tier enterprise applications. Recently, it's
      also been adopted by the <ulink
      url="http://www.gnome.org/">Gnome</ulink> project for
      interapplication communication.</para>
      -->
      <para><ulink url="http://www.corba.org/">CORBA</ulink> は人気のあ
      るプロトコルで、分散型オブジェクト指向アプリケーション向けに書かれ
      ています。一般的に複数の層を持つエンタープライズアプリケーションで
      使用されます。最近では、アプリケーション間通信用にも <ulink
      url="http://www.gnome.org/">Gnome</ulink> プロジェクトによって選定
      されています。</para>

      <!--
      <para>CORBA is well-supported by many vendors and several free
      software projects. CORBA works well with Java and C++, and is
      available for many other languages. CORBA also provides an excellent
      <glossterm>interface definition language</glossterm> (IDL), allowing
      you to define readable, object-oriented APIs.</para>
      -->
      <para>CORBA は多くのベンダーやたくさんのフリーソフトウェアプロジェ
      クトにより、よくサポートされています。CORBA は Java, C++ とうまく
      動作し、多くの他の言語からも利用可能です。さらに CORBA は優れた
      <glossterm>interface definition language</glossterm> (IDL) を提供
      し、読みやすいオブジェクト指向 API を定義できるようにします。
      </para>
      
      <!--
      <para>Unfortunately, CORBA is very complex. It has a steep
      learning curve, requires significant effort to implement, and
      requires fairly sophisticated clients. It's better-suited to
      enterprise and desktop applications than it is to distributed web
      applications.</para>
      -->
      <!--draft2-->
      <para>残念なことに、CORBA はとても複雑です。学習曲線は急勾配となっ
      ていて、実装するのに非常な努力を必要とし、かなり高度なクライアン
      トを必要とします。分散型ウェブアプリケーションよりもエンタープラ
      イズやデスクトップアプリケーションに一番適しています。</para>

    </section>

    <section id="xmlrpc-howto-dcom">
      <!--
      <title>XML-RPC vs. DCOM</title>
      -->
      <title>XML-RPC 対 DCOM</title>

      <!--
      <para><ulink
      url="http://www.microsoft.com/com/tech/DCOM.asp">DCOM</ulink> is
      Microsoft's answer to CORBA. It's great if you're already using COM
      components, and you don't need to talk to non-Microsoft
      systems. Otherwise, it won't help you very much.</para>
      -->
      <!--draft2-->
      <para><ulink
      url="http://www.microsoft.com/com/tech/DCOM.asp">DCOM</ulink> は
      CORBA に対する Microsoft の答えです。すでに COM コン
      ポーネントを使用していて Microsoft 以外のシステムとやり取りする必
      要がなければ、素晴らしいものです。そうでなければ、あまり役に立たな
      いでしょう。</para>

    </section>

    <section id="xmlrpc-howto-soap">
      <!--
      <title>XML-RPC vs. SOAP</title>
      -->
      <title>XML-RPC 対 SOAP</title>

      <!--
      <para><ulink url="http://www.w3.org/TR/SOAP/">SOAP</ulink> is very
      similar to XML-RPC. It, too, works by marshaling procedure calls
      over HTTP as XML documents. Unfortunately, SOAP appears to be
      suffering from specification creep.</para>
      -->
      <para><ulink url="http://www.w3.org/TR/SOAP/">SOAP</ulink> はとて
      も XML-RPC に似ています。XML 文書のまま、HTTP 上で整列した手続き呼
      び出しを行う動作も似ています。残念ながら SOAP は仕様の確定に悩んで
      いるように見えます。</para>

      <!--
      <para>SOAP was originally created as a collaboration between
      UserLand, DevelopMentor and Microsoft. The initial public release was
      basically XML-RPC with namespaces and longer element names. Since
      then, however, SOAP has been turned over a W3C working group.</para>
      -->
      <!--draft2-->
      <para>SOAP は元々 UserLand, DevelopMentor, Microsoft の共同制作に
      より作成されました。最初の公のリリースは基本的にネームスペースと長
      いエレメント名を持つ XML-RPC でした。しかしその後 SOAP は W3C ワー
      キンググループに引き継がれました。</para>

      <!--
      <para>Unfortunately, the working group has been adding a laundry-list
      of strange features to SOAP. As of the current writing, SOAP supports
      XML Schemas, enumerations, strange hybrids of structs and arrays, and
      custom types. At the same time, several aspects of SOAP are
      implementation defined.</para>
      -->
      <!--draft2-->
      <para>残念なことに、ワーキンググループは SOAPにとても多くの不可解
      な機能の追加を行っています。この文書の執筆時点で、SOAP は XML
      スキーム、エミュレーション、奇妙な複合構造体および配列、そしてカス
      タムタイプをサポートしています。加えて、いくつもの SOAP の外部仕様
      の実装も定義されています。</para>

      <!--
      <para>Basically, if you like XML-RPC, but wish the protocol had more
      features, check out SOAP. :-)</para>
      -->
      <para>基本的に XML-RPC が好きであるけれどもっとたくさんの機能を持っ
      たプロトコルを望む場合、SOAP を調査するといいでしょう。 :-)</para>
      
    </section>

  </section>

  <section id="xmlrpc-howto-interfaces">
    <!--
    <title>Common XML-RPC Interfaces</title>
    -->
    <title>一般的な XML-RPC インターフェース</title>

    <!--
    <para>Several XML-RPC servers provide built-in methods. These aren't
    part of XML-RPC itself, but they make handy add-ons.</para>
    -->
    <para>いくつかの XML-RPC サーバはビルトインメソッドを提供します。そ
    れらは XML-RPC それ自身のものではありませんが、とても便利な追加機能
    です。</para>

    <section id="xmlrpc-howto-api-introspection">
      <!--
      <title>Introspection: Discovering Server APIs</title>
      -->
      <title>イントロスペクション - サーバの API を掘り出す</title>

      <!--
      <para>Edd Dumbill <ulink
      url="http://xmlrpc.usefulinc.com/doc/reserved.html">proposed</ulink>
      the following set of methods:</para>
      -->
      <para>Edd Dumbill は次のメソッドの組みを<ulink
      url="http://xmlrpc.usefulinc.com/doc/reserved.html">提案</ulink>し
      ました。</para>

      <synopsis><returnvalue>array</returnvalue> <function>system.listMethods</function> ()
<returnvalue>string</returnvalue> <function>system.methodHelp</function> (<type>string</type> <parameter>methodName</parameter>)
<returnvalue>array</returnvalue> <function>system.methodSignature</function> (<type>string</type> <parameter>methodName</parameter>)</synopsis>

      <!--
      <para>If a server supports these methods, you can ask it to print out
      some documentation:</para>
      -->
      <para>サーバがこれらのメソッドをサポートする場合、あるドキュメンテー
      ションを印字するためにサーバへ問い合わせができます -</para>

      <programlisting>import xmlrpclib
server = xmlrpclib.Server("http://xmlrpc-c.sourceforge.net/api/sample.php")
for method in server.system.listMethods():
    print method
    print server.system.methodHelp(method)
    print</programlisting>

      <!--
      <para>These methods are currently supported by servers written in
      PHP, C and Microsoft .NET.  Partial introspection support is included
      in recent updates to UserLand Frontier.  Introspection support for
      Perl, Python and Java is available at the <ulink
      url="http://xmlrpc-c.sourceforge.net/hacks.php">XML-RPC
      Hacks</ulink> page.  Please feel free to add introspection support to
      other XML-RPC servers!</para>
      -->
      <para>これらのメソッドは PHP および C、Microsoft .NET で書かれたサー
      バによりサポートされています。部分的なイントロスペクションのサポー
      トは最近になって UserLand Frontier にも組み込まれています。Perl お
      よび Python, Java 用のイントロスペクションのサポートは <ulink url=
      "http://xmlrpc-c.sourceforge.net/hacks.php"
      >XML-RPC Hacks</ulink> のページで入手できます。どうぞ、遠慮なくイ
      ントロスペクションのサポートを他の XML-RPC サーバに追加してくださ
      い！</para>

      <!--
      <para>Various client-side tools (documentation generators, wrapper
      generators, and so on) can be found at the XML-RPC Hacks page as
      well.</para>
      -->
      <para>様々なクライアント側のツール (ドキュメンテーション、ラッパー
      生成等等) も XML-RPC Hacks のページで見つけられます。</para>
    </section>

    <section id="xmlrpc-howto-api-boxcarring">
      <!--
      <title>Boxcarring: Sending Multiple Requests at Once</title>
      -->
      <title>Boxcarring - 同時に複数の要求を送る</title>

      <!--
      <para>If you're writing an XML-RPC client which makes lots of small
      function calls, you may discover that your round-trip time is fairly
      high, thanks to Internet backbone latency. Some servers allow you to
      batch up multiple requests using the following function:</para>
      -->
      <!--draft2-->
      <para>多くのファンクションコールをする XML-RPC クライアントを書い
      ているなら、インターネットのバックボーンのレーテンシー (待ち時間)
      が短いおかげで、応答時間がかなり速いことを気づくかもしれません。い
      くつかのサーバは次の機能を使うことで複数の要求を一括処理
      (batching) できます。</para>

      <synopsis><returnvalue>array</returnvalue> <function>system.multicall</function> (<type>array</type> <parameter>calls</parameter>)</synopsis>

      <!--
      <para>You can find more information in the <ulink
      url="http://www.xmlrpc.com/discuss/msgReader$1208">system.multicall
      RFC</ulink>.</para>
      -->
      <para>追加情報は <ulink url=
      "http://www.xmlrpc.com/discuss/msgReader$1208"
      >system.multicall RFC</ulink> より得てください。</para>

      <!--
      <para>This method is currently supported by servers written in C and
      UserLand Frontier.  Servers written in Python and Perl can use the
      code at the <ulink
      url="http://xmlrpc-c.sourceforge.net/hacks.php">XML-RPC
      Hacks</ulink> page.</para>
      -->
      <para>現在、このメソッドは C および UserLand Frontier で書かれたサー
      バでサポートされています。Python および Perl で書かれたサーバは
      <ulink url=
      "http://xmlrpc-c.sourceforge.net/hacks.php"
      >XML-RPC Hacks</ulink> のページにあるプログラムを利用できます。
      </para>
    </section>
  </section>

  <section id="xmlrpc-howto-api">
    <!--
    <title>A Sample API: <function>sumAndDifference</function></title>
    -->
    <title>API の事例 - <function>sumAndDifference</function></title>

    <!--
    <para>To demonstrate XML-RPC, we implement the following API in as many
    languages as possible.</para>
    -->
    <para>XML-RPC のデモをするために、可能な限り多くの言語で以下に示しま
    す。</para>

    <synopsis><returnvalue>struct</returnvalue> <function>sample.sumAndDifference</function> (<type>int</type> <parameter>x</parameter>, <type>int</type> <parameter>y</parameter>)</synopsis>
    
    <!--
    <para>This function takes two integers as arguments, and returns an
    XML-RPC <literal>&lt;struct></literal> containing two elements:</para>
    -->
    <para>この関数は引き数として二つの整数を受け取って、二つのエレメント
    を持つ XML-RPC <literal>&lt;struct(構造体)></literal> を戻します -</para>
       
    <variablelist>
      <varlistentry>
        <term><parameter>sum</parameter></term>
        <listitem>
          <!--
          <para>The sum of the two integers.</para>
          -->
          <para>二つの整数の和</para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term><parameter>difference</parameter></term>
        <listitem>
          <!--
          <para>The difference between the two integers.</para>
          -->
          <para>二つの整数の差</para>
        </listitem>
      </varlistentry>
    </variablelist>

    <!--
    <para>It's not very useful, but it makes a nice example. :-)</para>
    -->
    <para>実用的なものではありませんが、立派な例題になっています
    :-)</para>

    <!--
    <para>This function (and others) are available using the URL
    <literal>http://xmlrpc-c.sourceforge.net/api/sample.php</literal>.
    (This URL won't do anything in a browser; it requires an XML-RPC
    client.)</para>
    -->
    <para>この関数 (や他のもの) は URL
    <literal>http://xmlrpc-c.sourceforge.net/api/sample.php</literal> を
    利用しています (この URL はブラウザでは何もできず、XML-RPC クライア
    ントで利用できます)。</para>

  </section>

  <section id="xmlrpc-howto-perl">
    <!--
    <title>Using XML-RPC with Perl</title>
    -->
    <title>Perl での XML-RPC の使い方</title>

    <!--
    <para>Ken MacLeod has implemented XML-RPC for Perl. You can find his
    Frontier::RPC module at his <ulink
    url="http://bitsko.slc.ut.us/~ken/xml-rpc/">website</ulink> or through
    <ulink url="http://www.cpan.org/">CPAN</ulink>.</para>
    -->
    <para>Ken MacLeod は Perl 用 XML-RPC を実装しています。彼の
    Frontier::RPC モジュールは彼の<ulink url=
    "http://bitsko.slc.ut.us/~ken/xml-rpc/">ウェブサイト</ulink>もしくは
    <ulink url="http://www.cpan.org/">CPAN</ulink> を通じて入手できます。
    </para>

    <!--
    <para>To install Frontier::RPC, download the package and compile
    it in the standard fashion:</para>
    -->
    <para>Frontier::RPC をインストールするには、標準的なやり方でパッケー
    ジをダウンロードしてコンパイルします -</para>

    <programlisting>bash$ gunzip -c Frontier-RPC-0.07b1.tar.gz | tar xvf -
bash$ cd Frontier-RPC-0.07b1
bash$ perl Makefile.PL
bash$ make
bash$ make test
bash$ su -c 'make install'</programlisting>

    <!--
    <para>(The process will be slightly different on Windows systems, or if
    you don't have root access. Consult your Perl documentation for
    details.)</para>
    -->
    <para>(ウィンドウ環境やルート権限の無い場合、わずかに違った手順とな
    るでしょう。詳細は Perl の文書を参考にしてください。)</para>

    <section id="xmlrpc-howto-perl-client">
      <!--
      <title>A Perl Client</title>
      -->
      <title>Perl クライアント</title>

      <!--
      <para>The following program shows how to call an XML-RPC server from
      Perl:</para>
      -->
      <para>次のプログラムは Perl から XML-RPC サーバのコールの方法を示
      します。</para>

      <programlisting>use Frontier::Client;

# Make an object to represent the XML-RPC server.
$server_url = 'http://xmlrpc-c.sourceforge.net/api/sample.php';
$server = Frontier::Client->new(url => $server_url);

# Call the remote server and get our result.
$result = $server->call('sample.sumAndDifference', 5, 3);
$sum = $result->{'sum'};
$difference = $result->{'difference'};

print "Sum: $sum, Difference: $difference\n";</programlisting>

    </section>

    <section id="xmlrpc-howto-perl-server">
      <!--
      <title>A Stand-Alone Perl Server</title>
      -->
      <title>独立型 Perl サーバ</title>

      <!--
      <para>The following program shows how to write an XML-RPC server in
      Perl:</para>
      -->
      <para>次のプログラムは Perl での XML-RPC サーバの書き方を示します。
      </para>

      <programlisting>use Frontier::Daemon;

sub sumAndDifference {
    my ($x, $y) = @_;
    return {'sum' => $x + $y, 'difference' => $x - $y};
}

# Call me as http://localhost:8080/RPC2
$methods = {'sample.sumAndDifference' => \&amp;sumAndDifference};
Frontier::Daemon->new(LocalPort => 8080, methods => $methods)
    or die "Couldn't start HTTP server: $!";</programlisting>

    </section>

    <section id="xmlrpc-howto-perl-cgi">
      <!--
      <title>A CGI-Based Perl Server</title>
      -->
      <!--draft2-->
      <title>CGI ベースの Perl サーバ</title>

      <!--
      <para><literal>Frontier::RPC2</literal> doesn't provide built-in
      support for CGI-based servers. It <emphasis>does</emphasis>, however,
      provide most of the pieces you'll need.</para>
      -->
      <!--draft2-->
      <para><literal>Frontier::RPC2</literal> は CGI ベースサーバ用のサ
      ポートは本来備えられていません。しかし<emphasis>大丈夫</emphasis>、
      必要なほとんどの機能は用意されています。</para>

      <!--
      <para>Save the following code as
      <filename>sumAndDifference.cgi</filename> in your web server's
      <filename>cgi-bin</filename> directory. (On Unix systems, you'll need
      to make it executable by typing <literal>chmod +x
      sumAndDifference.cgi</literal>.)</para>
      -->
      <para>次のプログラムコードを
      <filename>sumAndDifference.cgi</filename> として、ウェブサーバの
      <filename>cgi-bin</filename> ディレクトリに保存してください (Unix
      システム上で、<literal>chmod +x sumAndDifference.cgi</literal> と
      入力し、実行属性を与える必要があるでしょう)。</para>

      <programlisting>#!/usr/bin/perl -w

use strict;
use Frontier::RPC2;

sub sumAndDifference {
    my ($x, $y) = @_;
    return {'sum' => $x + $y, 'difference' => $x - $y};
}

process_cgi_call({'sample.sumAndDifference' => \&amp;sumAndDifference});


#==========================================================================
#  CGI Support
#==========================================================================
#  Simple CGI support for Frontier::RPC2. You can copy this into your CGI
#  scripts verbatim, or you can package it into a library.
#  (Based on xmlrpc_cgi.c by Eric Kidd &lt;http://xmlrpc-c.sourceforge.net/>.)

# Process a CGI call.
sub process_cgi_call ($) {
    my ($methods) = @_;

    # Get our CGI request information.
    my $method = $ENV{'REQUEST_METHOD'};
    my $type = $ENV{'CONTENT_TYPE'};
    my $length = $ENV{'CONTENT_LENGTH'};

    # Perform some sanity checks.
    http_error(405, "Method Not Allowed") unless $method eq "POST";
    http_error(400, "Bad Request") unless $type eq "text/xml";
    http_error(411, "Length Required") unless $length > 0;

    # Fetch our body.
    my $body;
    my $count = read STDIN, $body, $length;
    http_error(400, "Bad Request") unless $count == $length; 

    # Serve our request.
    my $coder = Frontier::RPC2->new;
    send_xml($coder->serve($body, $methods));
}

# Send an HTTP error and exit.
sub http_error ($$) {
    my ($code, $message) = @_;
    print &lt;&lt;"EOD";
Status: $code $message
Content-type: text/html

&lt;title>$code $message&lt;/title>
&lt;h1>$code $message&lt;/h1>
&lt;p>Unexpected error processing XML-RPC request.&lt;/p>
EOD
    exit 0;
}

# Send an XML document (but don't exit).
sub send_xml ($) {
    my ($xml_string) = @_;
    my $length = length($xml_string);
    print &lt;&lt;"EOD";
Status: 200 OK
Content-type: text/xml

EOD
    # We want precise control over whitespace here.
    print $xml_string;
}</programlisting>

      <!--
      <para>You can copy the utility routines into your own CGI
      scripts.</para>
      -->
      <!--draft2-->
      <para>あなた自身の CGI スクリプトにユーティリティルーチンをコピー
      してもかまいません。</para>
    </section>

  </section>

  <section id="xmlrpc-howto-python">
    <!--
    <title>Using XML-RPC with Python</title>
    -->
    <title>Python での XML-RPC の使い方</title>

    <!--
    <para>Fredrik Lundh has provided an excellent <ulink
    url="http://www.pythonware.com/products/xmlrpc/">XML-RPC library for
    Python</ulink>.</para>
    -->
    <para>Fredrik Lundh は優れた<ulink url=
    "http://www.pythonware.com/products/xmlrpc/"
    >Python 用 XML-RPC ライブラリ</ulink>を提供しています。</para>

    <!--
    <para>To install, download the latest version. You can either stick the 
    <filename>*.py</filename> files in the same directory as your Python
    code, or you can install them in your system's Python directory.</para>
    -->
    <para>インストールするために、最新版をダウンロードしてください。
    <filename>*.py</filename> ファイルを個人の Python プログラムとして、
    個人のディレクトリに突っ込んでも、システムの Python ディレクトリにイ
    ンストールしてもかまいません。</para>

    <!--
    <para>RedHat 6.2 users can type the following:</para>
    -->
    <para>RedHat 6.2 のユーザは次のように入力します。</para>

    <programlisting>bash$ mkdir xmlrpclib-0.9.8
bash$ cd xmlrpclib-0.9.8
bash$ unzip ../xmlrpc-0.9.8-990621.zip
bash$ python
python> import xmlrpclib
python> import xmlrpcserver
python> <keycap>Control-D</keycap>
bash$ su -c 'cp *.py *.pyc /usr/lib/python1.5/'</programlisting>

    <!--
    <para>We <literal>import</literal> two of the <filename>*.py</filename>
    files to trick Python into compiling them. Users of other platforms
    should consult their Python documentation.</para>
    -->
    <para>上記では、Python に二つの <filename>*.py</filename> をコンパイ
    ルさせるために、それらを <literal>import</literal> しています。他の
    プラットフォームでは Python の文書を参考にしてください。</para>

    <!--
    <para>For more Python examples, see the article <ulink
    url="http://www.oreillynet.com/pub/a/python/2001/01/17/xmlrpcserver.html">XML-RPC:
    It Works Both Ways</ulink> on the O'Reilly Network.</para>
    -->
    <!--draft2-->
    <para>さら多くの Python での例に関しては、O'Reilly network の
    <ulink url=
    "http://www.oreillynet.com/pub/a/python/2001/01/17/xmlrpcserver.html"
    >XML-RPC: It Works Both Ways</ulink> の記事をみてください。</para>

    <section id="xmlrpc-howto-python-client">
      <!--
      <title>A Python Client</title>
      -->
      <title>Python クライアント</title>

      <!--
      <para>The following program shows how to call an XML-RPC server from
      Python:</para>
      -->
      <para>次のプログラムは Python から XML-RPC サーバのコールの方法を
      示します。</para>

      <programlisting>import xmlrpclib

# Create an object to represent our server.
server_url = 'http://xmlrpc-c.sourceforge.net/api/sample.php';
server = xmlrpclib.Server(server_url);

# Call the server and get our result.
result = server.sample.sumAndDifference(5, 3)
print "Sum:", result['sum']
print "Difference:", result['difference']</programlisting>

    </section>
  </section>

  <section id="xmlrpc-howto-c">
    <!--
    <title>Using XML-RPC with C and C++</title>
    -->
    <title>C および C++ での XML-RPC の使い方</title>

    <!--
    <para>To get a copy of XML-RPC for C/C++, see the <ulink
    url="http://xmlrpc-c.sourceforge.net">xmlrpc-c website</ulink>.</para>
    -->
    <para>C/C++ 用 XML-RPC のコピーを得るには、<ulink url=
    "http://xmlrpc-c.sourceforge.net">xmlrpc-c のウェブサイト</ulink>を
    見てください。</para>

    <!--
    <para>You can either download everything in RPM format, or you can
    build it from source.</para>
    -->
    <para>RPM 形式ですべてのものをダウンロードすることも、ソースから自分
    で環境を構築することもできます。</para>

    <section id="xmlrpc-howto-c-client">
      <!--
      <title>A C Client</title>
      -->
      <title>C クライアント</title>

      <!--
      <para>Save the following code in a file called
      <filename>getSumAndDifference.c</filename>:</para>
      -->
      <para>次のプログラムコードを
      <filename>getSumAndDifference.c</filename> としてファイルに保存し
      てください。</para>

      <programlisting>#include &lt;stdio.h>
#include &lt;xmlrpc.h>
#include &lt;xmlrpc_client.h>

#define NAME       "XML-RPC getSumAndDifference C Client"
#define VERSION    "0.1"
#define SERVER_URL "http://xmlrpc-c.sourceforge.net/api/sample.php"

void die_if_fault_occurred (xmlrpc_env *env)
{
    /* Check our error-handling environment for an XML-RPC fault. */
    if (env->fault_occurred) {
        fprintf(stderr, "XML-RPC Fault: %s (%d)\n",
                env->fault_string, env->fault_code);
        exit(1);
    }
}

int main (int argc, char** argv)
{
    xmlrpc_env env;
    xmlrpc_value *result;
    xmlrpc_int32 sum, difference;
    
    /* Start up our XML-RPC client library. */
    xmlrpc_client_init(XMLRPC_CLIENT_NO_FLAGS, NAME, VERSION);
    xmlrpc_env_init(&amp;env);

    /* Call our XML-RPC server. */
    result = xmlrpc_client_call(&amp;env, SERVER_URL,
                                "sample.sumAndDifference", "(ii)",
                                (xmlrpc_int32) 5,
                                (xmlrpc_int32) 3);
    die_if_fault_occurred(&amp;env);
    
    /* Parse our result value. */
    xmlrpc_parse_value(&amp;env, result, "{s:i,s:i,*}",
                       "sum", &amp;sum,
                       "difference", &amp;difference);
    die_if_fault_occurred(&amp;env);

    /* Print out our sum and difference. */
    printf("Sum: %d, Difference: %d\n", (int) sum, (int) difference);
    
    /* Dispose of our result value. */
    xmlrpc_DECREF(result);

    /* Shutdown our XML-RPC client library. */
    xmlrpc_env_clean(&amp;env);
    xmlrpc_client_cleanup();

    return 0;
}</programlisting>

      <!--
      <para>To compile it, you can type:</para>
      -->
      <para>コンパイルするための入力を示します -</para>

      <programlisting>bash$ CLIENT_CFLAGS=`xmlrpc-c-config libwww-client --cflags`
bash$ CLIENT_LIBS=`xmlrpc-c-config libwww-client --libs`
bash$ gcc $CLIENT_CFLAGS -o getSumAndDifference getSumAndDifference.c $CLIENT_LIBS</programlisting>

      <!--
      <para>You may need to replace <command>gcc</command> with the name of
      your system's C compiler.</para>
      -->
      <para>あなたのシステムの C コンパイラの名前が
      <command>gcc</command> ではないかもしれないので、実際の入力ではそ
      れを代える必要があるかもしれません。</para>

    </section>

    <section id="xmlrpc-howto-cc-client">
      <!--
      <title>A C++ Client</title>
      -->
      <title>C++ クライアント</title>

      <!--
      <para>Save the following code in a file called
      <filename>getSumAndDifference2.cc</filename>:</para>
      -->
      <para>次のプログラムコードを
      <filename>getSumAndDifference2.cc</filename> としてファイルに保存
      してください。</para>

      <programlisting>#include &lt;iostream.h>
#include &lt;XmlRpcCpp.h>

#define NAME       "XML-RPC getSumAndDifference C++ Client"
#define VERSION    "0.1"
#define SERVER_URL "http://xmlrpc-c.sourceforge.net/api/sample.php"

static void get_sum_and_difference () {

    // Build our parameter array.
    XmlRpcValue param_array = XmlRpcValue::makeArray();
    param_array.arrayAppendItem(XmlRpcValue::makeInt(5));
    param_array.arrayAppendItem(XmlRpcValue::makeInt(3));

    // Create an object to resprent the server, and make our call.
    XmlRpcClient server (SERVER_URL);
    XmlRpcValue result = server.call("sample.sumAndDifference", param_array);

    // Extract the sum and difference from our struct.
    XmlRpcValue::int32 sum = result.structGetValue("sum").getInt();
    XmlRpcValue::int32 diff = result.structGetValue("difference").getInt();
        
    cout &lt;&lt; "Sum: " &lt;&lt; sum &lt;&lt; ", Difference: " &lt;&lt; diff &lt;&lt; endl;
}

int main (int argc, char **argv) {

    // Start up our client library.
    XmlRpcClient::Initialize(NAME, VERSION);

    // Call our client routine, and watch out for faults.
    try {
        get_sum_and_difference();
    } catch (XmlRpcFault&amp; fault) {
        cerr &lt;&lt; argv[0] &lt;&lt; ": XML-RPC fault #" &lt;&lt; fault.getFaultCode()
             &lt;&lt; ": " &lt;&lt; fault.getFaultString() &lt;&lt; endl;
        XmlRpcClient::Terminate();
        exit(1);
    }

    // Shut down our client library.
    XmlRpcClient::Terminate();
    return 0;
}</programlisting>

      <!--
      <para>To compile it, you can type:</para>
      -->
      <para>コンパイルするための入力を示します -</para>

      <programlisting>bash$ CLIENT_CFLAGS=`xmlrpc-c-config c++ libwww-client --cflags`
bash$ CLIENT_LIBS=`xmlrpc-c-config c++ libwww-client --libs`
bash$ c++ $CLIENT_CFLAGS -o getSumAndDifference2 getSumAndDifference2.cc $CLIENT_LIBS</programlisting>

      <!--
      <para>You'll need a reasonably modern C++ compiler for this to
      work.</para>
      -->
      <para>この作業のために、かなり最近の C++ コンパイラが必要となりま
      す。</para>

    </section>

    <section id="xmlrpc-howto-cc-proxy">
      <!--
      <title>A C++ Client with Proxy Classes</title>
      -->
      <title>代替クラス (Proxy Class) での C++ クライアント</title>

      <!--
      <para>If your XML-RPC server supports the <link
      linkend="xmlrpc-howto-api-introspection">Introspection API</link>,
      you can automatically generate C++ proxy classes for it.  To generate
      a proxy class, type the following command and save the output to a
      file:</para>
      -->
      <para>XML-RPC サーバが<link linkend=
      "xmlrpc-howto-api-introspection"
      >イントロスペクション API</link> をサポートしているなら、自動的に
      そのサーバ用の C++ 代替クラスを生成できます。代替クラスを生成する
      ためには、次のコマンドを入力してその出力をファイルに保存してくださ
      い。</para>

      <programlisting>bash$ xml-rpc-api2cpp \
> http://xmlrpc-c.sourceforge.net/api/sample.php sample SampleProxy</programlisting>

      <!--
      <para>This will generate a proxy class named
      <literal>SampleProxy</literal> containing wrappers for all the
      methods beginning with <literal>sample</literal>. You can edit this
      class in any fashion you'd like.</para>
      -->
      <para>これは <literal>sample</literal> で始まるすべてのメソッド用
      のラッパーが含まれている <literal>SampleProxy</literal> と名づけら
      れた代替クラスを生成します。あなたが望む方法でこのクラスを修正して
      もかまいません。</para>
    </section>

    <section id="xmlrpc-howto-c-cgi">
      <!--
      <title>A CGI-Based C Server</title>
      -->
      <title>CGI ベースの C サーバ</title>

      <!--
      <para>Save the following code in a file called
      <filename>sumAndDifference.c</filename>:</para>
      -->
      <para>次のプログラムコードを
      <filename>sumAndDifference.c</filename> としてファイルに保存してく
      ださい。</para>

      <programlisting>#include &lt;xmlrpc.h>
#include &lt;xmlrpc_cgi.h>

xmlrpc_value *
sumAndDifference (xmlrpc_env *env, xmlrpc_value *param_array, void *user_data)
{
    xmlrpc_int32 x, y;

    /* Parse our argument array. */
    xmlrpc_parse_value(env, param_array, "(ii)", &amp;x, &amp;y);
    if (env->fault_occurred)
        return NULL;

    /* Return our result. */
    return xmlrpc_build_value(env, "{s:i,s:i}",
                              "sum", x + y,
                              "difference", x - y);
}

int main (int argc, char **argv)
{
    /* Set up our CGI library. */
    xmlrpc_cgi_init(XMLRPC_CGI_NO_FLAGS);

    /* Install our only method (with a method signature and a help string). */
    xmlrpc_cgi_add_method_w_doc("sample.sumAndDifference",
                                &amp;sumAndDifference, NULL,
                                "S:ii", "Add and subtract two integers.");

    /* Call the appropriate method. */
    xmlrpc_cgi_process_call();

    /* Clean up our CGI library. */
    xmlrpc_cgi_cleanup();
}</programlisting>

      <!--
      <para>To compile it, you can type:</para>
      -->
      <para>コンパイルするための入力を示します -</para>

      <programlisting>bash$ CGI_CFLAGS=`xmlrpc-c-config cgi-server --cflags`
bash$ CGI_LIBS=`xmlrpc-c-config cgi-server --libs`
bash$ gcc $CGI_CFLAGS -o sumAndDifference.cgi sumAndDifference.c $CGI_LIBS</programlisting>

      <!--
      <para>Once this is done, copy
      <filename>sumAndDifference.cgi</filename> into your webserver's
      <filename>cgi-bin</filename> directory.</para>
      -->
      <para>これが終了したら、<filename>sumAndDifference.cgi</filename>
      をウェブサーバの <filename>cgi-bin</filename> ディレクトリにコピー
      してください。</para>

    </section>
  </section>

  <section id="xmlrpc-howto-java">
    <!--
    <title>Using XML-RPC with Java</title>
    -->
    <title>Java での XML-RPC の使い方</title>

    <!--
    <para>Hannes Walln&ouml;fer has provided <ulink
    url="http://helma.at/hannes/xmlrpc/">an excellent
    implementation</ulink> of XML-RPC for Java.</para>
    -->
    <para>Hannes Walln&ouml;fer は Java 用 XML-RPC の<ulink url=
    "http://helma.at/hannes/xmlrpc/"
    >優れた実装</ulink>を提供しています。</para>

    <!--
    <para>To install it, download the distribution, unzip it, and add the
    <filename>*.jar</filename> files to your <envar>CLASSPATH</envar>. On a
    Unix system, you can do this by typing:</para>
    -->
    <para>インストールは、配布物をダウンロードして、unzip して、
    <envar>CLASSPATH</envar> に <filename>*.jar</filename> ファイルを追
    加します。Unix システム上で、次の入力によりこの作業が行えます。</para>

    <programlisting>bash$ unzip xmlrpc-java.zip
bash$ cd xmlrpc-java/lib
bash$ CLASSPATH=`pwd`/openxml-1.2.jar:`pwd`/xmlrpc.jar:$CLASSPATH</programlisting>

    <section id="xmlrpc-howto-java-client">
      <!--
      <title>A Java Client</title>
      -->
      <title>Java クライアント</title>

      <!--
      <para>Save the following program in a file named
      <filename>JavaClient.java</filename>.</para>
      -->
      <para>次のプログラムコードを
      <filename>JavaClient.java</filename> としてファイルに保存してくだ
      さい。</para>

      <programlisting>import java.util.Vector;
import java.util.Hashtable;
import helma.xmlrpc.*;

public class JavaClient {

    // The location of our server.
    private final static String server_url =
        "http://xmlrpc-c.sourceforge.net/api/sample.php";

    public static void main (String [] args) {
        try {

            // Create an object to represent our server.
            XmlRpcClient server = new XmlRpcClient(server_url);

            // Build our parameter list.
            Vector params = new Vector();
            params.addElement(new Integer(5));
            params.addElement(new Integer(3));

            // Call the server, and get our result.
            Hashtable result =
                (Hashtable) server.execute("sample.sumAndDifference", params);
            int sum = ((Integer) result.get("sum")).intValue();
            int difference = ((Integer) result.get("difference")).intValue();

            // Print out our result.
            System.out.println("Sum: " + Integer.toString(sum) +
                               ", Difference: " +
                               Integer.toString(difference));

        } catch (XmlRpcException exception) {
            System.err.println("JavaClient: XML-RPC Fault #" +
                               Integer.toString(exception.code) + ": " +
                               exception.toString());
        } catch (Exception exception) {
            System.err.println("JavaClient: " + exception.toString());
        }
    }
}</programlisting>

    </section>

    <section id="xmlrpc-howto-java-server">
      <!--
      <title>A Stand-Alone Java Server</title>
      -->
      <title>独立型 Java サーバ</title>

      <!--
      <para>Save the following program in a file named
      <filename>JavaServer.java</filename>.</para>
      -->
      <para>次のプログラムコードを
      <filename>JavaServer.java</filename> としてファイルに保存してくだ
      さい。</para>

      <programlisting>import java.util.Hashtable;
import helma.xmlrpc.*;

public class JavaServer {

    public JavaServer () {
        // Our handler is a regular Java object. It can have a
        // constructor and member variables in the ordinary fashion.
        // Public methods will be exposed to XML-RPC clients.
    }

    public Hashtable sumAndDifference (int x, int y) {
        Hashtable result = new Hashtable();
        result.put("sum", new Integer(x + y));
        result.put("difference", new Integer(x - y));
        return result;
    }

    public static void main (String [] args) {
        try {
            
            // Invoke me as &lt;http://localhost:8080/RPC2>.
            WebServer server = new WebServer(8080);
            server.addHandler("sample", new JavaServer());

        } catch (Exception exception) {
            System.err.println("JavaServer: " + exception.toString());
        }
    }
}</programlisting>

    </section>

  </section>

  <section id="xmlrpc-howto-php">
    <!--
    <title>Using XML-RPC with PHP</title>
    -->
    <title>PHP での XML-RPC の使い方</title>

    <!--
    <para>Edd Dumbill has implemented XML-RPC for PHP. You can download it
    from the <ulink url="http://xmlrpc.usefulinc.com/">UsefulInc XML-RPC
    website</ulink>.</para>
    -->
    <para>Edd Dumbill は PHP 用 XML-RPC を実装しています。<ulink url=
    "http://xmlrpc.usefulinc.com/"
    >UsefulInc XML-RPC ウェブサイト</ulink>からダウンロードできます。
    </para>

    <!--
    <para>To install the distribution, decompress it and copy
    <filename>xmlrpc.inc</filename> and <filename>xmlrpcs.inc</filename>
    into the same directory as your PHP scripts.</para>
    -->
    <para>配布物をインストールするには、それを解凍して、
    <filename>xmlrpc.inc</filename> と <filename>xmlrpcs.inc</filename>
    をあなたの PHP スクリプトが入っているのと同じディレクトリにコピーし
    ます。</para>

    <section id="xmlrpc-howto-php-client">
      <!--
      <title>A PHP Client</title>
      -->
      <title>PHP クライアント</title>

      <!--
      <para>The following script shows how to embed XML-RPC calls into a
      web page.</para>
      -->
      <para>次のスクリプトはウェブページの中に XML-RPC コールを組み込む
      方法を示します。</para>

      <programlisting>&lt;html>
&lt;head>
&lt;title>XML-RPC PHP Demo&lt;/title>
&lt;/head>
&lt;body>
&lt;h1>XML-RPC PHP Demo&lt;/h1>

&lt;?php
include 'xmlrpc.inc';

// Make an object to represent our server.
$server = new xmlrpc_client('/api/sample.php',
                            'xmlrpc-c.sourceforge.net', 80);

// Send a message to the server.
$message = new xmlrpcmsg('sample.sumAndDifference',
                         array(new xmlrpcval(5, 'int'),
                               new xmlrpcval(3, 'int')));
$result = $server->send($message);

// Process the response.
if (!$result) {
    print "&lt;p>Could not connect to HTTP server.&lt;/p>";
} elseif ($result->faultCode()) {
    print "&lt;p>XML-RPC Fault #" . $result->faultCode() . ": " .
        $result->faultString();
} else {
    $struct = $result->value();
    $sumval = $struct->structmem('sum');
    $sum = $sumval->scalarval();
    $differenceval = $struct->structmem('difference');
    $difference = $differenceval->scalarval();
    print "&lt;p>Sum: " . htmlentities($sum) .
        ", Difference: " . htmlentities($difference) . "&lt;/p>";
}
?>

&lt;/body>&lt;/html></programlisting>

      <!--
      <para>If your webserver doesn't run PHP scripts, see the <ulink
      url="http://www.php.net/">PHP website</ulink> for more
      information.</para>
      -->
      <para>あなたのウェブサーバが PHP スクリプトを実行しない場合、追加
      情報を得るために <ulink url="http://www.php.net/"
      >PHP のウェブサイト</ulink>を見てください。</para>

    </section>

    <section id="xmlrpc-howto-php-server">
      <!--
      <title>PHP Server</title>
      -->
      <title>PHP サーバ</title>

      <!--
      <para>The following script shows how to implement an XML-RPC server
      using PHP.</para>
      -->
      <para>次のスクリプトは PHP を利用した XML-RPC サーバの実装の方法を
      示します。</para>

      <programlisting>&lt;?php
include 'xmlrpc.inc';
include 'xmlrpcs.inc';

function sumAndDifference ($params) {

    // Parse our parameters.
    $xval = $params->getParam(0);
    $x = $xval->scalarval();
    $yval = $params->getParam(1);
    $y = $yval->scalarval();

    // Build our response.
    $struct = array('sum' => new xmlrpcval($x + $y, 'int'),
                    'difference' => new xmlrpcval($x - $y, 'int'));
    return new xmlrpcresp(new xmlrpcval($struct, 'struct'));
}

// Declare our signature and provide some documentation.
// (The PHP server supports remote introspection. Nifty!)
$sumAndDifference_sig = array(array('struct', 'int', 'int'));
$sumAndDifference_doc = 'Add and subtract two numbers';

new xmlrpc_server(array('sample.sumAndDifference' =>
                        array('function' => 'sumAndDifference',
                              'signature' => $sumAndDifference_sig,
                              'docstring' => $sumAndDifference_doc)));
?></programlisting>

      <!--
      <para>You would normally invoke this as something like
      <literal>http://localhost/path/sumAndDifference.php</literal>.</para>
      -->
      <para>あなたは通常、
      <literal>http://localhost/path/sumAndDifference.php</literal> のよ
      うなものを呼び出すでしょう。</para>

    </section>
  </section>

  <section id="xmlrpc-howto-dotnet">
    <!--
    <title>Using XML-RPC with Microsoft .NET</title>
    -->
    <title>Microsoft .NET での XML-RPC の使い方</title>

    <!--
    <para>Charles Cook is writing an excellent new chapter for this HOWTO.
    You can find <ulink
    url="http://www.cookcomputing.com/misc/howto.txt">a draft
    online</ulink>.  If that page disappears, look for a <ulink
    url="http://www.linuxdoc.org/HOWTO/XML-RPC-HOWTO/index.html">new
    version of the XML-RPC HOWTO</ulink> at the Linux Documentation
    Project.</para>
    -->
    <para>Charles Cook はこの HOWTO 用の優れた新しい章を執筆中です。草稿
    は<ulink url="http://www.cookcomputing.com/misc/howto.txt"
    >オンライン</ulink>で見られます。そのページが姿を消したら、Linux
    Documentation Project で <ulink url=
    "http://www.linuxdoc.org/HOWTO/XML-RPC-HOWTO/index.html"
    >XML-RPC HOWTO の新版</ulink> を探してください。</para>
  </section>

  <section id="xmlrpc-howto-ruby">
    <!--
    <title>Using XML-RPC with Ruby</title>
    -->
    <title>Ruby での XML-RPC の使い方</title>

    <!--
    <para><emphasis>(This section of the XML-RPC HOWTO was generously
    provided by Michael Neumann.)</emphasis></para>
    -->
    <para><emphasis>(XML-RPC HOWTO のこの章は Michael Neumann が気前よく
    提供してくれました。)</emphasis></para>

    <!--
    <para><ulink url="http://www.ruby-lang.org/">Ruby</ulink> is an
    object-oriented scripting language. It already has a major following in
    Japan, and it's becoming popular elsewhere.</para>
    -->
    <para><ulink url="http://www.ruby-lang.org/">Ruby</ulink> はオブジェ
    クト指向スクリプト言語です。既に日本では多くの愛好者がおり、他所でも
    人気が出つつあります。</para>

    <!--
    <para>To use XML-RPC with Ruby, you must first install Yoshida Masato's
    xmlparser module (a wrapper for James Clark's expat parser). This can
    be found at the <ulink url="http://www.ruby-lang.org/en/raa.html">Ruby
    Application Archive</ulink>.</para>
    -->
    <para>Ruby で XML-RPC を使うには、初めに吉田正人の xmlparser モジュー
    ル (James Clark の expat parser 用ラッパー) をインストールしなければ
    なりません。これは <ulink url=
    "http://www.ruby-lang.org/en/raa.html"
    >Ruby Application Archive</ulink> で見つけられます。</para>

    <!--
    <para>Then, you must install <ulink
    url="http://www.s-direktnet.de/homepages/neumann/xmlrpc4r/index.html">xmlrpc4r</ulink>
    using the following commands:</para>
    -->
    <para>そして次のコマンドを使って <ulink url=
    "http://www.s-direktnet.de/homepages/neumann/xmlrpc4r/index.html"
    >xmlrpc4r</ulink> をインストールしなければなりません。</para>

    <programlisting>bash$ tar -xvzf xmlrpc4r-1_2.tar.gz
bash$ cd xmlrpc4r-1_2
bash$ su root -c "ruby install.rb"</programlisting>

    <section id="xmlrpc-howto-ruby-client">
      <!--
      <title>A Ruby Client</title>
      -->
      <title>Ruby クライアント</title>

      <!--
      <para>Here's a simple Ruby client:</para>
      -->
      <para>単純な Ruby クライアントを示します -</para>

      <programlisting>require "xmlrpc/client"

# Make an object to represent the XML-RPC server.
server = XMLRPC::Client.new( "xmlrpc-c.sourceforge.net", "/api/sample.php")

# Call the remote server and get our result
result = server.call("sample.sumAndDifference", 5, 3)

sum = result["sum"]
difference = result["difference"]

puts "Sum: #{sum}, Difference: #{difference}"</programlisting>

    </section>

    <section id="xmlrpc-howto-ruby-server">
      <!--
      <title>A Ruby Server</title>
      -->
      <title>Ruby サーバ</title>

      <para>単純な Ruby サーバを示します -</para>

      <programlisting>require "xmlrpc/server"

s = XMLRPC::CGIServer.new

s.add_hanlder("sample.sumAndDifference") do |a,b|
  { "sum" => a + b, "difference" => a - b }
end

s.serve</programlisting>
      
      <!--
      <para>This could also have been written as follows:</para>
      -->
      <para>また、次のように書くこともできます。</para>

      <programlisting>require "xmlrpc/server"

s = XMLRPC::CGIServer.new

class MyHandler
  def sumAndDifference(a, b)
    { "sum" => a + b, "difference" => a - b }
  end
end

s.add_handler("sample", MyHandler.new)
s.serve</programlisting>

      <!--
      <para>To run either server in standalone mode, replace the second line
      of code with the following:</para>
      -->
      <para>どちらのサーバも独立型で実行するには、プログラムの二行目を
      </para>

      <programlisting>s = XMLRPC::Server.new(8080)</programlisting>

      <!--
      -->
      <para>に書きかえてください。</para>

    </section>
  </section>

  <section id="xmlrpc-howto-proprietary">
    <!--
    <title>Using XML-RPC with Proprietary Languages</title>
    -->
    <title>独自的な言語での XML-RPC の使い方</title>

    <!--
    <para>Implementations of XML-RPC are available for the following
    proprietary programming languages and environments.</para>
    -->
    <para>XML-RPC の実装は以下に示す独自的なプログラミング言語および環境
    で利用できます。</para>

    <section id="xmlrpc-howto-k">
      <!--
      <title>Using XML-RPC with K</title>
      -->
      <title>K での XML-RPC の使い方</title>
      
      <!--
      <para><emphasis>(This section of the XML-RPC HOWTO was generously
      provided by Christian Langreiter.)</emphasis></para>
      -->
      <para><emphasis>(XML-RPC HOWTO のこの章は Christian Langreiter が
      気前よく提供してくれました。)</emphasis></para>
      
      <!--
      <para><ulink url="http://www.kx.com/">K</ulink> is a language used in
      finance and database development. To install XML-RPC for K, download
      it from the <ulink url="http://www.langreiter.com/k/kxr">Kx
      website</ulink>. Uncompress and copy the files into the directory in
      which you keep your .k programs.</para>
      -->
      <para><ulink url="http://www.kx.com/">K</ulink> は会計処理およびデー
      タベース開発で使われる言語です。K 用 XML-RPC をインストールするに
      は <ulink url=
      "http://www.langreiter.com/k/kxr"
      >Kx のウェブサイト</ulink>からダウンロードします。解凍してあなたの
      .k プログラムを保持しているディレクトリにファイルをコピーします。
      </para>

      <!--
      <para>Here's a short client:</para>
      -->
      <para>短いクライアントを示します -</para>

      <programlisting>\l kxr
server:("localhost";"/cgi-bin/sumAndDifference.cgi");
.kxr.c[server;"sumAndDifference";2 3]</programlisting>

      <!--
      <para>And here's a server:</para>
      -->
      <para>そしてサーバを示します -</para>

      <programlisting>\l kxrsc
.kxr.sm: ,("sumAndDifference";{.((`sum;+/x);(`difference;-/x))})</programlisting>

      <!--
      <para>More examples are included in the distribution.</para>
      -->
      <para>さらに多くの例が配布物の中にあります。</para>
    </section>
  </section>


  <section id="xmlrpc-howto-applist">
    <!--
    <title>Applications with Built-in XML-RPC Support</title>
    -->
    <title>XML-RPC サポートが組み込まれたアプリケーション</title>

    <!--
    <para>Several popular Linux applications include support for
    XML-RPC. These have already been described elsewhere, so we mostly
    provide pointers to articles.</para>
    -->
    <para>いくつかの一般的な Linux アプリケーションは XML-RPC のサポート
    をしています。これらは既に他のところで説明がされているので、ここでは
    主にその記事へのポインタを示します。</para>

    <section id="xmlrpc-howto-zope">
      <title>Zope</title>

      <!--
      <para>Articles on using XML-RPC with Zope are available elsewhere on
      the web:</para>
      -->
      <para>Zope での XML-RPC の使用に関する記事は次に示すウェブから入
      手できます。</para>

      <itemizedlist>
	<listitem>
          <!--
	  <para><ulink
	  url="http://www.byte.com/column/BYT19991021S0014">XML-RPC
	  Programming with Zope</ulink> by Jon Udell</para>
          -->
	  <para>Jon Udell による <ulink url=
          "http://www.byte.com/column/BYT19991021S0014"
          >Zope での XML-RPC プログラミング</ulink></para>
	</listitem>
	<listitem>
          <!--
	  <para><ulink
	  url="http://linux.userland.com/stories/storyReader$18">Zope
	  XML-RPC</ulink> at UserLand.Com</para>
          -->
	  <para>UserLand.Com の <ulink url=
          "http://linux.userland.com/stories/storyReader$18"
          >Zope XML-RPC</ulink></para>
	</listitem>
      </itemizedlist>

    </section>

    <section id="xmlrpc-howto-kde">
      <title>KDE 2.0</title>

      <!--
      <para>KDE 2.0 includes Kurt Ganroth's <ulink
      url="http://kdecvs.stud.fh-heilbronn.de/cvsweb/kdebase/kxmlrpc/">kxmlrpc
      daemon</ulink>, which allows you to script KDE applications using
      XML-RPC.</para>
      -->
      <para>KDE 2.0 は Kurt Ganroth の <ulink url=
      "http://kdecvs.stud.fh-heilbronn.de/cvsweb/kdebase/kxmlrpc/"
      >kxmlrpc デーモン</ulink>を含み、デーモンは XML-RPC を使った KDE
      アプリケーションのためのお膳立てをします。</para>
      
      <!--
      <para>Here's a short <ulink
      url="http://kdecvs.stud.fh-heilbronn.de/cvsweb/kdebase/kxmlrpc/test/testxmlrpc.py?rev=1.6&amp;content-type=text/x-cvsweb-markup">sample
      application</ulink> in Python. It shows you how to connect to
      kxmlrpc, manipulate your KDE address book, and query the KDE
      trader.</para>
      -->
      <para>Python で書かれた短い<ulink url=
      "http://kdecvs.stud.fh-heilbronn.de/cvsweb/kdebase/kxmlrpc/test/testxmlrpc.py?rev=1.6&amp;content-type=text/x-cvsweb-markup"
      >アプリケーションの例</ulink>があります。それは kxmlrpc へ接続する、
      KDE の住所録を操作する、KDE トレーダを検索するといった方法を示しま
      す。</para>

      <!--
      <para>If you have any other articles or example code, please see
      <xref linkend="xmlrpc-howto-submitting"/>. We'd like to have more
      information on scripting KDE.</para>
      -->
      <!--draft2-->
      <para>あなたがその他に記事やプログラムの例を持っている場合、
      <xref linkend="xmlrpc-howto-submitting"/> を見てください。私達は
      KDE を記述する上でもっと多くの情報を持ちたいと思っています。
      </para>

    </section>

  </section>

  <section id="xmlrpc-howto-about">
    <!--
    <title>About This Document</title>
    -->
    <title>この文書について</title>

    <!--
    <para>This document is part of the <ulink
    url="http://www.linuxdoc.org/">Linux Documentation
    Project</ulink>. Thanks go to Dave Winer and maintainers of all the
    various XML-RPC libraries.</para>
    -->
    <para>この文書は <ulink url="http://www.linuxdoc.org/"
    >Linux Documentation Project</ulink> に所蔵されています。Dave Winer
    および様々な XML-RPC ライブラリのすべての管理者に感謝します。</para>

    <section id="xmlrpc-howto-versions">
      <!--
      <title>New Versions of This Document</title>
      -->
      <title>この文書の新版</title>

      <!--
      <para>New versions of this document are available at the <ulink
      url="http://www.linuxdoc.org/HOWTO/XML-RPC-HOWTO/index.html">Linux
      Documentation Project</ulink> website.</para>
      -->
      <para>この文書の新版は <ulink url=
      "http://www.linuxdoc.org/HOWTO/XML-RPC-HOWTO/index.html"
      >Linux Documentation Project</ulink> のウェブサイトで入手できます。
      </para>

      <!--
      <para>They also provide this manual in alternate formats, including
      <ulink
      url="http://www.ibiblio.org/pub/Linux/docs/HOWTO/other-formats/pdf/XML-RPC-HOWTO.pdf">PDF</ulink>,
      <ulink
      url="http://www.ibiblio.org/pub/Linux/docs/HOWTO/other-formats/html/XML-RPC-HOWTO-html.tar.gz">gzipped
      HTML</ulink> and <ulink
      url="http://www.ibiblio.org/pub/Linux/docs/HOWTO/XML-RPC-HOWTO">ASCII
      text</ulink>.</para>
      -->
      <para>また次のフォーマットでも提供されています。
      <ulink url=
      "http://www.ibiblio.org/pub/Linux/docs/HOWTO/other-formats/pdf/XML-RPC-HOWTO.pdf"
      >PDF</ulink>, <ulink url=
      "http://www.ibiblio.org/pub/Linux/docs/HOWTO/other-formats/html/XML-RPC-HOWTO-html.tar.gz"
      >gzipped HTML</ulink> および <ulink url=
      "http://www.ibiblio.org/pub/Linux/docs/HOWTO/XML-RPC-HOWTO"
      >ASCII text</ulink>。</para>

    </section>

    <section id="xmlrpc-howto-contributors">
      <!--
      <title>Contributors to the XML-RPC HOWTO</title>
      -->
      <title>XML-RPC HOWTO の寄稿者</title>

      <para>Ruby に関する章は Michael Neumann (neumann AT s-direktnet
      DOT de) により寄稿されました。K に関する章は Christian Langreiter
      (c DOT langreiter AT synerge DOT at) により寄稿されました。</para>

      <para>[訳注：上記の名前の後の () 内はメールアドレスを示しています。
      「AT」は「@」、「DOT」は「.」に置きかえて、空白を除去すればメール
      アドレスが得られます。]</para>

      <!--
      <para>These contributors are all credited at the beginning of their
      sections.</para>
      -->
      <para>寄稿者はその章の始めに記入されています。</para>

    </section>

    <section id="xmlrpc-howto-submitting">
      <!--
      <title>Submitting Other Snippets</title>
      -->
      <title>他の情報の提出</title>
      
      <para>別の言語や環境でのクライアントやサーバの例を持っている場合、
      この文書に追加したいととても思ってます。新しいエントリを追加するた
      めに、次に示す情報が必要です。</para>
      
      <itemizedlist>
	<listitem>
          <!--
	  <para>The URL of the XML-RPC implementation used.</para>
          -->
	  <para>XML-RPC を使用した実装の URL</para>
	</listitem>
	<listitem>
          <!--
	  <para>Installation instructions.</para>
          -->
	  <para>インストール手順</para>
	</listitem>
	<listitem>
          <!--
	  <para>A complete, runnable program.</para>
          -->
	  <para>完全な実行できるプログラム</para>
	</listitem>
	<listitem>
          <!--
	  <para>Compilation instructions, if applicable.</para>
          -->
	  <para>必要ならコンパイル手順</para>
	</listitem>
      </itemizedlist>

      <!--
      <para>E-mail your example to the <ulink
      url="http://xmlrpc-c.sourceforge.net/lists.php">xmlrpc-c-devel
      mailing list</ulink> or directly to <ulink
      url="mailto:eric.kidd@pobox.com">Eric Kidd</ulink>.</para>
      -->
      <para>文書に記載してもかまわない E-mail アドレス - 例えば <ulink
      url= "http://xmlrpc-c.sourceforge.net/lists.php"
      >xmlrpc-c-devel メーリングリスト</ulink> もしくは、直接の <ulink
      url="mailto:eric.kidd@pobox.com">Eric Kidd</ulink>。</para>

      <!--
      <para>Thank you for your help!</para>
      -->
      <para>情報をお待ちしています！</para>

    </section>
  </section>

  <section id="japanese">
    <title>日本語訳について</title>

    <indexterm>
      <primary>disk!japanese</primary>
    </indexterm>

    <para>
      日本語訳は Linux Japanese FAQ Project が行いました。
      翻訳に関するご意見は JF プロジェクト &lt;JF@linux.or.jp&gt; 宛に連絡
      してください。
    </para>

    <para>
    <variablelist><title>0.8.0j</title>
      <VarListentry><term>翻訳:</term>
      <listitem>
        <para>
           野本 浩一 <email>hng@ps.ksky.ne.jp</email>
        </para>
      </listitem>
      </varlistentry>
      <VarListentry><term>校正:</term>
      <listitem>
	<itemizedlist>
	  <listitem><para>
            千旦 裕司さん <email>ysenda@pop01.odn.ne.jp</email>
	  </para></listitem>
	  <listitem><para>
            山田 慎也さん <email>trueheart@anet.ne.jp</email>
	  </para></listitem>
	</itemizedlist>
      </listitem>
    </varlistentry>
    </variablelist>
    </para>
  </section>
</article>
