2018年7月1日日曜日

4: LibreOfficeまたはOpenOfficeのオフィシャルドキュメントを解読する

<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>

それらは上手く書かれていない、と私たちは認めてよいし、認めるべきです。主犯の1人は、そこで使われているずぼらな用語体系であり、それをここで紐解きます。

話題


About: UNO (Universal Network Objects)
About: LibreOffice
About: Apache OpenOffice

この記事の目次


開始コンテキスト



ターゲットコンテキスト



  • 読者は、LibreOfficeまたはApache OpenOfficeのオフィシャル参考ドキュメントおよびUNOIDL APIドキュメントをどのように解読できるかを知る。
ト書き
Hypothesizer 7、Objector 1C(前記事から来た)、Objector 4A、Objector 4Bがコンピューターの前にいる。


オリエンテーション


Hypothesizer 7
この記事では、LibreOfficeまたはApache OpenOfficeのオフィシャル参考ドキュメントUNOIDL APIドキュメント(LibreOfficeのものはこちら、Apache OpenOfficeのものはこちら)をどのように解読できるかを学びます。UNOIDL APIドキュメントは、LibreOfficeまたはApache OpenOfficeに含まれるUNOデータタイプの仕様を説明するドキュメントです。

Objector 1C
UNOIDL APIドキュメントなどというものをなんで俺が読まないといけないのだ?

ト書き
Hypothesizer 7は肩を落とす。

Hypothesizer 7
...ようこそいらっしゃいました。LibreOfficeやApache OpenOfficeのプロセスを広範に操作しようとすると、どのUNOインターフェースがどんなメソッドを持っているかを見つけなければならなくなりますが、それが、UNOIDLドキュメントに記述されているのです。

Objector 1C
そんなドキュメントを読まなくてもよいように、コピーできるサンプルプログラムをお前が示せばよいだけだ!

Hypothesizer 7
...人はそれぞれ独自のニーズを持っていますので、限られた数のサンプルプログラムであらゆるニーズをカバーすることはできません。自分のニーズに合うサンプルプログラムが誰かから与えれるのを待っているのではない独立心に満ちた人々を私は念頭においておりますので. . .

Objector 1C
なんだと!俺には独立心がないと言っているのか?

Hypothesizer 7
...あなたや他の特定の人について話したのではなく、独立心に満ちた人々について話しただけなのですが。

Objector 1C
俺が奴隷根性だとお前は言っているんだ!

Hypothesizer 7
そのような言葉を使用した覚えは御座いませんが...

Objector 1C
お前はそう言った!そう言った!そう言った!

ト書き
Objector 1Cは足を踏み鳴らして去っていき、Hypothesizer 7は目を丸くして見送る。

Objector 4A
えへん...

Hypothesizer 7
はい、何で御座いましょう?

Objector 4A
オフィシャルドキュメントの中のいくつかの用語、特に「サービス」が私にはよく理解できないのだが。

Hypothesizer 7
それでは、お仲間ですね。私もそうでした。この記事がお役にたつかもしれません。

Objector 4A
しかし、この記事を理解するのに、君の前記事を読まないといかんのかね?

Hypothesizer 7
まあ、...おそらく。

Objector 4A
なぜだね?

Hypothesizer 7
記述は、いかなるものでも、ある用語体系に基づいて行なわれ、適切な記述は、いかなるものでも、ある適切な用語体系に基づいて行なわれます。UNOの適切な用語体系は存在しなかったため、私が(やむを得ず)自分で1つ前記事で作り上げざるを得ませんでした。そして、この記事では、前記事で導入された用語体系に基づいて記述が行なわれます。...それが理由ということになります。

Objector 4A
それでは、オフィシャル参考ドキュメントで用いられている用語体系は不適切だと言うんだね...

Hypothesizer 7
少なくとも私にとってはそうで、おそらくあなたにとってもそうでしょう。だって、そうでなければ、私もあなたも、オフィシャル参考ドキュメントの理解に支障をきたさなかったでしょうから。

Objector 4A
とにかく、この記事が新たな支障でなければよいが...


本体


1: オフィシャルドキュメントにおける「サービス」とは何か?


Hypothesizer 7
LibreOfficeまたはApache OpenOfficeのオフィシャル参考ドキュメントおよびUNOIDL APIドキュメント(LibreOfficeのものはこちら、Apache OpenOfficeのものはこちら)で使われている問題のある用語の1つは、「サービス」です。それが問題であるのは、複数の、本質的に相異なるコンセプトを代表するように使われているからです。

第1に、「サービス」は、UNOサービスを表わすように使われています。

第2に、「サービス」は、'UNOインターフェース集合兼UNOオブジェクトプロパティの定義集合'を表わすように使われています。

Objector 4B
...その長ったらしい名前のものは何なの?

Hypothesizer 7
マダム、それが実際に何であるかを示すために私が考えついた最も簡潔な表現がそれなのです。

Objector 4B
とにかく、何なの、それ?

Hypothesizer 7
昔、UNOの世界では、UNOインターフェースは、複数のUNOインターフェースを継承できませんでした...

Objector 4B
昔話を始めちゃたわけ?

Hypothesizer 7
第2の意味の「サービス」が存在する理由を理解するためには、この昔話を知る必要があります。

Objector 4A
しかし、インターフェースが複数インターフェースを継承できないというのは妙だ。どのプログラミング言語がそれを禁止しているというのか?

Hypothesizer 7
理由を私は知らないのですが、それを歴史的事実として受け入れるしかありません。

とにかく、そのため、いくつかのUNOインターフェースのコレクションである'UNOインターフェース集合'が考え出されました。'UNOインターフェース集合'は、別のいくつかの'UNOインターフェース集合'をコレクトすることによってもUNOインターフェースをコレクトできることにご注意ください。

Objector 4A
それで、'UNOサービス'では全然ない'UNOインターフェース集合'がなぜ「サービス」なのか?

Hypothesizer 7
えーと、ある'UNOインターフェース集合'が、あるUNOコンポーネントによって実装され、そのUNOコンポーネントが、あるUNOサービスとして登録されました。

Objector 4A
だから何だ?

Hypothesizer 7
その'UNOインターフェース集合'がそのUNOサービスと混同された、ということだと私は推測します。

Objector 4A
その'UNOインターフェース集合'は全然UNOサービスじゃない!それは、そのUNOコンポーネントによって実装されたUNOインターフェース集合であって、そのUNOコンポーネントがたまたまUNOサービスとして登録されただけだ!そういうずぼらな用語の使い方は読者を混乱させる!

Hypothesizer 7
大変申し訳ございません。

Objector 4B
...あなた、自分が書いたわけでもないもののために、なんで謝ってるわけ?

Hypothesizer 7
私がお叱りを受けておりましたので...

Objector 4B
...それで、「UNOオブジェクトプロパティの定義集合」という部分はどうなの?

Hypothesizer 7
第2の意味における「サービス」は、いくつかのUNOオブジェクトプロパティの定義も含むことができます。

Objector 4B
すると、その第2の意味での「サービス」を実装するUNOコンポーネントは、どれも、それらのプロパティを持たなければならないと?

Hypothesizer 7
はい。

第3に、「サービス」は、1UNOサービス限定のUNOサービスインスタンスファクトリーを指して使われます。

Objector 4A
あのねえ、それは、サービスでは全然なくて、サービスインスタンスファクトリーなんだよ!

Hypothesizer 7
大変申し訳ございません。

Objector 4B
...第3の意味での「サービス」は、オフィシャル参考ドキュメントで「コンストラクター」と呼ばれてない?

Hypothesizer 7
私が理解する限りでは、「コンストラクター」は、1UNOサービス限定のUNOサービスインスタンスファクトリーに含まれるメソッドであって、1UNOサービス限定のUNOサービスインスタンスファクトリー自体ではありません。もしも、オフィシャル参考ドキュメント1UNOサービス限定のUNOサービスインスタンスファクトリーをも「コンストラクター」と呼んでいるのであれば、それは、問題のある用語使用のまた別の例ということになるでしょう。

Objector 4B
うーん...


2: オフィシャルドキュメントにおける「旧スタイルサービス」および「新スタイルサービス」とは何か?


Objector 4A
「旧スタイルサービス」が厳密に何を意味しているか理解できないのだが。第2の意味での「サービス」と同じものなのか?

Hypothesizer 7
そうではなさそうです、オフィシャル参考ドキュメントでのその用語の使われ方を見る限り。その用語も複数の意味で使われています。

第1に、「旧スタイルサービス」は、複数のUNOコンポーネント特有UNOインターフェースを実装したUNOコンポーネントからなるUNOサービスを意味して使われます。

Objector 4A
「UNOコンポーネント特有UNOインターフェース」とは何だ?

Hypothesizer 7
'UNOコンポーネント特有UNOインターフェース'とは、そのUNOコンポーネントに特有の機能を代表するUNOインターフェースのことです。UNOコンポーネントは、通常、'com.sun.star.lang.XTypeProvider'、'com.sun.star.uno.XWeak'、'com.sun.star.lang.XServiceInfo'、'com.sun.star.lang.XInitialization'といった他の汎用的に使われるUNOインターフェースもいくつか実装します。

Objector 4A
それでは、「旧スタイルサービス」は、'複数のUNOインターフェースを実装するUNOサービス'ではないわけだ、「新スタイルサービス」も、通常、複数のUNOインターフェースを実装しているわけだから...

Hypothesizer 7
ええ、そうではありません。

Objector 4A
技術的に言うと、「旧スタイルサービス」と「新スタイルサービス」の区別は意味があるように思えないな。あるUNOインターフェースが「UNOコンポーネント特有」であるかどうかは、ものの見方の問題にすぎないだろう...

Hypothesizer 7
実のところ賛成です。その区別についての私の結論は、それは重要でないということです。

Objector 4A
しかし、「新スタイルサービス」だけが「コンストラクター」を持てるんだろう?

Hypothesizer 7
実のところ、その主張は正しくありません。「旧スタイルサービス」も「コンストラクター」を持てます。

Objector 4A
はあ?でも、オフィシャル参考ドキュメントは、持てないと主張しているじゃないか...

Hypothesizer 7
そう主張しているようなのですが、その主張は正しくありません。真実は、どの「旧スタイルサービス」も「コンストラクター」を持つことができ、だがしかし、その全ての「コンストラクター」の戻りタイプとして単一のUNOインターフェースを指定することになるということです。

Objector 4A
では、コンストラクター毎に戻りタイプを指定できないだけのことなのか?

Hypothesizer 7
はい、そうです。

Objector 4A
...

Hypothesizer 7
第2に、「旧スタイルサービス」は、あなたがおっしゃったとおり、第2の意味における「サービス」を意味して使われます。

Objector 4A
それでは、「旧スタイルサービス」は、'UNOインターフェース集合兼UNOオブジェクトプロパティの定義集合'なのか?

Hypothesizer 7
はい、そうです。

Objector 4A
...あの、オフィシャル参考ドキュメントは、「旧スタイルサービス」はJavaにマッピングされていないと、それ以上の説明なく平然と述べているのだが...。それで?それで私はどうするように期待されているのかね?Javaからは「旧スタイルサービス」は全然使えないのかね?

Hypothesizer 7
ああ、その平然とした宣言は、第2の意味における「旧スタイルサービス」についてだけです。第1の意味における「旧スタイルサービス」は問題なく使用できます。

Objector 4A
一体それを私がどうやって知ると思われているのかね?

Hypothesizer 7
私は存じません...

Objector 4A
とにかく、第2の意味での「旧スタイルサービス」はJavaにマッピングされない。それでよいのか?

Hypothesizer 7
実はそれでよいのです。

Objector 4A
はあ?説明してくれないと分からないな。

Hypothesizer 7
Javaの世界では、UNOコンポーネントはいくつかのUNOインターフェースを実装しており(第2の意味における「旧スタイルサービス」のなんらの関与なしに)、私たちは、どのUNOインターフェースをそのUNOコンポーネントが実装しているかをが知ればよいのです。それを知れば、そのUNOコンポーネントのインスタンスを問題なく操作することができます。

Objector 4A
それでは、第2の意味での「旧スタイルサービス」は、Javaの世界では蜃気楼だと?

Hypothesizer 7
私であれば、Javaの世界にはその痕跡さえも全く存在しないと言うでしょう。

Objector 4A
それでは、Javaプログラマーである私は、第2の意味での「旧スタイルサービス」を完全に無視してよいのか?

Hypothesizer 7
まあ、Javaプログラマーにとっては、第2の意味における「旧スタイルサービス」は、ドキュメント上の価値だけがあるということになります。あるドキュメントが、あるUNOコンポーネントが第2の意味における「旧スタイルサービス」を実装していると述べていれば、その情報を使って、どのUNOインターフェースがそのUNOコンポーネントに実装されているか、どんなUNOオブジェクトプロパティがそのUNOコンポーネントのインスタンスでサポートされているかを知ることができます。実際、UNOIDL APIドキュメント(LibreOfficeのものはこちら、Apache OpenOfficeのものはこちら)における「サービス」は、基本的に、第2の意味における「旧スタイルサービス」です。

Objector 4A
「基本的に」?

Hypothesizer 7
えーと、UNOIDL APIドキュメント(LibreOfficeのものはこちら、Apache OpenOfficeのものはこちら)におけるある「サービス」の名称は、第1の意味における「サービス」(つまり、UNOサービス)の名称でもあるかも、ないかもしれません。

Objector 4A
それで、どちらであるかをUNOIDL APIドキュメントから知ることはできないと?

Hypothesizer 7
運の悪いことに、できません。

Objector 4A
...


3: それらは本当にデータタイプなのか?


Objector 4A
UNOデータタイプの表だと称する表があるのだが、この表は私には妙に思える。'void'というのはデータタイプなのか?

Hypothesizer 7
私の意見では、それはデータタイプではなく、'any'もまたそうです。

Objector 4B
なんで?

Hypothesizer 7
'void'は、データタイプではなく、メソッドがどんなデータも戻さないことを示す印、または、'any'タイプの変数がどんなデータも格納も参照もしていないという状態です。'any'は、データタイプではなく、変数タイプです。

Objector 4B
はあ?あなた寝言を言ってるの?

Hypothesizer 7
データタイプというのは、どんなものでも、あるデータのタイプ(名前が示すとおり)であって、データがないところにデータタイプは存在し得ません。実際、'void'タイプのデータなどというものは存在しません。

Objector 4B
'データタイプ'と'変数タイプ'の違いはなんなの?

Hypothesizer 7
勿論、'データ'と'変数'の違いはご存知でしょう?

Objector 4B
もちろん、知ってるわよ...

Hypothesizer 7
変数は、データのコンテナまたはデータへのポインターであって、変数タイプは、その変数がどんなデータを格納または参照できるかを示します。

Objector 4B
もちろん...

Hypothesizer 7
'any'変数タイプは、その変数がどんなデータ(例えば、'long'タイプデータ、'string'タイプデータ、UNOオブジェクト)も格納または参照できることを意味します。

Objector 4B
つまり、'any'変数タイプは、その変数が'any'タイプのデータを格納または参照できるという意味ではないと。

Hypothesizer 7
'any'タイプのデータなどというものはありません。


4: オフィシャル参考ドキュメントには不条理または不整合な記述があることに気をつけよう


Objector 4A
オフィシャル参考ドキュメントの、UNOオブジェクトをそのUNOオブジェクトのUNOコンポーネントによって実装されているUNOインターフェースにキャストできないのは、そのUNOコンポーネントがそのUNOインターフェースを実装していることをコンパイラが知らないからだという主張に私はとても困惑させられたのだが...

Hypothesizer 7
ああ、その主張は不条理に聞こえます。Javaでは、あるオブジェクトをあるインターフェースにキャストするのは、そのオブジェクトがそのインターフェースを実装していることをコンパイラが知らないからです(コンパイラがその事実を知らないから、プログラマーがコンパイラにその事実を請け合ってあげないといけない)。...読者を詳細な事で煩わせることなく納得させようという目的の善意で著者はそのような直感的な主張をしたのだろうと私が想像しますが、そのようななおざりな主張は真面目な読者を混乱させます。

Objector 4B
BasicでUNOオブジェクトを格納するのには'Object'変数ではなく'Variant'変数を使うようにオフィシャル参考ドキュメントが忠告しているのを見つけたんだけど、サンプルコードでは'Object'変数がたいてい使われているのよ...。どういうこと?

Hypothesizer 7
いわゆる「私を見習うな。私が指示するとおりにやれ」というやつでしょう。

Objector 4B
...

Objector 4A
同様な例として、「コンポーネントコンテキスト」の概念がある時新たに組み込まれて新たな一群のUNOインターフェースが使用推奨されているのに、オフィシャル参考ドキュメントのほとんどのサンプルコードが、自ら推奨しているUNOインターフェース群を使用していないということがある...

Hypothesizer 7
まあ、私には、そういうケースが一部にあると警告することしかできません。


5: オフィシャル参考ドキュメントの一部の記述は古くて無効であることに気をつけよう


Hypothesizer 7
実のところ、オフィシャル参考ドキュメントは、既に開発停止されたOpenOffice.orgの改訂されていない古いドキュメントです。最も目に付くところでは、そこで紹介されている一部のツール(例えば、'idlcpp'、'xml2cmp'、'regcmp'、'autodoc'、'rdbmaker')やファイル(例えば、'Setup.xcu')は、もう存在すらしません。

Objector 4A
それらのツールやファイルなしに私はどうすればよいのかね?

Hypothesizer 7
私はそれらのツールは使わない、というだけです(それらのツールは別に不可欠というわけではありません)。'Setup.xcu'については、代わりに'base.xcd'を使います。

Objector 4A
よかろう。

Hypothesizer 7
32-bit版のJDKを使わなければならないとオフィシャル参考ドキュメントは主張していますが、この要件は古くて無効です。

Objector 4A
分かった。


6: それで、UNOIDL APIドキュメントはどう使えばよい?


Hypothesizer 7
私たちは、操作しようとするUNOオブジェクトUNOコンポーネントがどのUNOインターフェースを実装しているかを知る必要があります。それを知れば、それらのUNOインターフェースUNOIDL APIドキュメント(LibreOfficeのものはこちら、Apache OpenOfficeのものはこちら)で調べて、それらのUNOインターフェースのそれぞれがどんなメソッドを持っているかを知ることができます。

Objector 4A
それでは、どうすればそれを知ることができるかを言ってくれ。

Objector 4B
そうよ!例えば、あるUNOオブジェクトへのあるUNOプロキシを、あるメソッドのUNOインターフェース型の戻り値として得た場合、確かに、そのUNOオブジェクトのUNOコンポーネントがそのUNOインターフェースを実装していることは分かるけど、他のどのUNOインターフェースをそのUNOコンポーネントが実装しているか(それが私が知らなければならないこと)を、UNOIDL APIドキュメントからどうやって知ることができるの?

Hypothesizer 7
実のところ、一般的には、そうすることはできません。

Objector 4AとObjector 4B
はあ?

Hypothesizer 7
実は、それは自然なことです。なぜなら、UNOIDL APIドキュメントは、UNOの世界を対象とするものですが、UNOの世界にはUNOコンポーネントは全然含まれておりません。したがって、そこには、UNOコンポーネントについての情報は全然含まれておりません。

Objector 4A
...自然だ、確かに、しかし、それが自然だということは私の助けには全くならん。

Hypothesizer 7
まあ、そのUNOコンポーネントに実装されているUNOインターフェースを、確実に知ることはできなくても、推測できる一部のケースはあります。

Objector 4A
「推測」に「一部のケース」か...

Hypothesizer 7
先程マダムがお挙げになったケースでは、...

Objector 4B
フローリーと呼んで。

Hypothesizer 7
先程...フローリーがお挙げになったケースでは、そのUNOインターフェースを格納する「サービス」を、UNOIDL APIドキュメントの中で全て見つければ、その中の1つがそのUNOコンポーネントに実装されているかもしれません。

Objector 4A
「全て見つけ」に「その中の1つ」に「かもしれません」か...

Hypothesizer 7
UNOIDL APIドキュメントにおける「サービス」は第2における「サービス」ですが、「サービス」の名称がUNOサービスの名称と一致している場合もあります。

Objector 4A
「場合もあります」か...

Hypothesizer 7
そこで、あるUNOサービスマネージャーからこのUNOサービス名UNOオブジェクトへのUNOプロキシを取得したとき、おそらくは、そのUNOオブジェクトUNOコンポーネントは、その「サービス」にリストされているUNOインターフェースを実装しています。

Objector 4A
「おそらくは」か...

Hypothesizer 7
...それらが、UNOIDL APドキュメントからあなたが推測できることです。

Objector 4A
あまり励みとなるような見通しではないな...


7: UNOオブジェクトのUNOコンポーネントがどのUNOインターフェースを実装しているかをプログラムによって知ることができる(UNOコンポーネントが許せば)


Hypothesizer 7
しかしながら、UNOオブジェクトUNOコンポーネントがどのUNOインターフェースを実装しているかをプログラムによって知ることができます、UNOコンポーネントが許せばですが。

Objector 4B
なんでそれを早くいわなかったの?

Hypothesizer 7
えーと、私は物事を段階を踏んで説明しております、マダム。

ト書き
Objector 4BはHypothesizer 7の目をのぞき込む。

Hypothesizer 7
...フローリー。

Objector 4A
「UNOコンポーネントが許せば」とはどういう意味だ?

Hypothesizer 7
そのUNOコンポーネントはあるUNOインターフェース、'com.sun.star.lang.XTypeProvider'を実装していなければなりません。

Objector 4A
それで、LibreOfficeの全UNOコンポーネントの内、そのUNOインターフェースを実装しているUNOコンポーネントの割合はどれくらいなのかね?

Hypothesizer 7
厳密には知りませんが、LibreOfficeの全UNOコンポーネントの内のほとんどがそのUNOインターフェースを実装しているものと推測しています。

Objector 4A
それはいい。それで、UNOオブジェクトのUNOコンポーネントがどのUNOインターフェースを実装しているかを、プログラムによってどうやって知ることができるのかね?

Hypothesizer 7
えーと、それは、将来の記事で学びましょう。だって、まだ私たちは、実際のプログラミングには全然触れていませんし、開発環境すら構築していないのですから。


8: オフィシャルドキュメント群における「コンポーネント」とは何か?


Objector 4A
それで、オフィシャルドキュメント群にでてくる「コンポーネント」とは何かね?

Hypothesizer 7
うーん、「コンポーネント」という用語はあまりにも濫用されすぎていて、その用語が代表しているかもしれない意味の一覧を挙げることは私にはできません。...確かに、その用語のそうした使用は間違ってはいないのかもしれません(その用語の広い意味においては、ほとんど何でも「コンポーネント」と呼ぶことができます)が、その用語が現れる度に、その出現によって何が表わされているかを読者がリーズナブルに推察できなければ、そのような使用は、出現の目的を達したと言うことができません...

Objector 4A
それで、それについて私はどうできるのかね?

Hypothesizer 7
...もし、文書の内容を十分に理解した後でその文書を読めば、その用語の各出現が何を意味しているかを推察できるかもしれません。

Objector 4A
内容を十分に理解していないから私は文書を読んでいるのだ!

Hypothesizer 7
申し訳ございません...


9: 結びとその先


Hypothesizer 7
LibreOfficeまたはApache OpenOfficeのオフィシャル参考ドキュメントおよびUNOIDL APドキュメント(LibreOfficeのものはこちら、Apache OpenOfficeのものはこちら)をどのように解読できるかを私たちは学びました。そこで使用されている用語の一部は、複数の意味で濫用されているので、各出現が何を意味するかを私たちは推測しなければなりません。また、リーズナブルでなかったり、古くて無効だったりする叙述に遭遇することを辛抱しなければなりません。いずれにせよ、UNOIDL APIドキュメントは、LibreOfficeまたはApache OpenOfficeのプロセスを広範に操作しようとする際に参照しなければならないものです。

しかし、UNOIDL APIドキュメントは、私たちが知らなければならない、どのUNOコンポーネントが存在するかも、各UNOコンポーネントがどのUNOインターフェースを実装しているかも教えてくれません。UNOオブジェクトUNOコンポーネントがどのUNOインターフェースを実装しているかをプログラムによってどのように知ることができるかを、私たちは将来の記事で学びます。


参考資料


  • Apache OpenOffice Wiki. (2014/01/02). Apache OpenOffice Developer's Guide. Retrieved from https://wiki.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide
  • N/A. (N/A). LibreOffice: Main Page. Retrieved from https://api.libreoffice.org/docs/idl/ref/index.html
  • The Apache Software Foundation. (2013). Module star. Retrieved from https://www.openoffice.org/api/docs/common/ref/com/sun/star/module-ix.html
<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>