2018年5月27日日曜日

3: UNOの基本的構成要素

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

奴隷とは、誰か他の人の決定を盲目的に受け入れる人のことです。あなたは、自らの決定を自らの知識に基づいて行なうのです。基本を学ぶのがそのスタート地点です。

話題


About: UNO (Universal Network Objects)

この記事の目次


開始コンテキスト


  • 読者は、UNOとは何かについての知識(前記事の内容に同等の知識)を持っている。

ターゲットコンテキスト



  • 読者は、UNOの基本的構成要素がどのようなものであるかを知る。
ト書き
Hypothesizer 7、Objector 1C(前記事から来た)、Objector 3A、Objector 3Bがコンピューターの前にいる。


オリエンテーション


Hypothesizer 7
この記事では、UNOの基本的構成要素がどのようなものであるかを学びます。この知識がなければ、私たちは、UNOを使おうとして遭遇する問題を解決できないでしょうし、自分独自のニーズに合う最適なソリューションを作り出すこともできないでしょう。

Objector 1C
既に言っただろう、そんなまどろっこしいことをしている時間はないんだよ!自分の問題への直接の解を求めてるんだ!

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

Hypothesizer 7
あなたですか、また...

Objector 1C
悪いか?

Hypothesizer 7
もちろん、そのようなことはございません。...私の側でも前記事で既に申し上げましたが、誰かから与えられたソリューションにあなたが盲目的に従うと想定するほど私は無礼ではありません。ソリューションを採用するべきかどうかを自主的に判断することは絶対的にお譲りになれないことであると、私は想定しています。

Objector 1C
だから何だ?

Hypothesizer 7
ご自身の判断をなさるためには、そのソリューションを理解される必要があり、そのソリューションを理解されるためには、基本を理解される必要があるでしょう。

ト書き
Objector 1Cは眉を寄せる。

Objector 1C
そんな時間はないと言ってるんだ...

Hypothesizer 7
私であれば、自らの理解に基づいて自主的判断を行なうという基本的権利を放棄せず、この権利を守るために不可欠な時間はどうにかして捻出するでしょう...

Objector 1C
お前は大げさなんだよ!

Hypothesizer 7
たぶんそうでしょう、しかし、「私が言うとおりにただやれ。お前は何も理解しなくてよい。」と言っているように見えるドキュメントには私は我慢ならないのです。したがって、自分のドキュメントをそのようにしない倫理的責務を感じざるをえないわけです。

Objector 1C
お前の倫理的責務など俺にはどうでもいいことだ!

Hypothesizer 7
ごもっともです。そこで、私には自らの良心が許すように進めさせていただいて、あなたは、御必要ないものを飛ばし読みするなり全く読まないなりの優れたスキルを使われてはいかがでしょうか?目次から任意の記事へ飛ぶことができます。

Objector 1C
お前は生意気だ!

ト書き
Objector 1Cは、自らの正しさを誇示しながらどこかへ去っていき、Hypothesizer 7は深くため息をつく。

Objector 3B
'開始コンテキスト'が言っているように、あなたの前記事を読まなくちゃならないわけ?

Hypothesizer 7
マダム、'開始コンテキスト'をありのまま読んでいただくとお分かりのとおり、前提知識を既にお持ちであれば、その必要はありません。

Objector 3B
でも、'開始コンテキスト'に書かれているレベルで知識があるかどうやって分かるわけ?

Hypothesizer 7
まあ、UNOの本質を本当にご理解されていれば、その知識で十分なはずだということになります。

Objector 3B
...

Objector 3A
公公式参考ドキュメントの一部の説明が俺にはあまりよく理解できないんだよな。特に、'サービス'、'コンポーネント'、'オブジェクト'、'拡張機能'の区別が理解できない...

Hypothesizer 7
実のところ、私も理解できなかったのです、それが、私がこれを書いている理由でして。...私の意見では、 公式参考ドキュメントで使われている用語体系は理想的とは言えません。1つの大きな問題は、一部の用語(特に、'サービス'および'コンポーネント')がそれぞれ複数の概念を代表するように使われていることです。

Objector 3A
それじゃ、あんたがその混乱をひもとくと?

Hypothesizer 7
それが私の意図するところです。注意としては、私は、概念を明確に区別する私自身の用語体系を使用しなければなりません、そうしない用語体系でリーズナブルな説明をすることはできませんから。

Objector 3A
はあ?あんたがでっちあげた用語体系など俺は学びたくないが。

Hypothesizer 7
あの、申し上げたとおり、適切な記述を行なうためには適切な用語体系がどうしても必要であって、それが存在しない以上、私が1つ作るほかないのです。奇をてらっているわけではまったくありません。

Objector 3A
だが、LibreOfficeやApache OpenOfficeのAPIドキュメントがオフィシャル参考ドキュメントの用語体系で書かれている以上、あんたの用語体系ではAPIドキュメントを理解できないだろう...

Hypothesizer 7
ああ、「LibreOfficeやApache OpenOfficeのAPIドキュメント」というのは、LibreOfficeやApache OpenOfficeに含まれるUNOデータタイプの仕様を説明しているドキュメントのことですね?

Objector 3A
そうだ。

Hypothesizer 7
それでは、そのとおりです。 そこで、私は、オフィシャル参考ドキュメントで使われている用語をどのように解読すべきかおよびAPIドキュメント(より精密に言うと、UNOIDL APIドキュメント)をどのように理解できるかを、次の記事にて説明します。


本体


1: 私たちが使用する用語体系についての注意


Hypothesizer 7
これは、'オリエンテーション'で話したことなのですが、'オリエンテーション'は全読者がお読みになるという想定のものではないので、繰り返して申し上げましょう。

私たちの用語体系は、オフィシャル参考ドキュメントで使われている用語体系とはいくらか異なっています。これは避けられないことです。概念を明確に区別しない用語体系では、リーズナブルな叙述はできませんから。残念ながら、オフィシャル参考ドキュメントでは、'サービス'という用語がカメレオンのように複数の概念を指し示すために使われていること、'コンポーネント'という用語が乱用されすぎており、その登場毎に何を意味するのか私には理解しかねること、'オブジェクト'という用語が場合によって、本当にクラスインスタンスとしてのオブジェクトを指し示しているのか、それともクラスを指し示しているのか不明であること、等を私は指摘せざるをえません。

勿論、LibreOfficeやApache OpenOfficeのUNOIDL APIドキュメント(LibreOfficeやApache OpenOfficeに含まれるUNOデータタイプの仕様を説明しているドキュメント)(LibreOfficeのものはこちら、 Apache OpenOffice用はこちら)やオフィシャル参考ドキュメントをお読みにならなければならないことは理解しており、オフィシャル参考ドキュメントで使われている用語をどのように解読しようとすべきか、どのようにUNOIDL APIドキュメント(LibreOfficeのものはこちら、 Apache OpenOffice用はこちら)を理解できるかを、次の記事にて説明します。とにかく、まず、適切な用語体系を導入しなければ、何も適切に説明できません。


2: UNOプロセスとは何か?


Hypothesizer 7
最初に、'UNOプロセス'という用語で私が何を意味しているかを明確にします。この用語は後に時々使われますから。

UNOプロセスとは、UNOが有効化されたプログラミング言語ランタイム環境を1つ以上含むOSのプロセス(プログラムのインスタンス)のことです。

Objector 3B
あなたの説明はごちゃごちゃしてるわね...

Hypothesizer 7
大変遺憾です、マダム、しかし、正確であろうとする限りにおいて、その表現が、私が思いついた最善のものなのです。

実際には、UNOプロセスは、LibreOfficeまたはApache OpenOfficeのプロセス、あるいは、外部UNOプログラムのプロセスです。

Objector 3B
じゃあ、なんでそう言わなかったわけ?

Hypothesizer 7
UNOプロセスの種類を羅列することは必ずしもUNOプロセスの本質を説明しないからです。LibreOfficeまたはApache OpenOfficeのプロセスや外部UNOプログラムのプロセスが上の叙述に適合していることを御確認ください。

Objector 3B
...「プログラミング言語ランタイム環境を1つ以上含む」というのがどういう意味かよく分からないんだけど。

Hypothesizer 7
うーん、マダム、そういうことでしたら、前記事をまずお読みいただく必要があるかもしれません。

Objector 3B
'Orientation'! 'オリエンテーション'で読まなくていいとあなた言ったじゃない!

Hypothesizer 7
私は、「UNOの本質を本当にご理解されていれば」と申し上げたのですが...

Objector 3B
なんですって?まるで、私は本当には理解してないみたいじゃない!

Hypothesizer 7
マダム、UNOの本質を本当にご理解されているのであれば、それでよいはずです...

Objector 3B
. . .


3: UNOオブジェクトとは何か?


Hypothesizer 7
実際には、UNOオブジェクトとは何かを既にご存知のはずです。UNOが何かをご存知だということになっているわけですから。UNOオブジェクトが何かを知らずにUNOが何かを知ることはできません。

Objector 3A
知ってると思うよ。

Hypothesizer 7
それでは、ここでは、簡潔に、UNOオブジェクトとは何かを復習しましょう。

UNOオブジェクトとは、UNO仕様に合致したクラスインスタンスとしてのオブジェクトのことであり、それを、他の'プログラミング言語ランタイム環境'から操作できることを意味します、もし、そのプログラミング言語ランタイム環境がそれへの(厳密に言うと、それへの'UNOプロキシ'への(UNOプロキシが何かは、後ほど学びます))参照を持っていればですが。

'UNOオブジェクト'という用語を私たちが使う際は、常に、クラスインスタンス(クラスではなく)を意味することにご注意ください。


4: UNOコンポーネントとは何か?


Hypothesizer 7
UNOオブジェクトUNO仕様に適合する特別なオブジェクトであるためには、UNOオブジェクトがインスタンス化される元になるクラスが、UNO仕様に適合する特別なクラスである必要があります。

Objector 3A
それはリーズナブルだ。

Hypothesizer 7
そうしたクラスを私たちは'UNOコンポーネント'と呼びます。

オフィシャル参考ドキュメントは'コンポーネント'という単語を様々なものを指すよう濫用していますが、私たちは'UNOコンポーネント'という用語を常にこの単一の意味で使うことにご注意ください。...確かに、'コンポーネント'という単語を様々なものを指して使うのは、間違いというわけではありません。その単語はとても幅広い意味を持っているわけですから。しかし、どんな表現でもその第1目的は(少なくとも私にとっては)、その表現が意味するところを読者に曖昧さ無く特定してもらうことであって、その目的を達成しない表現には欠陥があります(少なくとも技術ドキュメントにおいては)。

Objector 3A
それはともかく、何が、クラスをUNOコンポーネントにするのだ、具体的には?

Hypothesizer 7
クラスは、ある特定のインターフェース(実際には、'com.sun.star.uno.XInterface')を実装することでUNOコンポーネントになります。

Objector 3A
それでは、そのインターフェースを実装するクラスはすべてUNOコンポーネントなのか?

Hypothesizer 7
そうです。


5: UNOインターフェースとは何か?


Objector 3B
私はUNOをBasicからだけ使うんだけど、'UNOインターフェース'なんて私に関係あるの?だって、UNOインターフェースなんて私のプログラムでは使わないんでしょ?

Hypothesizer 7
ああ、マダム、あなたのプログラムでUNOインターフェースを直接扱うことはない(UNOインターフェースはBasicランタイムによって処理される)かもしれませんが、UNOインターフェースを理解することは有益です、なぜなら、あなたのプログラムで何をできるかを知るために、LibreOfficeまたはApache OpenOfficeのUNOIDL APIドキュメント(LibreOfficeのものはこちら、 Apache OpenOfficeのものはこちら)でUNOインターフェースを見つけたいと思うでしょうから。

Objector 3B
うーん...

Hypothesizer 7
UNOインターフェースは、'com.sun.star.uno.XInterface'またはその子孫のインターフェースであり、そのインターフェースを実装した各UNOコンポーネントの1つの様相の、抽象的な、外部への表明となります。

Objector 3A
「抽象的な、外部への表明となります」とはどういう意味だ?

Hypothesizer 7
前記事で理解した通り、UNOの世界にはクラス(UNOコンポーネントのことです)はありません。

Objector 3A
ああ、あるプログラミング言語ランタイム環境にあるUNOコンポーネントのUNOオブジェクトが生存する時、他のプログラミング言語ランタイム環境はそのUNOコンポーネントを見ることはなく、UNOの世界を通してそのUNOコンポーネントに実装されているUNOインターフェースを見るのだと...

Hypothesizer 7
そうです。'UNOインターフェースを通して他のプログラミング言語ランタイム環境にそのUNOオブジェクトを操作させる'というのが、'抽象的な、外部への表明となる'ということです。

Objector 3A
「各UNOコンポーネントの1つの様相」というのはどういう意味だ?

Hypothesizer 7
UNOコンポーネントは複数のUNOインターフェースを実装することができ、各UNOインターフェースはそのUNOコンポーネントの1つの様相を代表します。

Objector 3A
他方で、UNOインターフェースは複数のUNOインターフェースを継承できるというわけか?

Hypothesizer 7
はい、できます、今は。

Objector 3A
ああ、オフィシャル参考ドキュメントは、UNOインターフェースが複数のUNOインターフェースを継承できなかった昔について語っているな。それに「旧スタイルサービス」なるものについても。その説明が俺にはよく理解できないのだが...

Hypothesizer 7
「旧スタイルサービス」という用語については次の記事で話します。LibreOfficeまたはApache OpenOfficeのUNOIDL APIドキュメント(LibreOfficeのものはこちら、Apache OpenOfficeのものはこちら)を理解しようとするとき、それを解読しなければなりませんから。まあ、「旧スタイルサービス」は実際にはどうでもよいのですが。

Objector 3A
「実際にはどうでもよい」だって?

Hypothesizer 7
えーと、どのようにどうでもよいかは、次の記事で学びます。


6: UNOプロキシとは何か?


Hypothesizer 7
別のプログラミング言語ランタイム環境に生存しているUNOオブジェクトを操作する際、ローカル環境に生存していないそのUNOオブジェクトを直接操作することはできず、そのリモートUNOオブジェクトへのプロキシ(UNOプロキシ)を取得してそのプロキシを操作することになります。

UNOプロキシはリモートUNOオブジェクトの単一のUNOインターフェースを代表するということが重要です。

Objector 3A
ふーむ、リモートUNOオブジェクトを、そのUNOコンポーネントに実装されている別のUNOインターフェースで操作したい時は、その、別のUNOインターフェースを代表する別のUNOプロキシを取得しなければならないということらしいな。

Hypothesizer 7
そうです、ただし、一部のプログラミング言語(例えば、Basic)では、そうした手順は、プログラマーがソースコードで明示的にそう指定することなくランタイムによって処理されることにご注意ください。それでも、メカニズムは同じです。

Objector 3A
オフィシャル参考ドキュメント内の、UNOオブジェクトを、そのUNOオブジェクトのUNOコンポーネントに実装されているUNOインターフェースにキャストすることが、そのUNOコンポーネントがそのUNOインターフェースを実装していることをコンパイラが知らないという理由のためにできないと主張する言明にとても混乱させられたのだが...

Hypothesizer 7
ああ、その主張は不条理に聞こえますよね?

Objector 3A
聞こえるとも。Javaでは、オブジェクトをインターフェースに、そのオブジェクトがそのインターフェースを実装していることをコンパイラが知らないからこそキャストする(コンパイラがその事実を知らないから、プログラマーがコンパイラにその事実を保証してやらないといけない)わけだから。

Hypothesizer 7
実際には、あなたは、リモートUNOオブジェクトそのものを操作しているわけではなく、単一のUNOインターフェースを代表するUNOプロキシを操作しており、当然、そのUNOプロキシを、そのUNOプロキシが代表(実装)していないUNOインターフェースにキャストすることはできません。

Objector 3A
もちろんだ...

Hypothesizer 7
注意として、C#では、UNOプロキシを別のUNOインターフェースにキャストできますが、これは、キャストオペレーターが、その別のUNOインターフェースを代表する別のUNOプロキシを取得するようオーバーライドされているためです。

Objector 3A
ああ、それでは、メカニズムは同じわけだ...


7: UNOサービスとは何か?UNOサービスマネージャーとは何か?グローバルUNOサービスマネージャーとは何か?


Hypothesizer 7
先程申し上げましたが、オフィシャル参考ドキュメントでは、「サービス」という言葉は、複数の概念を表わすように使用されています。私たちは、'UNOサービス'という用語を、単一の概念だけを表わすように使用します。読者は、その用語が意味するものを曖昧さなく特定しなければなりませんから。

UNOサービスマネージャーとは何かから始めます。UNOサービスマネージャーは、UNOオブジェクトのファクトリーであり、'com.sun.star.lang.XMultiComponentFactory'というUNOインターフェースを実装しているものです。

Objector 3B
「ファクトリー」?

Hypothesizer 7
'ファクトリー'の概念を復習しましょう。プリミティブにクラスからオブジェクトを生成する(Javaでは、'new'オペレーターを呼びます)ことはできますが、そうするためには、そのクラスを指定しなければなりません。その代わりに、ファクトリーは、ユーザーからの各リクエストに対してどのクラスを使用するかを決定し、時には、オブジェクトをプーリングして、オブジェクトを生成する役目を引き受けます。

Objector 3B
ははあ...

Hypothesizer 7
UNOサービスとは、UNOサービスマネージャーに登録されているアイテムのことです。

Objector 3B
「アイテム」?

Hypothesizer 7
UNOサービスマネージャーにUNOオブジェクトを要求する際は、そのUNOサービスマネージャーに登録されている全てのアイテムの中から1つのアイテムを指定します。

Objector 3B
どうやって、そのアイテムを指定できるわけ?

Hypothesizer 7
各アイテムはUNOサービスマネージャー内で一意の名称('UNOサービス名')を持っていて、あなたはその名称を指定します。

Objector 3A
UNOサービスマネージャーを通さずにUNOコンポーネントからUNOオブジェクトをプリミティブに生成することもできるんだろう?

Hypothesizer 7
そのUNOコンポーネントがあなたのプログラミング言語の世界に存在していれば、はい、できます。しかし、UNOサービスマネージャーが必要とされる主要な理由は、UNOオブジェクトは、他のプログラミング言語からも生成できるように想定されていることです。例えば、あるLibreOfficeプロセスを操作するJava UNOプログラムをあなたが作る時、あなたは、そのLibreOfficeプロセス内に、UNOサービスマネージャーを通してUNOオブジェクトを生成しなければなりません。

Objector 3A
そいつはリーズナブルだ。

Hypothesizer 7
LibreOfficeやApache OpenOfficeには、複数のUNOサービスマネージャーがあります。いくつかのUNOサービスマネージャーはそれ自身のコンテキストを持たなければならないからです。

Objector 3A
ああ、あるUNOサービスマネージャーはあるスプレッドシートドキュメントに属するといった...

Hypothesizer 7
例えば、そうです。他方、各UNOプロセスは、'グローバルUNOサービスマネージャー'という常時使えるUNOサービスマネージャーを1つ持っています。グローバルUNOサービスマネージャーに登録されているUNOサービスのことを'グローバルUNOサービス'と私たちは呼びます。

Objector 3A
うむ?'各UNOプログラミング言語ランタイム環境'ではなく、「各UNOプロセス」がグローバルUNOサービスマネージャーを持っているのか?

Hypothesizer 7
実はそうです。LibreOfficeプロセス内のJVM(またはBasicランタイムやそれに類する(Python、BeanShell、JavaScript)ランタイム)は自身のグローバルUNOサービスマネージャーを持っていません。

Objector 3A
それでは、Basicマクロは、そのJVM内にどうやってUNOオブジェクトを生成できるのか?

Hypothesizer 7
LibreOfficeプロセスのC++言語ランタイム環境内のグローバルUNOサービスマネージャーが、そのJVM内にUNOオブジェクトを生成できます。

Objector 3A
ふーむ・・・、それでは、LibreOfficeプロセス内のBasicやそれに類するランタイム内にUNOオブジェクトを生成するのは?

Hypothesizer 7
私が知る限り、Basicおよびそれに類するプログラミング言語でそのようなことはできません。そこではUNOコンポーネントを定義できませんから。

Objector 3B
はあ?信じられないことをあなた今言ったわね...

Hypothesizer 7
誤解なさらないでください。勿論、Basicで、LibreOffice内C++プログラミング言語ランタイム環境に生存するグローバルUNOサービスマネージャーへのUNOプロキシを取得して、そのUNOプロキシを通して、LibreOffice内のC++プログラミング言語ランタイム環境やJVM内にUNOオブジェクトを生成することはできます。

Objector 3B
ああ、分かったわ。


8: 1UNOサービス限定のUNOサービスインスタンスファクトリーとは何か?


Hypothesizer 7
ご注意いただきたいのですが、「1UNOサービス限定のUNOサービスインスタンスファクトリー」というのは、必要にせまられて私が造った用語です。オフィシャル参考ドキュメントはこれを単に「サービス」と呼んでいるようですが、これは、UNOサービスではなく、UNOサービスインスタンスのファクトリーですから。

Objector 3B
その名前、長すぎよ!もっと短い名前を造れないの?

Hypothesizer 7
とても長くて申し訳ありません。しかし、実体からかけ離れることのない適切なもっと短い名前は考えつくことができなかったのです。実体からかけ離れることのないというのは、私にはとっては必須ですので...

Objector 3A
それで、それはいったい何なのだ?

Hypothesizer 7
1UNOサービス限定のUNOサービスインスタンスファクトリーは、グローバルUNOサービスへのフロントエンドであって、特定1つのUNOサービスのインスタンスのみを生成するものです。

Objector 3A
なんで、そんなフロントエンドが俺に必要なんだ?

Hypothesizer 7
特に必要というわけではありませんが、便利であるかもしれません。グローバルUNOサービスマネージャーへは、サービス生成の引数を配列として渡さなければなりませんが、1UNOサービス限定のUNOサービスインスタンスファクトリーには、独自の引数群を持つファクトリーメソッド(公式参考ドキュメントでは、「コンストラクター」と呼ばれています)を定義することができます。


9: UNOオブジェクト群コンテキストとは何か?


Hypothesizer 7
コンセプトとしては、UNOオブジェクト群コンテキストは、1部のUNOオブジェクトのためのコンテキストです。各UNOオブジェクトは、ある1つのUNOオブジェクト群コンテキストに結び付けられます。

オフィシャル参考ドキュメントでは、UNOオブジェクト群コンテキストは、「コンポーネントコンテキスト」と呼ばれていますが、この名称、「コンポーネントコンテキスト」は、「コンポーネント」という単語の濫用の結果だと思われ、各用語が曖昧さなく単一の概念を表さなければならない私たちの用語体系においては、「コンポーネントコンテキスト」は実体からかけ離れた名称だということになります。

Objector 3A
つまり、「コンポーネントコンテキスト」は、UNOコンポーネントのためのコンテキストではなく、UNOオブジェクトのためのものであると...

Hypothesizer 7
それが、「コンポーネントコンテキスト」という用語を、残念なことに、私たちが使えない理由です。

Objector 3A
とにかく、UNOオブジェクト群コンテキストは、具体的にはどういうものなのか?

Hypothesizer 7
いくつかのプロパティのコンテナでして、グローバルサービスマネージャーへの参照(UNOオブジェクト群コンテキストが生存しているプログラミング言語ランタイム環境と同一の環境内にグローバルサービスマネージャーが生存している場合)またはグローバルサービスマネージャーへのUNOプロキシへの参照(UNOオブジェクト群コンテキストが生存しているプログラミング言語ランタイム環境と同一の環境内にグローバルサービスマネージャーが生存していない場合)も1つのプロパティとして格納されています。

Objector 3A
プログラミング言語ランタイム環境毎またはUNOプロセス毎に何個のUNOオブジェクト群コンテキストが存在するのか?

Hypothesizer 7
初めは、UNOプロセスにただ1つのUNOオブジェクト群コンテキストがありますが、プログラミング言語ランタイム環境毎またはUNOプロセス毎、何個でも好きなだけあなたが作成することができます。

Objector 3A
それでは、初めは、LibreOfficeプロセスのC++ランタイム環境にただ1つのUNOオブジェクト群コンテキストがあり、そのC++ランタイム環境内UNOオブジェクト群コンテキストにLibreOfficeプロセス内のJVM内のすべてのUNOオブジェクトを割り当てることもできるが、それらのUNOオブジェクトの一部や全部に別のコンテキストを与えたければ、そうしたUNOオブジェクトをそのJVM内に自分で生成したあるUNOオブジェクト群コンテキストに割り当てることもできるということか?

Hypothesizer 7
はい、そのようにして、新たなUNOオブジェクト群コンテキストが生成されるわけです。

UNOオブジェクト群コンテキストはUNOオペレーションへのエントリーポイントとしての役割を果たすことにご注目ください。UNOを使いたいときは、まず、UNOオブジェクト群コンテキスト(それ自体、UNOオブジェクトです)を取得し、それから、他のUNOオブジェクトを芋づる式に次々と取得します(UNOオブジェクトを具体的にどうやって取得するかは、将来の記事で学びます)。


10: UNOオブジェクトのプロパティとは何か?


Hypothesizer 7
'com.sun.star.beans.XPropertySet'という名称のUNOインターフェースがあり、'getPropertyValue'、'setPropertyValue'等のメソッドを持っています。あるUNOコンポーネント がこのUNOインターフェースを実装するとき、このUNOインターフェースを通して管理できる名前ー値ペアそれぞれを、そのUNOコンポーネントのインスタンスの'プロパティ'と呼びます。

Objector 3A
では、プロパティは、メカニズムの観点からすると別に特別なものではなく、あるUNOインターフェースを通して管理できるデータにすぎないということか...

Hypothesizer 7
実はそうです、しかし、LibreOfficeおよびApache OpenOfficeでふんだんに使われており、私たちも頻繁に扱うことになるため、ここで紹介いたしました。


11: UNOオブジェクトの属性とは何か?


Hypothesizer 7
UNOインターフェースは'属性'を持つことができますが、これは、実際には、getter、setterメソッドのペア(属性が書き込み可能な場合)またはgetterメソッド(属性が読み取り専用な場合)です。

Objector 3A
'プロパティ'と'属性'の両方がなんで俺に必要なんだ?

Hypothesizer 7
特に必要というわけではありませんが、LibreOfficeおよびApache OpenOfficeに実際に両方あるので、LibreOfficeまたはApache OpenOfficeのプロセスを操作する際に両方使わざるをえないかもしれません。


12: 'UNOデータタイプのマージされていないファイル'とは何か?'UNOデータタイプのマージされたファイル'とは何か?UNOデータタイプレジストリとは何か?


Hypothesizer 7
私たちは、UNO複合データタイプをUNOIDLファイルの中に定義します。UNOIDLコンパイラ、'idlc'は、このUNOIDLファイルを、'UNOデータタイプのマージされていないファイル'にコンパイルします。ツール、'regmerge'は、いくつかの'UNOデータタイプのマージされていないファイル'を1つの'UNOデータタイプのマージされたファイル'にマージします。私たちは、そうした'UNOデータタイプのマージされたファイル'をUNOデータタイプレジストリに登録します。

Objector 3A
'UNOデータタイプのマージされたファイル'をどうやってUNOデータタイプレジストリに登録できるのか?

Hypothesizer 7
'UNOデータタイプのマージされたファイル'をLibreOfficeまたはApache OpenOfficeの拡張機能(LibreOfficeまたはApache OpenOfficeの拡張機能とは何かは、後ほど学びます)内に適切に配置してその拡張機能を登録するか、'UNOデータタイプのマージされたファイル'をある特定のディレクトリにコピーする(またはそこへのリンクを作成する)かによって、登録できます。

Objector 3A
UNO複合データタイプからマッピングされたJavaデータタイプ(特に、Javaインターフェース)は、どのように作成できるのか?

Hypothesizer 7
'javamaker'(C++用には'cppumaker'、Microsoft .NET Framework用には'climaker')というツールがあり、これが、'UNOデータタイプのマージされたファイル'からJavaデータタイプを作成します。

Objector 3B
Basicはどうなるの?

Hypothesizer 7
Basic用はありませんし、必要もありません。これは、私の想像では、BasicランタイムはUNOデータタイプレジストリを直接使うからでしょう。


13: LibreOfficeまたはApache OpenOfficeの拡張機能(UNO拡張機能とも呼ぶ)とは何か?LibreOfficeまたはApache OpenOfficeの拡張機能ファイル(UNO拡張機能ファイルとも呼ぶ)とは何か?


Hypothesizer 7
LibreOfficeまたはApache OpenOfficeに機能を追加するとき、そうする標準的な方法は、LibreOfficeまたはApache OpenOfficeの拡張機能を作成して、LibreOfficeまたはApache OpenOfficeに登録することです。手短に言うと、LibreOfficeまたはApache OpenOfficeの拡張機能は、機能のパッケージです。

Objector 3A
「標準的な方法」?

Hypothesizer 7
それは'唯一の方法'ではありません。Basicマクロは、拡張機能に含めることもできますが、Basicエディタで追加することもできます。しかし、UNOサービスやその他一部のものを登録したい場合、それが最も確立された方法であって、別の方法を見つけるべきだとする理由を私は知りません。

私たちは、LibreOfficeまたはApache OpenOfficeの拡張機能のことをUNO拡張機能とも呼びます。これは、UNOの仕様を満たしている拡張機能という意味です。

LibreOfficeまたはApache OpenOfficeの拡張機能ファイル(UNO拡張機能ファイル)とは、拡張機能の内容物をアーカイブしたファイルのことです。


14: 結びとその先


Hypothesizer 7
UNOの基本的構成要素がどのようなものであるかを私たちは学びました。この知識は、将来のほとんどの記事の前提知識となります。ここで導入された用語体系を用いて説明が行われることになります。

公式参考ドキュメントで使われている用語体系をただ無視するというわけにいかないことは知っています。少なくとも、その用語体系で書かれた、LibreOfficeまたはApache OpenOfficeのUNOIDL APIドキュメント(LibreOfficeのものはこちら、 Apache OpenOffice用はこちら)を理解しなければならないでしょうから。そこで、公式参考ドキュメントで使われている用語をどのように解読すべきか、LibreOfficeまたはApache OpenOfficeのUNOIDL APIドキュメント(LibreOfficeのものはこちら、 Apache OpenOffice用はこちら)をどのように理解すべきかを、次の記事で説明します。


参考資料


  • 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
<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>