• The added line is THIS COLOR.
  • The deleted line is THIS COLOR.
* XMLRPC issues [#nf48aad4]
* XMLRPC 使用上の注意点 [#r9edd8ff]

** 浮動少数型について [#s408c813]
** double [#l5f8e1e0]
XMLRPC の浮動少数型である double では、[[仕様:http://www.xmlrpc.com/spec]]をざっくり要約すると「無限大の表現はない。符号と数字とピリオドのみで空白は含まれない。値の範囲は実装依存。」ということになっている。

Python の xmlrpclib では、XMLRPC の浮動少数型である double を repr() で生成するので、精度は 17 になる([[浮動少数:http://docs.python.org/tutorial/floatingpoint.html]])。また repr() は 2.23e-05 といった XMLRPC 仕様に合致しない文字列表現を出力することがあるが、実用上は問題ない。余談になるけれども str() でも浮動少数を文字列に変換した場合の精度は 12 で、また[[%フォーマッタ:http://docs.python.org/library/stdtypes.html#string-formatting-operations]]を使うとそれ相応の精度に切り詰められる。[[decimal:http://docs.python.org/library/decimal.html]] を使うとさらに高精度が扱えるが、システム間結合を目的としている XMLRPC では通信先での受け入れができなければ意味がないので、これが登場することは稀だろう。
Python の [[xmlrpclib:http://docs.python.org/library/xmlrpclib.html]] では、XMLRPC の浮動少数型である double の出力は repr() で生成するので、精度は 17 になる([[浮動少数:http://docs.python.org/tutorial/floatingpoint.html]])。また repr() は 2.23e-05 といった XMLRPC 仕様に適合しない文字列表現を出力することがあるが、実用上は問題ない。余談になるけれども str() でも浮動少数を文字列に変換した場合の精度は 12 で、また[[%演算子を使ったフォーマット:http://docs.python.org/library/stdtypes.html#string-formatting-operations]]を使うとそれ相応の精度に切り詰められる。[[decimal:http://docs.python.org/library/decimal.html]] を使うと高精度が扱えるが、システム間結合を目的としている XMLRPC では通信先での受け入れができなければ意味がないので、これが登場することは稀だろう。

PHP の xmlrpc extension では XMLRPC の浮動少数は zval から取得(Z_DVAL_P を使用)し、それを ap_php_snprintf の %.*G でフォーマットするので php.ini の [[precision:http://www.php.net/manual/ini.core.php]] に依存する。つまりデフォルトでは精度は 14 になる。こちらも NAN, INF, -INF や 2.23E-5 といった文字列を出力することがあるが、実用上は問題ないだろう。
PHP の [[xmlrpc extension:http://www.php.net/xmlrpc]] では XMLRPC の浮動少数の出力は zval から取得(Z_DVAL_P を使用)し、それを ap_php_snprintf の %.*G でフォーマットするので php.ini の [[precision:http://www.php.net/manual/ini.core.php]] に依存する。つまりデフォルトでは精度は 14 になる。こちらも NAN, INF, -INF や 2.23E-5 といった文字列を出力することがあるが、実用上は問題ないだろう。面白いことに Python, PHP 間で指数表現形式は異なる。

Java での代表的な実装である [[Apache XML-RPC:http://ws.apache.org/xmlrpc/]] では double の出力には [[Double.toString():http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/Double.html#toString(double)]] を使っている。64bit の double なら Python と同様の精度 17 になる。面白いことに Python と Java では異なる表現を出力することがある。個人的には Python が一風変わっていると思う。

Python 2.6
 >>> repr(0.000000023)
 '2.3000000000000001e-08'

Java 1.6.0_10
 class hoge {
  public static void main(String[] argv){
   System.out.println(0.000000023);
  }
 }

 > java hoge
 2.3E-8

** system.multiCall [#j92820ce]
XML-RPC の拡張仕様のひとつに system.multiCall というものがある。仕様自体は本来は [[xmlrpc.com にあったはず:http://www.xmlrpc.com/discuss/msgReader$1208]]なのだが、長らく消失したままなので、WebArchive などのサービスで探すしか現在は手段がない。Python の [[xmlrpclib:http://docs.python.org/library/xmlrpclib.html]] では、なぜか system.multicall と小文字で実装されているため、相互運用上問題が発生する。また PHP xmlrpc extension の下位レイヤライブラリ [[xmlrpc-epi:http://xmlrpc-epi.sourceforge.net/]] においては system.multiCall と大文字で実装されているにもかかわらず、PHP extension 側が対応していないため、呼び出しを行うと [[PHP がクラッシュする:http://bugs.php.net/bug.php?id=27446]]。実に不憫だ。必要であれば[[対応するパッチは入手できる:http://mp.i-revo.jp/user.php/kcvcrlkq/entry/313.html]]。

追い討ちをかけるようだが system.multiCall でリクエストをシリアライズすると、シリアルにしか実行が行われないことが多いので、むしろパラレル化を行ったほうがシステム結合において全体のレスポンスタイムを短縮化できることが多い。


    Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes

© 2006-2008 Internet Revolution