いちおう本家バグレポートに上げておきました。
本家 git 2018-09-17 にて文字化けの解消を確認しました。意外に対応が早かったですね。安心しました。
フミさん、みなさま、お疲れさまでした。
私も先ほど、opnesim-libs のリポジトリの「trunk/managed/XmlRpc」が更新され、utf8がデフォルトエンコーディングになっているのを確認しました。(ビルドはまだしてない、そのうちするw)。
commit 5ccd80a710f9ab00e8098e90af55a7f13dfb652d
Author: UbitUmarov <ajlduarte@sapo.pt>
Date: Mon Sep 17 15:59:28 2018 +0100
allow override of XmlRpcRequest HttpWebRequest ServerCertificateValidationCallback
commit af2e4cc36e9d13b2cd4ca8726d42fed09ec414ba
Author: UbitUmarov <ajlduarte@sapo.pt>
Date: Mon Sep 17 15:14:36 2018 +0100
mantis 8372: XMLRPC change default encode to utf8
opensimのリポジトリにある bin/XMLRPC.dll はこれが反映されたものなのでしょう。
あと、「if(..)」というようにifの後ろにスペースがつくようになったり、
「...(a,b,c)」が、「...(a, b, c)」というように引数区切りの後ろにスペースがついたりと、見やすく(私好み)になりましたwww。
フミ先生、シノさん、どうもお疲れさまでした。
opnesim-libs のリポジトリの「trunk/managed/XmlRpc」をビルドしてみて、OpenSimの bin/XMLRPC.dll と入れ替えてみました。すると、ログインできなくなりました。
OpenSim.logをログをみると
2018-09-21 10:57:52,380 ERROR [SCENEGRAPH]: Error in MyRegion: System.MissingMethodException: Nwc.XmlRpc.XmlRpcResponse Nwc.XmlRpc.XmlRpcRequest.Send(string,int)
at OpenSim.Services.Connectors.Hypergrid.UserAgentServiceConnector.LogoutAgent (OpenMetaverse.UUID userID, OpenMetaverse.UUID sessionID) [0x00059] in /opt/OpenSim/opensim/NXGrid/2018-01-18/opensim-0.9.0-17
...
のようなエラーがでてます。
これは、XmlRpcRequest.csのSendメンバー関数の引数の数が変わり仕様がかわっているからです。
diff -r XmlRpcRequest.cc.orig XmlRpcRequest.cs
...
104c105
< public XmlRpcResponse Send(String url,int timeout = 100000)
---
> public XmlRpcResponse Send(String url, int timeout = 100000, RemoteCertificateValidationCallback certCallBack = null)
...
Send()メンバ関数の引数が2つから3つに増えてますので、古いバイナリーが呼び出すSend()と型が異なります。ソースコード的には引数省略のパターンで問題ないのですが、バイナリー的には互換性がありません。
従来の「public XmlRpcResponse Send(String url,int timeout = 100000)」もオーバーロード関数として定義し内部から「Send(url, timeout, null)」と呼び出していれば、バイナリー互換性は保てたかもしれません。
OpenSimのソースから全部コンパイルし直せば問題なく動作しました。まあ、依存するライブラリが修正されたのですから、コンパイルし直した方がいいとは思います。このXMLRPC.dll と、コンパイルしなおしたOpenSimで、日本語IMは問題なく通りました。
以上、ハマりやすいポイントなので、ご注意ください。
P.S.
ちなみに、trunk/managed/XmlRpc のビルド方法は次のようにしました。
% cd opensim-libs/trunk/managed/XmlRpc
% xbuild
....
Build succeeded.
Warnings:
/opt/OpenSim/opensim/opensim-libs/trunk/managed/XmlRpc/xmlrpc.sln: warning : Don't know how to handle GlobalSection ExtensibilityGlobals, Ignoring.
1 Warning(s)
0 Error(s)
% ls bin/Debug
XMLRPC.dll XMLRPC.pdb
bin/Debug/XMLRPC.dll を、従来のXMLRPC.dll と入れ替えます。入れ替えるだけではダメで、OpenSimをソースコードからコンパイルしなくてはいけないのは、上に書いた通り。
お疲れさまです。
よく分からないのですが、XMLRPC.dll をソースからビルドする必要はあるでしょうか? ビルド済みのものがopensimのソースの binディレクトリ内に入っています。Linuxだろうが Windowsだろうがプラットフォームに依存しないから、ここに入れられているのではないでしょうか。
私がやったことは、opensim本家のソース git 2018-09-17 を落としてきて Ubuntu 18.04 + Mono 5.14.0 の環境でビルド、JOGの設定を入れてJOGに接続して確認したものです。このとき XMLRPC.dll は落としてきたソースの binディレクトリに最初から入っており、ビルドの対象ではありません。他の環境下でもそれは同じかと思います。
> よく分からないのですが、XMLRPC.dll をソースからビルドする必要はあるでしょうか?
ビルドする必要はないですw。シノさんがおっしゃるように gitから落として来たら、bin/XMLRPC.dll に入ってますから、2018-09-17 以後に更新したならば、通常はそのまま使ってビルドすれば問題ありません。
あえて言うなら、XMLRPC.dllが2018-09-17以前と以後では、いまのままではバイナリ互換性がないので、OpenSimのバイナリーは、ビルドした時期によって、どちらのXMLRPC.dllを使えばいいかが決まります。(新しいバイナリーパッケージがでたら、同梱されるから問題ないですけど)。
まあ、私がソースからビルドできた方が安心する質なんで、やってみた、やってみたかった、という以上の理由はないですw。またOpenSimのソースはOSGridで配布されているのをとってきてるのでgitで追っかけてないというのもあります。どうやって作られたからわからないバイナリーがあるってのは、なんかスッキリしないっていう気分の問題でしょうか..(Linuxの中にソースコードがない正体不明なバイナリがあったらいやじゃないですか?)。オープンソースなシステムならソースがないと、そこでメンテ不能になってしまいますからね(自分がメンテできるとはいってないww)。
で、ここまで書いて、試しに、従来のバイナリーでも、互換性に問題がでないであろうXMLRPC.dll を作ってみることにしました。以下のように、単に従来と互換があるようにSend()メンバー関数(メソッド)をオーバーロードさせました。
% diff -u XmlRpcRequest.cs.orig XmlRpcRequest.cs
--- XmlRpcRequest.cs.orig 2018-09-21 20:06:40.993545000 +0900
+++ XmlRpcRequest.cs 2018-09-21 20:20:16.593721000 +0900
@@ -102,6 +102,11 @@
/// <summary>Send the request to the server.</summary>
/// <param name="url"><c>String</c> The url of the XML-RPC server.</param>
/// <returns><c>XmlRpcResponse</c> The response generated.</returns>
+ public XmlRpcResponse Send(String url, int timeout = 100000)
+ {
+ return this.Send(url, timeout, null);
+ }
+
public XmlRpcResponse Send(String url, int timeout = 100000, RemoteCertificateValidationCallback certCallBack = null)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
これをビルドして、2018-09-17以前につくられたOpenSimバイナリーのbinにコピーしてみて動かしてみましたが、特に警告はでませんでした。従来のSend()に依存しているものが無いのであれば、このオーバーロードメンバ関数は必要ありませんが...。
このコンパイルした、XMLRPC.dll.20180921 を、もの好きな人の為に添付しておきます。
なにが起こるか、保証できないので、試すなら自己責任でバックアップとってからにしてくださいwww。
# 濃い話?ばかり続いてしまったので、テディさんからクレーム来そうだなぁ...ww。
> XMLRPC.dllが2018-09-17以前と以後では、いまのままではバイナリ互換性がないので、OpenSimのバイナリーは、ビルドした時期によって、どちらのXMLRPC.dllを使えばいいかが決まります。
いえ、それはないです。
2018-09-17以前の gitからビルドしたバイナリ(IMが文字化け)に 2018-09-17 の XMLRPC.dillを突っ込んだら、IM文字化けなしに正常に動きます。
このスレッドで 2018年 09月 13日(木曜日) 09:33 に報告しています。
>> XMLRPC.dllが2018-09-17以前と以後では、いまのままではバイナリ互換性がな
>> いので、OpenSimのバイナリーは、ビルドした時期によって、どちらのXMLRPC.dllを
>> 使えばいいかが決まります。
>
>いえ、それはないです。
理由が分かりました。
opensimリポジトリ と opensim-libリポジトリにある、XMLRPC.dll のバージョンが違います。
opensim-libにある、trunk/managed/XmlRpc の方がバージョンが進んでいます。
opensimの bin/XMLRPC.dll は、ひとつ前のバージョンのデフォルトエンコーディングをUTF-8に修正したもので、Send()メンバー関数の引数仕様はそのままでした。この為、互換性問題は生じなかったようです。
opensim リポジトリの bin/XMLRPC.dll のコミットログ
% git log bin/XMLRPC.dll
commit a5d6a394ef8838230aeeb4f1721bd40ee0b302a5 (HEAD -> master, origin/master, origin/HEAD)
Author: UbitUmarov <ajlduarte@sapo.pt>
Date: Mon Sep 17 15:12:02 2018 +0100
mantis 8372: replace XMLRPC.dll with utf8 fix
....
opensim-lib リポジトリの trunk/managed/XmlRpc のコミットログ
% git log trunk/managed/XmlRpc
commit 5ccd80a710f9ab00e8098e90af55a7f13dfb652d (HEAD -> master, origin/master, origin/HEAD)
Author: UbitUmarov <ajlduarte@sapo.pt>
Date: Mon Sep 17 15:59:28 2018 +0100
allow override of XmlRpcRequest HttpWebRequest ServerCertificateValidationCallback
commit af2e4cc36e9d13b2cd4ca8726d42fed09ec414ba
Author: UbitUmarov <ajlduarte@sapo.pt>
Date: Mon Sep 17 15:14:36 2018 +0100
mantis 8372: XMLRPC change default encode to utf8
...
opensim-lib の方が、コメントから推測するに、通信相手方を確認するコールバック関数を仕込める仕様を追加したものになっており、これがバイナリーレベルの互換性を壊すものになっています。ソースコード全部コンパイルするのなら、特に問題は発生しません。
ちなみに、「mantis 8372」というのは、シノさんが上げられたバグレポートの番号です。
"Notes about Me" もしくは「私にまつわるエトセトラ」のスレッドでも、言及しましたけど、OpenSimのいまのXmlRpcの使い方だと、セキュリティは無いに等しいですから、それを強化する方向に進もうとしているのだと思います。
あと、もう一つ蛇足。
monodisという、monoに付属の逆アセンブラを使うと、XMLRPC.dll がどの仕様のSend()を使っているか確認できます。
opensim リポジトリの bin/XMLRPC.dll
% monodis bin/XMLRPC.dll | grep 'Send('
IL_0007: call instance class Nwc.XmlRpc.XmlRpcResponse class Nwc.XmlRpc.XmlRpcRequest::Send(string, int32)
opensim-lib リポジトリの trunk/managed/XmlRpc
% cd trunk/managed/XmlRpc
% xbuild (ビルド)
...
% monodis bin/Debug/XMLRPC.dll | grep 'Send('
IL_0009: call instance class Nwc.XmlRpc.XmlRpcResponse class Nwc.XmlRpc.XmlRpcRequest::Send(string, int32, class [System]System.Net.Security.RemoteCertificateValidationCallback
もういっちょ、蛇足追加ww
私の調べた範囲ではXmlRpcの C#実装は、似たような亜流がいっぱいあって、OpenSimは、いったいどれをベースにしてるのか、ずっともやもやしてたのです。今回の件で、XmlRpcのソースが opensim-lib にあるのが分かり、UTF-8をデフォルトエンコーディングにしてくれたことで、私的にはかなりスッキリしました。
とりとめのない、殴り書きにお付き合いいただき、どうもありがとうございました。
濃ゆい話ついでに...(まだやるのか...私...ww)
opensim リポジトリの bin/XMLRPC.dll を過去のバージョンも含めてすべて取り出してみました。
% ls
XMLRPC.dll.2007-06-27_646bbbc84b8010e0dacbeed5342cdb045f46cc49
XMLRPC.dll.2007-07-05_8bdbdf48c7896a7cb47d49544ab528a508e557c9
XMLRPC.dll.2007-07-08_24ed79ba122d8f24d29ea1a32e0de63033abaf6e
XMLRPC.dll.2007-07-08_c578d0c37d620d0d1dafc5df8a6902a2be6edb8e
XMLRPC.dll.2007-07_08_c617cf7d84341f025c2b19560c7885102105a419
XMLRPC.dll.2011-04-27_5e3893ca5c8c985bf9b2a1e1dbc94d48a4eb3e96
XMLRPC.dll.2018-01-12_98f79cf7353dda79e235ed76058f8ea990c1f9e1
XMLRPC.dll.2018-09-17_a5d6a394ef8838230aeeb4f1721bd40ee0b302a5
これを 次のshスクリプトで monodisで逆アセンブルし、UTF8,ASCII どちらのエンコーディングを使っているのかしらべたところ次のような結果になりました(単純すぎるやりかたですけど、まあ推測はできる)。
% cat monodis.sh
for f in XMLRPC.dll.*
do
echo "--- $f ---"
monodis $f | grep -E '(UTF8|ASCII)'
done
% sh monodis.sh
--- XMLRPC.dll.2007-06-27_646bbbc84b8010e0dacbeed5342cdb045f46cc49 ---
IL_0001: newobj instance void class [mscorlib]System.Text.ASCIIEncoding::'.ctor'()
IL_0001: newobj instance void class [mscorlib]System.Text.ASCIIEncoding::'.ctor'()
--- XMLRPC.dll.2007-07-05_8bdbdf48c7896a7cb47d49544ab528a508e557c9 ---
class [mscorlib]System.Text.UTF8Encoding V_3,
IL_000e: call class [mscorlib]System.Text.Encoding class [mscorlib]System.Text.Encoding::get_UTF8()
IL_0040: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
IL_0008: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
IL_0008: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
IL_002b: call class [mscorlib]System.Text.Encoding class [mscorlib]System.Text.Encoding::get_UTF8()
IL_0041: call class [mscorlib]System.Text.Encoding class [mscorlib]System.Text.Encoding::get_UTF8()
--- XMLRPC.dll.2007-07-08_24ed79ba122d8f24d29ea1a32e0de63033abaf6e ---
class [mscorlib]System.Text.UTF8Encoding V_3,
IL_000c: call class [mscorlib]System.Text.Encoding class [mscorlib]System.Text.Encoding::get_UTF8()
IL_003a: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
IL_0001: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
IL_0001: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
IL_0014: call class [mscorlib]System.Text.Encoding class [mscorlib]System.Text.Encoding::get_UTF8()
IL_002a: call class [mscorlib]System.Text.Encoding class [mscorlib]System.Text.Encoding::get_UTF8()
--- XMLRPC.dll.2007-07-08_c578d0c37d620d0d1dafc5df8a6902a2be6edb8e ---
class [mscorlib]System.Text.UTF8Encoding V_3,
IL_003c: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
IL_0008: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
IL_0008: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
--- XMLRPC.dll.2007-07_08_c617cf7d84341f025c2b19560c7885102105a419 ---
class [mscorlib]System.Text.UTF8Encoding V_3,
IL_0040: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
IL_0008: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
IL_0008: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
--- XMLRPC.dll.2011-04-27_5e3893ca5c8c985bf9b2a1e1dbc94d48a4eb3e96 ---
class [mscorlib]System.Text.UTF8Encoding V_3,
IL_003c: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
IL_0008: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
IL_0008: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
--- XMLRPC.dll.2018-01-12_98f79cf7353dda79e235ed76058f8ea990c1f9e1 ---
IL_0001: newobj instance void class [mscorlib]System.Text.ASCIIEncoding::'.ctor'()
IL_0001: newobj instance void class [mscorlib]System.Text.ASCIIEncoding::'.ctor'()
--- XMLRPC.dll.2018-09-17_a5d6a394ef8838230aeeb4f1721bd40ee0b302a5 ---
IL_0001: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
IL_0001: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
IL_0001: newobj instance void class [mscorlib]System.Text.UTF8Encoding::'.ctor'()
これをみると、つぎのようにデフォルトエンコーディングが途中で変わっています。
2007-06-27 ASCIIEncoding
2007-07-05 ~ 2011-04-27 UTF8Encoding
2018-01-12 ASCIIEncoding
2018-09-17 UTF8Encoding
git log のコメントをみると、2018-01-12から 以前のソースコードとは違うものを使い始めていて、ASCIIEncodingに巻き戻ってしまっています。コミッターもUbitUmarov <ajlduarte@sapo.pt>さんに変わっています。
JOGridのIMの文字化けも、これに影響されてしまったんだと思います。
クレームどころか勉強になる濃ゆいお話をいつも傍観(頭に入ってこないだけw)しておりますw