2023年1月13日金曜日

Google Indexing APIを呼び出す

 Oracle APEXのアプリケーションよりGoogle Indexing APIを呼び出す方法を調べてみました。

ポーランドのPretius社が公開している以下のブログ記事を参考にしています。

https://pretius.com/blog/google-workspace-integration-oracle-database-apex/#integration-service-account

Pretius社はOracle APEX界隈ではとても知名度の高い会社です。昨年(2022年)は、ポーランドのソフトウェアの業界団体(SoDA - Software Development Association Poland)より、“An IT project that supported Ukraine”というカテゴリにて、Oracle APEXを使って作成したアプリケーションにより表彰されています。

https://pretius.com/blog/why-low-code-how-apex-helped-refugees/

Googleが提供しているAPIの認証を通す方法はいくつかあります。Indexing APIは一番設定が簡単な(すなわち安全性が一番低い)APIキーによる認証はできません。

そのため、サービス・アカウントを使ってGoogle Indexing APIを呼び出すことにしました。


Google側の準備


Google Cloudのコンソールは使用経験がほとんど無いため、以下の記載は参考程度と考えてください。

最初にGoogle Cloudのコンソールを開きます。

プロジェクトの選択をクリックし、開いたダイアログ上の新しいプロジェクトをクリックします。


プロジェクト名は任意ですが、ここではmy first api projectとしました。作成をクリックします。


プロジェクトが作成されます。先ほどのプロジェクトの選択のダイアログより、作成されたプロジェクトを開きます。

クイックアクセス(または左上のハンバーガー・メニューを開いて)よりAPIとサービスを開きます。


APIとサービスの画面の、+APIとサービスの有効化をクリックします。

プロジェクト作成直後で15ほど利用可能なAPIとサービスが有効化されていました。使用する予定は無いため、すべて無効化しています。


今回使用する予定のindexing apiを検索します。


検索された結果より、Indexing APIを選択します。


Indexing APIを有効にします。


Indexing APIが有効になります。ウィザード形式で認証情報を作成するためのボタン認証情報を作成がありますが、認証情報はサービス・アカウントとキーを使うことに決めているので、ウィザードは使用しません。

左のメニューより認証情報を開きます。


認証情報の画面より+認証情報を作成をクリックし、サービスアカウントを選択します。


サービスアカウント名サービスアカウントIDサービスアカウントの説明を設定します。任意の値を設定します。

これからの作業で使用するのは、サービスアカウントIDのメールアドレスです。クリップボードにコピーして、保存しておきます。

完了をクリックします。


サービスアカウントが作成されます。鉛筆アイコン(またはサービスアカウント名)をクリックし、編集を開始します。


キー・タブを開き、鍵を追加より新しい鍵の作成を実行します。


キーのタイプとしてP12(PKCS#12形式)を選択し、作成を実行します。この鍵はPL/SQLのパッケージDBMS_CRYPTOで使用するため、PKCS#1またはPKCS#8形式に変更します。JSONが推奨となっていますが、opensslコマンドを使用するため扱いやすいP12を選択しています。

作成をクリックします。


秘密鍵が手元のPCにダウンロードされます。opensslで形式変換する際に、秘密鍵のパスワードを聞かれるため、表示されている秘密鍵のパスワードをクリップボードにコピーし、保存しておきます。

閉じるをクリックします。


ダウンロードされたPKCS#12形式のファイルをPKCS#8形式に変換します。openssl pkcs12コマンドを使用します。

openssl pkcs12 -in ダウンロードされたファイル -nocerts -nodes -out 出力ファイル

Enter Import Password:には秘密鍵のパスワードを入力します。

以下の例では、秘密鍵をmy-api.keyというファイルに出力しています。

% openssl pkcs12 -in my-first-api-project-*******.p12 -nocerts -nodes -out my-api.key

Enter Import Password: 秘密鍵のパスワード

MAC verified OK

% 


Google Cloudのコンソールでの作業は、以上で終了です。

Google Search Consoleを開き、設定からユーザーと権限を開きます。


ユーザーを追加を実行します。


メールアドレスとして、作成済みのサービスアカウントのメールアドレスを指定します。権限オーナーを割り当てます。

追加をクリックします。


ユーザーの追加が確認されたら、Google Search Consoleでの作業は完了です。


Autonomous Databaseでの作業に移ります。

Oracle Database 19cより追加されたDBMS_CRYPTO.SIGNを使用します。Autonomous Databaseでは利用可能です。

JSON Web Tokenを作成するファンクションと作成したJWTを使ってトークンを取得するために使用するパッケージUTIL_GOOGLE_APIを作成します。

コードは以下になります。データベースで実行します。


SQLコマンドよりGoogle Indexing APIを発行し、動作を確認します。秘密鍵やサービスアカウントのメールアドレスの部分は置き換えます。


JSONのレスポンスが正常に返されていれば、すべての作業は完了です。


以上で動作確認も完了です。

実際には、データベースのどこかに秘密鍵を安全に保存する必要もあり、また、生成したJWTや取得したトークンをキャッシュしておくといった実装も必要になるかと思います。

本記事は以上になります。

2023年1月12日木曜日

XLIFFファイル翻訳支援アプリの作成(5) - アプリケーションの翻訳

 APEXアプリケーションの翻訳を支援するアプリケーションを作成したので、実際にアプリケーションの翻訳作業を実施してみます。

一言でAPEXアプリケーションの翻訳といってもいっても考慮すべきことは沢山あります。今回はアプリケーション作成ウィザードが生成するラベルを、APEXがあらかじめ翻訳しているテキストを使って翻訳することにより、基本的な作業の流れを確認します。

Oracle APEXに含まれている翻訳済みテキストが、表CWR_MESSAGESに保存済みであることを前提とします。

最初に作成したアプリケーションXLIFF Translateのコピーを作成します。

タスクよりこのアプリケーションのコピーを実行します。


新規アプリケーション名Global XLIFF Translateに変更します。

へ進みます。


アプリケーションのコピーを実行します。


アプリケーションのコピーが作成されます。このコピーしたアプリケーションに含まれるラベルを英語から日本語に翻訳します。

現在は、ラベルは英語ですがアプリケーションのプライマリ言語は日本語になっています。アプリケーション定義を開きます。


グローバリゼーションアプリケーションのプライマリ言語日本語(ja)から英語(en)に変更します。また、アプリケーション言語の導出元セッションに変更します。

変更の適用をクリックします。


共有コンポーネントグローバリゼーションアプリケーション翻訳を開きます。


翻訳方法を上から順番に実行してきます。テキストの翻訳の作業に本記事で作成したXLIFFファイル翻訳支援アプリケーションを使います。


アプリケーション言語の定義を実行します。

アプリケーション言語マッピングを作成します。作成をクリックします。


アプリケーションの翻訳はAPEXの内部では異なるアプリケーションとして作成されます。そのため、翻訳アプリケーションとして未使用のアプリケーションIDを指定します。

言語日本語(ja)を選択します。今回はプライマリ言語アプリケーションの言語を英語(en)にしていますが、アプリケーションを日本語で作成し、そのアプリケーションに対して英語のアプリケーション言語マッピングを作成することもできます。必ずしも、英語から他言語に翻訳する必要はありません。


日本語のアプリケーション言語マッピングが作成されました。


続いて、翻訳可能なテキストのシードを実行します。

作成したアプリケーション言語マッピング(今回は日本語(ja))にチェックを入れシードを実行します。プライマリのアプリケーションに含まれる翻訳可能なテキストが、日本語を保持するアプリケーションにコピーされます。


翻訳可能なテキストが正常にシードされました。とメッセージが表示されることを確認します。


XLIFF翻訳ファイルのダウンロードを実行します。

今回はアプリケーション全体を翻訳するため、完全なアプリケーション用のXLIFFファイルのダウンロードを実行します。

言語として日本語(ja)を選択します。XLIFF翻訳支援アプリケーションはXLIFFファイルにtarget要素が含まれていることを想定しているため、XLIFFターゲット要素を含めるチェックを入れますエクスポートとしてすべての翻訳可能な要素を選択します。

以上を設定し、アプリケーションのXLIFFファイルのエクスポートを実行します。


XLIFFファイル翻訳支援アプリケーション(コピー前のアプリケーション)を実行し、エクスポートされたXLIFFファイルを翻訳します。

アプリケーションを実行し、エクスポートされたXLIFFファイルをアプリに取り込みます。その後、翻訳作業を行うページを開きます。


Load From SourceBatch TranslateStore As Resultの順でボタンをクリックします。


XLIFF Filesのページに戻り、Xliff Resultダウンロードします。APEXに含まれている翻訳済みのテキストに使って翻訳されたXLIFFファイルがダウンロードされます。


アプリケーション・ビルダーに戻り、XLIFF翻訳ファイルの適用を実行します。

ファイルのアップロードをクリックし、XLIFF翻訳支援アプリよりダウンロードしたファイルをアップロードします。


翻訳済みのXLIFFファイルを選択し、アップロードを実行します。


アップロードされたファイルにチェックを入れ、翻訳に適用として作成したアプリケーション言語マッピング(この場合、日本語(ja)へのマッピング)を選択します。

チェックした項目の適用をクリックし、XLIFFファイルの内容を翻訳アプリケーションに適用します。


ファイルは適用されました。と表示されます。


最後に翻訳済アプリケーションのパブリッシュを実行します。

最新の翻訳を反映した言語にチェックを入れ(今回は日本語(ja))、パブリッシュをクリックします。


アプリケーションが正常にパブリッシュされました。と表示されると、アプリケーションの翻訳作業は完了です。


アプリケーションに変更を加えた場合は、これまでに実行したシードからパブリッシュまでの一連の作業を繰り返します。

翻訳したアプリケーションを実行し、結果を確認します。

アプリケーションを実行すると、サインインの画面が開きます。この画面は英語です。

今の所、アプリケーションの言語を変更する方法が実装されていません。そのため、セッション・オーバーライドを使って言語を変更します。開発者ツール・バーのSessionからSession Overridesを呼び出します。


Session Overridesアプリケーション言語ONにし、日本語(ja)を選択します。

Saveをクリックします。


サインイン画面はアプリケーション作成ウィザードによって生成されるので、そのラベルもほとんどは標準のテキストです。そのため、概ね画面上のテキストは日本語に置き換えられています。


MessagesNameCreateといったラベルはそれぞれメッセージ名前作成に置き換えられています。


アプリケーション作成ウィザードによって作成されたボタンについても、ラベルは取消削除変更の適用に置き換えられています。


最後にログイン画面に言語セレクタを追加します。

ページ・デザイナにてページ番号9999のページLogin Pageを開きます。

リージョンXLIFF Translateのサブ・リージョンとしてリージョンを作成します。

識別名前Language SelectorタイプPL/SQL動的コンテンツ[レガシー]を選択します。レガシーのタイプはデフォルトでは選択リストに現れないため、レガシーを表示...を最初に選択します。

ソースPL/SQLコードとして以下を記述します。

APEX_LANG.EMIT_LANGUAGE_SELECTOR_LIST;

外観テンプレートとしてBlank with Attributesを選択します。


以上の変更を実施しアプリケーションを再度実行すると、ログイン画面に言語セレクタが現れます。


しかし、日本語をクリックして表示されるログイン画面には言語セレクタがありません。


アプリケーションの変更を翻訳されたアプリケーションに反映させるには、シードからパブリッシュまでの作業を繰り返します。

今回は言語セレクタの追加だけなので、シードとパブリッシュだけを実行することで日本語のログイン画面に言語セレクタが反映されます。


今の所、言語セレクタを生成するプロシージャAPEX_LANG.EMIT_LANGUAGE_SELECTOR_LISTは、レガシーのPL/SQL動的コンテンツでしか使用できません。新しく提供されたリージョン・タイプである動的コンテンツに対応したAPIの提供が望まれます。

動的コンテンツを使用するのであれば、以下のようなコードがワークアラウンドになるでしょう。


Oracle APEXのアプリケーションを翻訳する方法の簡単な紹介は以上になります。

Oracle APEXのアプリケーション作成の参考になれば幸いです。

XLIFFファイル翻訳支援アプリの作成(4) - 翻訳済みテキストの活用

 Oracle APEXには10言語(ドイツ語、英語、スペイン語、フランス語、イタリア語、ブラジル - ポルトガル語、繁体中国語、簡体中国語、日本語、韓国語)の翻訳済みテキストが含まれています。

APEXの翻訳済みのメッセージは、APEXがインストールされているスキーマにある表WWV_FLOW_MESSAGES$に保存されています。これは内部表で、Autonomous Databaseでは直接アクセスすることはできません。標準ビューも提供されていないため、翻訳済みメッセージはオンプレミスのインスタンスにインストールしたAPEXから取り出す必要があります。

Oracle Database Express Editionなどを使ってOracle APEXの環境を作成し、メッセージを取り出すことにします。このような環境がすでに作成済みとして、作業を進めていきます。

最初にSYSまたはSYSTEMにて、データベースに接続します。

APEXがインストールされているスキーマはAPEX_バージョン番号となっています。先頭3桁ばメジャー、後ろ3件がマイナー・バージョンです。APEX 22.2の場合、APEX_220200となります。

current_schemaをAPEX_220200に変更します。

alter session set current_schema = apex_220200;

SQL> alter session set current_schema = apex_220200;


Session altered.


SQL> 


APEXのワークスペース・スキーマがAPEXDEVとして作成済みとします。表WWV_FLOW_MESSAGES$のコピーをAPEXのワークスペース・スキーマに作成します。

create table apexdev.apex222_messages as select * from wwv_flow_messages$;

SQL> create table apexdev.apex222_messages as select * from wwv_flow_messages$;


Table created.


SQL> 


表WWV_FLOW_MESSAGES$のコピーがAPEX222_MESSAGESとして作成されました。

APEXのワークスペースにサインインし、SQLワークショップユーティリティデータ・ワークショップを開きます。

データのアンロードを実行します。


アンロードする形式として、より安全なXML形式を選択します。


アンロード対象のとして先ほど作成したAPEX222_MESSAGESを選択します。列として最低限NAMEMESSAGE_LANGUAGEMESSAGE_TEXTを選択します。

以上を設定し、データのアンロードを実行します。


ファイルapex222_messages.xmlがダウンロードされます。

メッセージのインポート先のインスタンスに作成されているAPEXワークスペースにサインインし、先ほどと同様にデータ・ワークショップを開きます。

今回はデータのロードを実行します。


先ほどダウンロードしたファイルapex222_messages.xmlを、ファイルとして選択します。


ロード先新規表表名APEX222_MESSAGESを指定します。ここで作成する表のデータを表CWR_MESSAGESに投入します。


データのロードが完了したら、データ・ワークショップでの作業は終了です。


以前のバージョンのテキストが投入済みである場合は、最初に表CWR_MESSAGESより削除します。

delete from cwr_messages where name in (select name from apex222_messages);


APEX 22.2に含まれているメッセージを表CWR_MESSAGESに移入します。

insert into cwr_messages(name, message_language, message_text) select name, message_language, message_text from apex222_messages;


以上で、Oracle APEXに含まれている翻訳済みテキストを、表CWR_MESSAGESに投入できました。

最後の記事では、本記事で作成したXLIFFファイル翻訳支援アプリケーション自体を、表CWR_MESSAGESに投入したAPEXの翻訳済みのテキストを使用して翻訳してみます。

続く