前の関連記事:LibreOffice(64)Professional UNO example
次は第3章Writing UNO componentsの例です。例の入っているフォルダはDevelopersGuide/Componentsになります。さらにその中に6つのフォルダに分類されています。
DevelopersGuide/Componentsフォルダの中にあるJavaの例をみる
この章の例はjavaソースをビルドすればいいというわけではないようなのでまずは例のフォルダの中をみてみます。
SynapticパッケージマネージャでtreeをインストールしてComponentsフォルダの中身一覧を出力しました。
pq@linuxBean:/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components$ tree . ├── Addons │ ├── JobsAddon │ │ ├── Addons.xcu │ │ ├── AsyncJob.components │ │ ├── AsyncJob.java │ │ ├── Jobs.xcu │ │ └── Makefile │ ├── ProtocolHandlerAddon_cpp │ │ ├── Addons.xcu │ │ ├── Makefile │ │ ├── ProtocolHandler.xcu │ │ ├── addon.cxx │ │ ├── addon.hxx │ │ └── component.cxx │ └── ProtocolHandlerAddon_java │ ├── Addons.xcu │ ├── Makefile │ ├── ProtocolHandler.xcu │ ├── ProtocolHandlerAddon.java │ └── ProtocolHandlerAddon_java.components ├── CppComponent │ ├── Makefile │ ├── SimpleComponent.odt │ ├── TestCppComponent.cxx │ ├── service1_impl.cxx │ ├── service2_impl.cxx │ └── some.idl ├── JavaComponent │ ├── JavaComponent.components │ ├── Makefile │ ├── SomethingA.idl │ ├── SomethingB.idl │ ├── TestComponentA.java │ ├── TestComponentB.java │ ├── TestJavaComponent.java │ ├── TestServiceProvider.java │ ├── XSomethingA.idl │ └── XSomethingB.idl ├── SimpleLicense │ ├── LicenseTest.components │ ├── LicenseTest.idl │ ├── LicenseTest.java │ ├── Makefile │ ├── description.xml │ └── registration │ ├── license_de.txt │ └── license_en_US.txt ├── Thumbs │ ├── Makefile │ ├── org │ │ └── openoffice │ │ ├── comp │ │ │ └── test │ │ │ ├── ImageShrink.components │ │ │ ├── ImageShrink.java │ │ │ ├── Makefile │ │ │ └── Thumbs.java │ │ └── test │ │ ├── ImageShrink.idl │ │ ├── Makefile │ │ ├── XImageShrink.idl │ │ └── XImageShrinkFilter.idl │ └── thumbs.mk └── dialogcomponent ├── DialogComponent.components ├── DialogComponent.java ├── DialogComponent.odt ├── Makefile ├── TestDialogHandler.idl └── XTestDialogHandler.idlこのうちjavaソースファイルが含まれている例だけ取り出します。
├── Addons │ ├── JobsAddon │ │ ├── Addons.xcu │ │ ├── AsyncJob.components │ │ ├── AsyncJob.java │ │ ├── Jobs.xcu │ │ └── Makefile │ └── ProtocolHandlerAddon_java │ ├── Addons.xcu │ ├── Makefile │ ├── ProtocolHandler.xcu │ ├── ProtocolHandlerAddon.java │ └── ProtocolHandlerAddon_java.components ├── JavaComponent │ ├── JavaComponent.components │ ├── Makefile │ ├── SomethingA.idl │ ├── SomethingB.idl │ ├── TestComponentA.java │ ├── TestComponentB.java │ ├── TestJavaComponent.java │ ├── TestServiceProvider.java │ ├── XSomethingA.idl │ └── XSomethingB.idl ├── SimpleLicense │ ├── LicenseTest.components │ ├── LicenseTest.idl │ ├── LicenseTest.java │ ├── Makefile │ ├── description.xml │ └── registration │ ├── license_de.txt │ └── license_en_US.txt ├── Thumbs │ ├── Makefile │ ├── org │ │ └── openoffice │ │ ├── comp │ │ │ └── test │ │ │ ├── ImageShrink.components │ │ │ ├── ImageShrink.java │ │ │ ├── Makefile │ │ │ └── Thumbs.java │ │ └── test │ │ ├── ImageShrink.idl │ │ ├── Makefile │ │ ├── XImageShrink.idl │ │ └── XImageShrinkFilter.idl │ └── thumbs.mk └── dialogcomponent ├── DialogComponent.components ├── DialogComponent.java ├── DialogComponent.odt ├── Makefile ├── TestDialogHandler.idl └── XTestDialogHandler.idlLibreOffice 4.3 SDK - Developer's Guide Examplesも参考に例に対応するデベロッパーズガイドへのリンクを探します。
Thumbs Example Simple Component in Java
(今回やる例。継承関係にあるUNOIDLを定義する例。)
Java Component Example Possible Structures for Java Components
(拡張機能oxtファイルに複数のUNOコンポーネントを実装する例。LibreOffice5(38)Java Component ExampleをPythonに翻訳するでPythonに書き換えました。)
ProtocolHandler Addon Java Protocol Handler
Jobs Addon Example Jobs
(LibreOffice5(16)イベント駆動する拡張機能のJavaの例:AsyncJob.oxt その1でやります。)
Dialog Component Example Accessing Dialogs
デベロッパーズガイドの出現順に並べました。
デベロッパーズガイドを何度読んでも難しくて私には理解できないのでとりあえずmakeしてしまいます。
Thumbs Exampleをmakeする
LibreOffice(61)linuxBeanでJavaの例をmakeで作ったsetsdkenvランチャでTerminalを起動します。
lsでフォルダ内を確認してcd Components→cd Thumbs でThumbsの例のフォルダにたどりつきます。
ここでmakeすればサブフォルダのMakefileもすべて読み込んで実行してくれるようになっているようなのでここでmakeします。
例のMakefileにはcleanターゲットが定義されているので、makeしたファイルを消したいときはmake cleanとすればその例のファイルが消去されます。
pq@linuxBean:/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs$ make make -C org/openoffice/test make[1]: ディレクトリ `/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs/org/openoffice/test' に入ります mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample "/opt/libreoffice4.3/sdk/bin/idlc" -I. -I../../.. -I../../../../../../../idl -O/home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample XImageShrink.idl Compiling: XImageShrink.idl mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample "/opt/libreoffice4.3/sdk/bin/idlc" -I. -I../../.. -I../../../../../../../idl -O/home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample XImageShrinkFilter.idl Compiling: XImageShrinkFilter.idl mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample "/opt/libreoffice4.3/sdk/bin/idlc" -I. -I../../.. -I../../../../../../../idl -O/home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample ImageShrink.idl Compiling: ImageShrink.idl rm -f /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample/ImageShrink.uno.rdb mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample "/opt/libreoffice4.3/ure-link/bin/regmerge" /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample/ImageShrink.uno.rdb /UCR /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample/XImageShrink.urd /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample/XImageShrinkFilter.urd /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample/ImageShrink.urd mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/org/openoffice/test "/opt/libreoffice4.3/sdk/bin/javamaker" -nD -Torg.openoffice.test.XImageShrink -Torg.openoffice.test.XImageShrinkFilter -Torg.openoffice.test.ImageShrink -O/home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample/ImageShrink.uno.rdb -X"/opt/libreoffice4.3/ure-link/share/misc/types.rdb" -X"/opt/libreoffice4.3/sdk/../program/types/offapi.rdb" mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/org/openoffice/test "/opt/libreoffice4.3/sdk/bin/javamaker" -nD -Torg.openoffice.test.XImageShrink -Torg.openoffice.test.XImageShrinkFilter -Torg.openoffice.test.ImageShrink -O/home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample/ImageShrink.uno.rdb -X"/opt/libreoffice4.3/ure-link/share/misc/types.rdb" -X"/opt/libreoffice4.3/sdk/../program/types/offapi.rdb" mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/org/openoffice/test "/opt/libreoffice4.3/sdk/bin/javamaker" -nD -Torg.openoffice.test.XImageShrink -Torg.openoffice.test.XImageShrinkFilter -Torg.openoffice.test.ImageShrink -O/home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample/ImageShrink.uno.rdb -X"/opt/libreoffice4.3/ure-link/share/misc/types.rdb" -X"/opt/libreoffice4.3/sdk/../program/types/offapi.rdb" make[1]: ディレクトリ `/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs/org/openoffice/test' から出ます make -C org/openoffice/comp/test make[1]: ディレクトリ `/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs/org/openoffice/comp/test' に入ります mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/org/openoffice/comp/test "/usr/bin/javac" -classpath "/opt/libreoffice4.3/ure-link/share/java/juh.jar:/opt/libreoffice4.3/ure-link/share/java/jurt.jar:/opt/libreoffice4.3/ure-link/share/java/ridl.jar:/opt/libreoffice4.3/ure-link/share/java/unoloader.jar:/opt/libreoffice4.3/sdk/../program/classes/unoil.jar::/home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample" -d /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample ImageShrink.java rm -f /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/ImageShrink.uno.jar mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample "/usr/bin/jar" cvfm /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/ImageShrink.uno.jar /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/ImageShrink.uno.Manifest -C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/comp/test/ImageShrink.class -C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/test/XImageShrink.class -C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/test/XImageShrinkFilter.class -C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/test/ImageShrink.class マニフェストが追加されました org/openoffice/comp/test/ImageShrink.classを追加中です(入=2383)(出=1082)(54%収縮されました) org/openoffice/test/XImageShrink.classを追加中です(入=775)(出=422)(45%収縮されました) org/openoffice/test/XImageShrinkFilter.classを追加中です(入=167)(出=128)(23%収縮されました) org/openoffice/test/ImageShrink.classを追加中です(入=1658)(出=679)(59%収縮されました) mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/ImageShrink/META-INF rm -f /home/pq/libreoffice4.3_sdk/LINUXexample.out/bin/ImageShrink.oxt mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/bin cp /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample/ImageShrink.uno.rdb /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample "/usr/bin/zip" /home/pq/libreoffice4.3_sdk/LINUXexample.out/bin/ImageShrink.oxt ImageShrink.components adding: ImageShrink.components (deflated 42%) cd /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample && "/usr/bin/zip" -u ../../bin/ImageShrink.oxt ImageShrink.uno.rdb ImageShrink.uno.jar adding: ImageShrink.uno.rdb (deflated 90%) adding: ImageShrink.uno.jar (deflated 17%) cd /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/ImageShrink && "/usr/bin/zip" -u ../../../bin/ImageShrink.oxt META-INF/manifest.xml adding: META-INF/manifest.xml (deflated 53%) rm -f /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ImageShrink.uno.rdb rm -f /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/devguide_ImageShrink_register_component.flag mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc "/opt/libreoffice4.3/sdk/../program/unopkg" add -f "/home/pq/libreoffice4.3_sdk/LINUXexample.out/bin/ImageShrink.oxt" mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/org/openoffice/comp/test "/usr/bin/javac" -classpath "/opt/libreoffice4.3/ure-link/share/java/juh.jar:/opt/libreoffice4.3/ure-link/share/java/jurt.jar:/opt/libreoffice4.3/ure-link/share/java/ridl.jar:/opt/libreoffice4.3/ure-link/share/java/unoloader.jar:/opt/libreoffice4.3/sdk/../program/classes/unoil.jar::/home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample" -d /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample Thumbs.java mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample && rm -f /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/Thumbs.jar "/usr/bin/jar" cvfm /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/Thumbs.jar /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/Thumbs.mf -C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/comp/test/Thumbs.class -C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/test/XImageShrink.class -C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/test/XImageShrinkFilter.class -C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/test/ImageShrink.class マニフェストが追加されました org/openoffice/comp/test/Thumbs.classを追加中です(入=1572)(出=908)(42%収縮されました) org/openoffice/test/XImageShrink.classを追加中です(入=775)(出=422)(45%収縮されました) org/openoffice/test/XImageShrinkFilter.classを追加中です(入=167)(出=128)(23%収縮されました) org/openoffice/test/ImageShrink.classを追加中です(入=1658)(出=679)(59%収縮されました) "/usr/bin/jar" uvf /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/Thumbs.jar -C ../../../../../../../../classes 'com/sun/star/lib/loader/Loader.class' -C ../../../../../../../../classes 'com/sun/star/lib/loader/Loader$Drain.class' -C ../../../../../../../../classes 'com/sun/star/lib/loader/Loader$CustomURLClassLoader.class' -C ../../../../../../../../classes 'com/sun/star/lib/loader/Loader$Drain.class' -C ../../../../../../../../classes 'com/sun/star/lib/loader/InstallationFinder.class' -C ../../../../../../../../classes 'com/sun/star/lib/loader/InstallationFinder$StreamGobbler.class' -C ../../../../../../../../classes 'com/sun/star/lib/loader/WinRegKey.class' -C ../../../../../../../../classes 'com/sun/star/lib/loader/WinRegKeyException.class' -C ../../../../../../../../classes 'win/unowinreg.dll' com/sun/star/lib/loader/Loader.classを追加中です(入=7991)(出=3797)(52%収縮されました) com/sun/star/lib/loader/Loader$Drain.classを追加中です(入=739)(出=444)(39%収縮されました) com/sun/star/lib/loader/Loader$CustomURLClassLoader.classを追加中です(入=1248)(出=637)(48%収縮されました) com/sun/star/lib/loader/InstallationFinder.classを追加中です(入=8905)(出=4869)(45%収縮されました) com/sun/star/lib/loader/InstallationFinder$StreamGobbler.classを追加中です(入=960)(出=542)(43%収縮されました) com/sun/star/lib/loader/WinRegKey.classを追加中です(入=4779)(出=2430)(49%収縮されました) com/sun/star/lib/loader/WinRegKeyException.classを追加中です(入=475)(出=287)(39%収縮されました) win/unowinreg.dllを追加中です(入=12288)(出=1712)(86%収縮されました) make[1]: ディレクトリ `/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs/org/openoffice/comp/test' から出ます -------------------------------------------------------------------------------- Please use one of the following command to execute the example! - make Thumbs.run -------- The ImageShrink Java component was installed if SDK_AUTO_DEPLOYMENT = YES. You can use this component inside your office installation, see the example description. --------------------------------------------------------------------------------これらを順番にみてThumb Exampleが何の例なのか学習します。
ImageShrinkサービス、XImageShrinkFilterインターフェイス、XImageShrinkインターフェイスを定義
まず2行目で/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs/org/openoffice/testフォルダに移動しています。
このフォルダにはImageShrink.idl、XImageShrink.idl、XImageShrinkFilter.idlの3つのidlファイルがあります。
ImageShrink.idlでImageShrinkサービスの定義をしています。
サービスについてはLibreOffice(13)デベロッパーガイド1 ほとんどの例はJavaでちょっと勉強したようにインターフェイスを1つだけをもつnew-styleサービスと、複数のインターフェイスをもち、さらに継承も可能なold-styleサービスがあります。
Defining a Serviceに解説があるようにImageShrinkサービスはnew-styleサービスです。
ImageShrink.idlでImageShrinkサービスはXImageShrinkFilterインターフェイスを備えることが定義されています。
XImageShrinkFilter.idlではそのXImageShrinkFilterインターフェイスの定義を行っており、このXImageShrinkFilterインターフェイスはXImageShrinkインターフェイスとcom::sun::star::document::XFilterを持っています。
XImageShrinkインターフェイスはXImageShrink.idlで定義されています。
Defining an Interfaceに解説があるようにSourceDirectory、DestinationDirectory、Dimensionの3つの属性を持っています。
属性とはLibreOffice(12)オブジェクト指向プログラミング:インターフェイスでやったように変数のことになります。
継承図にしてみました。
(2017.4.4追記。この記事を書いているときはLibreOffice APIにあるIDLを継承した時は実装も継承されると勘違いしていましたが、そうではなくて、単にIDLを借用しているだけなので実装も書かないといけません。LibreOffice5(37)bootstrap()で起動したLibreOfficeをエラーなく終了させる参照。)
org.openoffice.testパッケージがThumbs Exampleで定義されているものです。
Generating Source Code from UNOIDL Definitions - Apache OpenOffice Wiki
idlファイルの処理の仕方はここに書いてあります。
またmakeの出力に戻ってThumbs Exampleのこれらidlファイルの処理のされ方を追ってみましょう。
idlcでidlファイルをurdファイルにコンパイルする
4行目のmkdir -pのpはパスにあるフォルダをすべて作成するオプションです。
作成したComponentThumbsExampleフォルダにidlファイルのコンパイル結果を出力します。
"/opt/libreoffice4.3/sdk/bin/idlc" -I. -I../../.. -I../../../../../../../idl -O/home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample XImageShrink.idl/opt/libreoffice4.3/sdk/bin/idlcでXImageShrink.idlをコンパイルしています。
-Iオプションと-0オプションを使っています。
-0オプションは出力先ディレクトリ指定で/home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExampleにidlファイルと同名のutdファイルを出力します。
-Iはコンパイルに必要なファイルをidlcが探すパスを指定します。
-I. -I../../.. -I../../../../../../../idl3つのフォルダが指定されています。
/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs/org/openoffice/test /opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs/ /opt/libreoffice4.3/sdk/idl具体的にはこれら3つのフォルダになります。
/opt/libreoffice4.3/sdk/idlフォルダ以下にはidlファイルで定義したLibreOffice固有のidlファイルが全部入っています。
ImageShrink.idlはorg/openoffice/test/XImageShrinkFilter.idlをインクルードしており、XImageShrinkFilter.idlはorg/openoffice/test/XImageShrink.idlをインクルードしているため/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs/も-Iで指定が必要なわけです。
/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs/org/openoffice/testはコンパイルもとのidlファイルがあるフォルダですがこれもきっと必要なのでしょう。
同様にして8行目でXImageShrinkFilter.idl、11行目でImageShrink.idlをコンパイルしています。
出力先の/home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExampleをみるとちゃんとurdファイルができていますね。
ImageShrink.uno.rdbは次にこれらurdファイルから作るファイルです。
参考にしたサイト
Writing UNO Components - Apache OpenOffice Wiki
デベロッパーズガイドの第3章。
LibreOffice 4.3 SDK - Developer's Guide Examples
SDKに含まれるこの章の例の一覧。
LibreOffice: Main Page
LibreOffice SDK API Reference。バージョンが更新されていくことに注意が必要です。
LibreOffice 4.3 SDK - Development Tools
UNOコンポーネント作成に必要なツール群。
Linuxコマンド集 - 【 mkdir 】 ディレクトリを作成する:ITpro
mkdir -p でパスにあるフォルダを複数作成できます。
0 件のコメント:
コメントを投稿