Oracle® Fusion Middleware Oracle WebCenter PortalおよびOracle JDeveloperでのポータルの開発 11gリリース1 (11.1.1.9.0) E49666-05 |
|
![]() 前 |
![]() 次 |
この章では、Oracle JDeveloper環境でのOmniPortletの使用方法について説明します。
この章の内容は、次のとおりです。
OmniPortletウィザードの使用方法の詳細は、『Oracle WebCenter Portalでのポータルの構築』の「OmniPortletの使用」の章を参照してください。
OmniPortletはデータ公開ポートレットであり、Oracle WebCenter Portalのサブコンポーネントとして提供されています。OmniPortletを使用すると、開発者がコードを記述することなく、多様なレイアウトを使用して様々なデータ・ソースからデータを容易に公開できます。OmniPortletは使いやすいウィザードを使用して、設計時にアプリケーションに追加し、実行時にカスタマイズします。OmniPortletのベースには、SQL、XML、Webサービス、スプレッドシート(カンマ区切り)、さらには既存のWebページのアプリケーション・データなど、多様なデータ・ソースを使用できます。このデータは、カスタマイズ可能なチャートや表などの様々なレイアウトで公開できます。図64-1に、OmniPortletを使用して作成されたポートレットの例を示します。
OmniPortletを使用すると、WebCenter Portal Frameworkアプリケーション開発者およびコンポーネント開発者は、次のことができます。
複数ソース(CSV、XML、Webサービス、SQLなど)のデータの表示
表示するデータのソート
多様なレイアウト(箇条書きリスト、チャート、HTMLなど)を使用したデータの書式設定
ポートレット・パラメータの使用
ページ・ビューアへのパーソナライズ可能な設定の公開
パーソナライズされたデータを表示する場合は、データ・ソースから戻された結果をフィルタリングして、取得したデータを絞り込み、保護されたデータのアクセスに使用する資格証明情報をパラメータ化できます。OmniPortletには最初から、表、チャート、HTML、ニュース、箇条書きリストおよびフォームなど、最も一般的なポートレット用のレイアウトが用意されています。
第63章「ポートレットの消費」で説明しているように、OmniPortletは、Oracle JDeveloperで作成されたページに追加できます。OmniPortletは、Oracle JDeveloperとともにインストールされる統合WebLogic Server (統合WLS)内の、事前構成済PortalToolsポートレット・プロデューサに含まれています。
アプリケーションにOmniPortletを追加するには:
統合WLSを起動します。詳細は、第2.2.4項「統合WebLogic Serverの管理」を参照してください。
事前構成済PortalToolsポートレット・プロデューサがまだデプロイされていない場合は、デプロイします。詳細は、第2.4.1.1項「事前構成済ポートレット・プロデューサのデプロイ」を参照してください。
アプリケーションにOmniPortletプロデューサを登録します。詳細は、第63.2.2項「WebCenter Portal FrameworkアプリケーションへのOracle PDK-Javaポートレット・プロデューサの登録」を参照してください。
OmniPortletを対象のJSPXページにドラッグして、アプリケーションに追加します。詳細は、第63.5項「ページへのポートレットの追加」を参照してください。
注意: Oracle JDeveloperでOmniPortletのインスタンスをページに追加する際、ポートレットの「プロパティ・インスペクタ」を開き、AllModesSharedScreen プロパティとRenderPortletInIFrame プロパティが次のように設定されていることを確認します。
|
Oracle JDeveloperでのOmniPortletの構成の詳細は、第64.4項「OmniPortlet構成のヒント」を参照してください。
設計時にOmniPortletをアプリケーションに追加しておくと、アプリケーションをブラウザで実行することにより、コンテンツ、レイアウトおよびその他のオプションをカスタマイズできます。この項では、実行時のカスタマイズに関する大まかな概要を説明します。このポートレットの使用およびカスタマイズ方法の詳細は、『Oracle WebCenter Portalでのポータルの構築』の「OmniPortletの使用」の章を参照してください。
OmniPortletウィザードには最初に、5つの手順が含まれています。OmniPortletを初めて定義するときは、データ・ソース・タイプ、データ・ソース・オプション、フィルタ・オプション、表示オプションおよびレイアウトを設定します。ウィザードのこれらの設定手順を終えた後にウィザードを再開する場合は、ポートレットの「カスタマイズ」リンクをクリックします。ウィザードを再開すると、「ソース」、「フィルタ」、「表示」および「レイアウト」の各タブで定義を変更できます。
注意: IBM Linux on Powerプラットフォームで、OmniPortletの定義時に、アクション・ボタン(「次へ」、「終了」、「取消」)が点の状態に最小化されている場合は、スタック・サイズのシェル制限を無制限にし、WLS_portlet インスタンスを再起動します。スタック・サイズのシェル制限を無制限に設定するには、コマンドprompt> ulimit -s unlimited を実行します。 |
OmniPortletには次の各種データ・ソースを使用できます。
スプレッドシート
SQL
XML
Webサービス
Webページ
OmniPortletでこれらのデータ・ソースを使用する方法の詳細は、『Oracle WebCenter Portalの使用』を参照してください。
この項では、OmniPortletの構成について説明します。OmniPortletウィザードの詳細は、第64章「OmniPortletを使用したポートレットの作成」を参照してください。
この項の内容は、次のとおりです。
第64.4.3項「PortalツールおよびWebプロデューサの構成(オプション)」
注意: この項では、OmniPortlet_WAR_DIR は、WebLogic ServerでomniPortlet.war がデプロイされているディレクトリを示します。その正確なパスは、インストールに応じて異なります。このパスを見極めるには、ファイル・システム内でomniPortlet/provider.xml を検索します。たとえば、UNIXでは次のコマンドを実行します。
> find DOMAIN_DIR -name "provider.xml" | grep -i omniportlet
統合WebLogic Server (統合WLSまたはデフォルト・サーバー)では、OmniPortletの JDEV_SYSTEM_DIRECTORY/DefaultDomain/servers/DefaultServer/tmp/_WL_user/portalTools_11.1.1.2.0/RANDOMLY_GENERATED_DIRECTORY/war/WEB-INF/providers/omniPortlet/provider.xml Windowsプラットフォームでは、JDeveloperのシステム・ディレクトリへのパスに空白が含まれている場合、Portal Frameworkアプリケーション内のページはレンダリングされません。したがって、 Fusion Middleware 11gインストールでは、OmniPortletの FMW_HOME/user_projects/domains/wc_domain/servers/WLS_Portlet/tmp/_WL_user/portalTools_version_number/RANDOMLY_GENERATED_DIRECTORY/war/WEB-INF/providers/omniPortlet/provider.xml |
OmniPortletプロデューサがファイアウォールの内側にある場合、OmniPortletがファイアウォールの外側にあるデータ(CSV、XMLまたはWebサービスなど)のURLにアクセスできるように、プロキシ情報を構成する必要があります。そのために、WebLogic Serverを起動するときにコマンドラインでプロキシ情報を設定できます。また、OmniPortlet_WAR_DIR
/WEB-INF/providers/omniPortlet/provider.xml
にあるOmniPortletのprovider.xml
ファイルでプロキシ情報を設定することもできます。
注意: Webサービス・データ・ソースの場合、provider.xml ファイルとコマンドライン・パラメータの両方でプロキシ情報を設定する必要があります。 |
WebLogic Serverを起動するときにコマンドラインでプロキシ情報を設定するには、HTTPプロキシ・ホストを使用している場合は表64-1、HTTPSプロキシ・ホストを使用している場合は表64-2に示すパラメータを設定します。
表64-1 HTTPプロキシ情報コマンドライン・パラメータ
パラメータ | 説明 |
---|---|
|
プロキシ・サーバーのホスト名(OmniPortletプロデューサからそのデータ・ソースにURL接続するためにそれが必要な場合)。 |
|
HTTPプロキシ・ホストのポート番号。 |
|
ローカル・マシンなど、プロキシ・サーバーを迂回して直接接続できる任意のドメインまたはホストの名前。
ホストは、完全修飾ホスト名でもIPアドレスでもかまいません。 |
|
プロキシ・サーバーが認証を必要とする場合にプロキシ・サーバーにログインするためのユーザー。 |
|
プロキシ・サーバーが認証を必要とする場合にプロキシ・サーバーにログインするためのパスワード。 |
|
プロキシ・サーバーの認証タイプ。指定可能な値: |
|
プロキシ・サーバーのレルムの名前。レルムの名前がわからない場合は、プロキシ・サーバーの管理者に問い合せてください。 |
表64-2 HTTPSプロキシ情報コマンドライン・パラメータ
パラメータ | 説明 |
---|---|
|
プロキシ・サーバーのホスト名(OmniPortletプロデューサからそのデータ・ソースにURL接続するためにそれが必要な場合)。 |
|
HTTPSプロキシ・ホストのポート番号。 |
|
ローカル・マシンなど、プロキシ・サーバーを迂回して直接接続できる任意のドメインまたはホストの名前。
ホストは、完全修飾ホスト名でもIPアドレスでもかまいません。 |
|
プロキシ・サーバーが認証を必要とする場合にプロキシ・サーバーにログインするためのユーザー。 |
|
プロキシ・サーバーが認証を必要とする場合にプロキシ・サーバーにログインするためのパスワード。 |
|
プロキシ・サーバーの認証タイプ。指定可能な値: |
|
プロキシ・サーバーのレルムの名前。レルムの名前がわからない場合は、プロキシ・サーバーの管理者に問い合せてください。 |
3つのパラメータとその値の例を次に示します。
-Dhttps.proxyHost=myProxyServer.mycompany.com -Dhttps.proxyPort=80 -Dhttps.nonProxyHosts=localhost|localhost.localdomain|127.0.0.1|
provider.xml
ファイルにプロキシ情報を構成するには、表64-3のパラメータのリストとその説明を参照してください。
表64-3 Provider.xmlのタグ
パラメータ | 説明 |
---|---|
|
OmniPortletプロデューサからそのデータ・ソースへのURL接続を行うために必要な場合、プロキシ・サーバーのホスト名を入力します。 |
|
HTTPプロキシ・ホストのポート番号を入力します。 |
|
プロキシ・サーバーを介さずに直接接続できるドメインまたはホスト名を入力します。ドメイン名は、次の例のように、企業、組織、政府機関などの名前を含むURLの一部です。
ホストは、完全修飾ホスト名でもIPアドレスでもかまいません。 |
|
指定可能な値: プロキシ・サーバーに認証が必要な場合は、trueを入力します。認証パラメータは、 |
proxyType |
指定可能な値: プロキシ・サーバーのタイプを選択します。 BasicまたはDigest認証の詳細は、 |
|
この表で後から説明するログイン情報に従い、ユーザーがアクセスするプロキシ・サーバーのレルムの名前を入力します。レルムの名前がわからない場合は、プロキシ・サーバーの管理者に問い合せてください。 |
|
指定可能な値: true | trueの場合、 |
|
プロキシ・サーバーにログインするユーザー名を入力します。 |
|
指定したユーザー名のパスワードを入力します。プレーン・パスワード・テキストの前に!を付ける必要があります。プロデューサが起動すると、これは |
ファイアウォール外のデータにアクセスするためにプロキシを使用する基本的な例は、次のとおりです。
<proxyInfo class="oracle.portal.provider.v2.ProxyInformation"> <httpProxyHost>www-proxy.example.com</httpProxyHost> <httpProxyPort>80</httpProxyPort> <proxyUseAuth>false</proxyUseAuth> </proxyInfo>
次の例では、プロキシ・サーバーのすべてのユーザーに、ログインおよびBasic認証が必要です。
<proxyInfo class="mycompany.portal.provider.v2.ProxyInformation"> <httpProxyHost>myport.example.com</httpProxyHost> <httpProxyPort>8080</httpProxyPort> <proxyUseAuth>true</proxyUseAuth> <proxyType>Basic</proxyType> <proxyRealm>myport</proxyRealm> <proxyUseGlobal>false</proxyUseGlobal> </proxyInfo>
OmniPortlet SQLデータ・ソースは、OracleデータベースにはOracle JDBCドライバを使用して、ODBCデータ・ソースにはSun MicrosystemのJDBC-ODBCドライバを使用してアクセスするように事前に構成されています。開発者は、DataDirect JDBCドライバを使用して他のリレーショナル・データベースにアクセスできます。
関連項目: サポートされているデータベースのリストは、Oracle Technology Network (http://www.oracle.com/technetwork/index.html )で入手できるOracle Application ServerおよびDataDirect JDBCの動作保証マトリックスを参照してください。 |
この項の内容は、次のとおりです。
WebLogic Serverインストールには、次のDataDirect JDBCドライバが含まれています。
YMutil.jar
YMsybase.jar
YMsqlserver.jar
YMspy.jar
YMinformix.jar
YMdb2.jar
YMbase.jar
これらのDataDirectドライバを使用する予定がない場合は、かわりに目的のデータベースにアクセスするためのDataDirect JDBCドライバをダウンロードできます。これらのドライバは、1つのZIPにパッケージ化されており、次の場所からダウンロードできます。
http://www.oracle.com/technetwork/topics/datadirect-index-091847.html
DataDirect JDBCドライバをインストールするには:
ZIPファイルの中身を一時ディレクトリ(/temp/datadirect
など)に解凍します。
DataDirect JDBCドライバを一時ディレクトリからご使用のWebLogic ServerディレクトリであるWLS_DOMAIN_DIRECTORY/lib
にコピーします。
OmniPortletはWebプロデューサとして実装され、構成プロパティはすべてprovider.xml
ファイルに格納されています。DataDirect JDBCドライバをOmniPortletで使用するには、これらのドライバをprovider.xml
ファイルに登録する必要があります。
新しいDataDirect JDBCドライバを登録するには:
OmniPortlet_WAR_DIRECTORY
/WEB-INF/providers/omniPortlet/provider.xml
ファイルをバックアップして、そのファイルを開きます。
SQLデータ・ソース構成エントリに使用するドライバを追加します。
XMLタグdriverInfo
を検索します。
最後のdriverInfo
タグの後に新しいエントリを追加します。
WebLogic DataDirectドライバのdriverInfoの例を次に示します。
Microsoft SQL Server (デフォルト接続):
<driverInfo class="oracle.webdb.reformlet.data.jdbc.JDBCDriverInfo"> <name>Microsoft SQL Server</name> <sourceDataBase>other</sourceDataBase> <subProtocol>weblogic:sqlserver</subProtocol> <connectString>mainProtocol:subProtocol://databaseName</connectString> <driverClassName>weblogic.jdbc.sqlserver.SQLServerDriver </driverClassName> <dataSourceClassName>weblogic.jdbcx.sqlserver.SQLServerDataSource </dataSourceClassName> <connHandlerClass>oracle.webdb.reformlet.data.jdbc.JDBCConnectionHandler </connHandlerClass> <connPoolSize>5</connPoolSize> <loginTimeOut>30</loginTimeOut> </driverInfo>
Microsoft SQL Server (名前付き接続。たとえば、mycompany.com:port;databaseName=mydb
):
<driverInfo class="oracle.webdb.reformlet.data.jdbc.JDBCDriverInfo"> <name>Microsoft SQL Server</name> <sourceDataBase>other</sourceDataBase> <subProtocol>weblogic:sqlserver</subProtocol> <connectString>mainProtocol:subProtocol://databaseName</connectString> <driverClassName>weblogic.jdbc.sqlserver.SQLServerDriver </driverClassName> <connHandlerClass> oracle.webdb.reformlet.data.jdbc.JDBCODBCConnectionHandler </connHandlerClass> <connPoolSize>5</connPoolSize> <loginTimeOut>60</loginTimeOut> </driverInfo>
Sybase:
<driverInfo class="oracle.webdb.reformlet.data.jdbc.JDBCDriverInfo"> <name>Sybase</name> <sourceDataBase>other</sourceDataBase> <subProtocol>weblogic:sybase</subProtocol> <connectString>mainProtocol:subProtocol://databaseName</connectString> <driverClassName>weblogic.jdbc.sybase.SybaseDriver </driverClassName> <connHandlerClass> oracle.webdb.reformlet.data.jdbc.JDBCODBCConnectionHandler </connHandlerClass> <connPoolSize>5</connPoolSize> <loginTimeOut>30</loginTimeOut> </driverInfo>
DB2:
<driverInfo class="oracle.webdb.reformlet.data.jdbc.JDBCDriverInfo"> <name>DB2</name> <sourceDataBase>other</sourceDataBase> <subProtocol>weblogic:db2</subProtocol> <connectString>mainProtocol:subProtocol://databaseName</connectString> <driverClassName>weblogic.jdbc.db2.DB2Driver </driverClassName> <connHandlerClass> oracle.webdb.reformlet.data.jdbc.JDBCODBCConnectionHandler </connHandlerClass> <connPoolSize>5</connPoolSize> <loginTimeOut>30</loginTimeOut> </driverInfo>
Informix:
<driverInfo class="oracle.webdb.reformlet.data.jdbc.JDBCDriverInfo"> <name>Informix</name> <sourceDataBase>other</sourceDataBase> <subProtocol>weblogic:informix</subProtocol> <connectString>mainProtocol:subProtocol://databaseName</connectString> <driverClassName>weblogic.jdbc.informix.InformixDriver </driverClassName> <connHandlerClass> oracle.webdb.reformlet.data.jdbc.JDBCODBCConnectionHandler </connHandlerClass> <connPoolSize>5</connPoolSize> <loginTimeOut>30</loginTimeOut> </driverInfo>
表64-4では、driverInfo
プロパティのパラメータについて説明しています。
表64-4 driverInfoプロパティのパラメータ
パラメータ | 説明 |
---|---|
|
使用するデータベースの名前。この名前は、「OmniPortlet」ウィザードの「ソース」タブで使用されます。 |
|
内部値。値を |
|
OmniPortletによって使用される、接続文字列を作成するためのJDBCサブプロトコル名。たとえば、 サブプロトコル名のリストについては、この項の最後にあるリンクから、DataDirect JDBCドライバのドキュメントを参照してください。 |
|
接続文字列の書式の説明。DataDirectドライバの場合、書式は次のとおりです。 mainProtocol:subProtocol://databaseName |
|
ドライバ・クラスの名前。様々な値を取得するには、この項の最後にあるリンクを使用して、DataDirect JDBCドライバのドキュメントを参照してください。 |
|
接続プーリングを実装するデータ・ソース・クラスの名前。このパラメータは、OmniPortletリリース9.0.4.1以上でのみ使用可能です。使用するドライバの正しいデータ・ソース・クラス名は、表64-5を参照してください。 |
|
ドライバおよび接続プーリングの管理にOmniPortletで使用されるクラス。値は次のいずれかです。
|
|
接続プールによって開かれる接続の最小数。 |
|
このデータ・ソースが、データベースへの接続を試みる間待機する最大時間(秒)。 |
表64-5では、特定のDataDirect JDBCドライバのdriverClassName
プロパティとdataSourceClassName
プロパティの値を示します。
表64-5 driverClassNameおよびdataSourceClassNameのパラメータと値
サポートされるDataDirectドライバ | プロパティ |
---|---|
Microsoft SQL Server |
パラメータ: 値: |
Sybase |
パラメータ: 値: |
DB2 |
パラメータ: 値: |
Informix |
パラメータ: 値: |
provider.xml
ファイルを保存します。
ポートレット・プロデューサがデプロイされていたOracle WebLogic管理対象サーバー・インスタンスを停止してから起動します。
これを行うには、FMW_HOME
/user_projects/domains/wc_Domain/bin
に移動し、次のコマンドを発行します。
./startManagedWebLogic.sh WC_Portlet
注意: 複数ノード構成(クラスタリングまたはロードバランシング環境など)でOmniPortletを使用している場合、provider.xml ファイルを手動で各ノードにコピーする必要があります。 |
ローカルに構築されたOmniPortletプロデューサおよびカスタムで構築されたWebプロデューサが、中間層環境で適切に機能するようにするには、追加の構成が必要な場合があります。ファイル・システムでOmniPortletまたはその他のWebプロデューサがカスタマイズされている場合、PDK-Javaによって提供されている永続ストア移行およびアップグレード・ユーティリティを使用して、既存のカスタマイズをデータベースに移行し、前のリリースからカスタマイズをアップグレードできます。PDK-Javaの永続ストア移行ユーティリティの詳細は、第60.3.8.2項「PDK-Javaプロデューサの永続ストアの移行」を参照してください。
複数中間層環境でのPortalツール・プロデューサの構成
デフォルトでは、OmniPortletプロデューサはデータベース・プリファレンス・ストアを使用します。これは、追加の構成を必要とせずに複数の中間層環境で機能します。
データベース永続ストアの構成の詳細は、第60.3.8.1項「PDK-Javaプロデューサの永続ストアの設定」を参照してください。
カスタマイズを行ったOmniPortletインスタンスをファイル・システム内で作成済の場合は、永続ストア移行ユーティリティを使用して、これらのカスタマイズをデータベースに移行する必要があります。
この移行ユーティリティを実行するには:
次のコマンドを使用して、WebCenter Portal Oracleホーム・ディレクトリに移動します。
cd WC_ORACLE_HOME
次のコマンドを実行して、OmniPortletデータをファイルベースの永続ストア(FilePreferenceStore
)からデータベース永続ストア(DBPreferenceStore
)に移行します。
java -classpath lib/dms.jar:jdbc/lib/ojdbc14dms.jar:portal/jlib/pdkjava.jar:portal/jlib/ ptlshare.jar oracle.portal.provider.v2.preference.MigrationTool -mode filetodb -pref1UseHashing true -pref1RootDirectory portal/portletdata/tools/omniPortlet -pref2User User_Name -pref2Password User_Password -pref2URL jdbc:oracle:thin:@infra.host.com:1521:orcl
PDK-Javaの永続ストア移行ユーティリティの詳細は、第60.3.8.2項「PDK-Javaプロデューサの永続ストアの移行」を参照してください。
通常、ロード・バランシング・ルーター(LBR)を構成する前に、OmniPortletのHTTPプロキシ構成を実行します。LBRの構成後にこれを行う手順は、次のとおりです。
Portalツールの構成情報は、中間層サーバー上のprovider.xml
ファイルに格納されています。1つの中間層(M1など)で構成を直接更新し、それをLBRがフロントエンド処理を行うすべての中間層に伝播する必要があります。最初に、M1以外の中間層をすべて停止する必要があります。
HTTPプロキシ設定をprovider.xml
ファイルで変更できます。詳細は、第64.4.1項「ファイアウォール外のデータにアクセスするためのOmniPortletプロデューサの構成」を参照してください。
OmniPortlet_WAR_DIR
/WEB-INF/providers/omniPortlet/provider.xmlをM1
からM2
へコピーすることにより、provider.xmlファイルへの変更を、中間層M2に伝播します。
中間層M2を再起動します。
Portal Frameworkアプリケーションでポートレット・プロデューサ登録を更新します。プロデューサ登録URLの最初の部分をhttp://m1.abc.com:7777/
からhttp://lbr.abc.com/
に変更します。
OmniPortletプロデューサが、LBRを介して正常に動作することを、次のURLにあるテスト・ページに移動して確認します。
http://lbr.abc.com/portalTools/omniPortlet/producers/omniPortlet
OmniPortletプロデューサのテスト・ページで、「ポートレット情報」セクションに「使用可能なポートレットはありません」というメッセージが表示された場合、ステップ1でOmniPortletを正しく構成していない可能性があります。OmniPortletが正しく構成されている場合、「OmniPortlet」と「シンプル・パラメータ・フォーム」のポートレットがテスト・ページで利用できます。
注意: OmniPortletのWebページ・データ・ソースを使用するには、Oracle Web Cacheでセッション・バインディングも有効にする必要があります。 |
この項では、OmniPortletの使用中に発生する可能性のある問題のトラブルシューティングに役立つ情報を提供します。
注意: OmniPortletプロデューサはPortal Frameworkアプリケーションと異なる層に存在し、そこで実行されるため、セッション情報にはアクセスできません。OmniPortletがアクセスできるように、XMLファイルをPUBLICとして公開する必要があります。 |
「定義」リンクを使用してOmniPortletを定義できない
実行時にOmniPortletを定義することはできません。
問題
OmniPortletは、true
のRenderPortletInIFrame
値のみをサポートします。これはOmniPortletをIFRAME内でレンダリングする必要があることを意味します。したがって、OmniPortletプロパティRenderPortletInIFrame
をtrue
に設定する必要があります。「プロパティ・インスペクタ」で、RenderPortletInIFrame
プロパティは、「表示オプション」の下にあります。
現時点では、RenderPortletInIFrame
プロパティの値はfalse
です。そのため、実行時に「定義」リンクをクリックしても、「タイプ」タブは表示されず、OmniPortletの定義を進めることができません。
解決方法
OmniPortletを定義するために、「処理」リストから「カスタマイズ」を選択するか、Oracle JDeveloperの「構造」ウィンドウでOmniPortletを選択して、RenderPortletInIFrame
をtrue
に設定します。