2023年6月29日木曜日

いろいろなQRコードの生成方法

 最近のAPEXのOffice HourでOracle Database 23cから使用できるサーバー側のJavaScriptの使い方を紹介しています。

APEX 23.1 and server-side JavaScript: Explore the power of GraalVM/MLE
https://asktom.oracle.com/pls/apex/asktom.search?oh=20943

このセッションの中で、QRコードを生成する機能をサーバー側のJavaScriptモジュールとして作成し、APEXのアプリケーションでQRコードを生成しています。

なんとなくQRコードを生成するには、Oracle Database 23cのMLEが必要と誤解されそうな気がしたので、QRコードの生成方法をいくつか紹介します。

QRコードを生成する方法として、大きく3通りあります。
  1. ブラウザ側のJavaScriptで生成する。
  2. サーバー側のPL/SQLで生成する。
  3. サーバー側のJavaScriptで生成する。(これがDB 23cより可能になった)
アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前QR Codeとします。


アプリケーションが作成されたら、ページを作成してそれぞれの実装を行います。


ブラウザ側のJavaScriptで生成する



ブラウザ側のJavaScriptの処理でQRコードの生成を行います。以下のように動作します。


空白ページを作成します。ページ名はBrowser JSとします。

QRコードの生成には、以下のライブラリを使用します。
https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode#MIN#.js

ページ・プロパティJavaScriptファイルURLに、上記のURLを記載します。また、ファンクションおよびグローバル変数の宣言に以下を記述します。

var qrcode = null;


QRコードにエンコードする文字列を与えるページ・アイテムを作成します。

識別名前P2_SOURCEタイプテキスト・フィールドラベルSourceとします。


QRコードの生成を行なうボタンを作成します。

識別ボタン名GENERATEラベルGenerateとします。動作アクションとして動的アクションで定義を選択します。


生成したQRコードを表示するリージョンを作成します。

識別タイトルQR Codeタイプ静的コンテンツソースHTMLコードとして以下を記述します。

<div id="qrcode"></div>


ボタンGENERATEを押した時に、P2_SOURCEからQRコードを生成する処理を実装します。

ボタンGENERATE動的アクションを作成します。

名前onClick Generateタイミングはボタンのデフォルトである、イベントクリックで実行されます。


TRUEアクションJavaScriptコードの実行を選択し、設定コードに以下を記述します。



以上で実装は完了です。


サーバー側のPL/SQLで生成する



QRコードを生成するPL/SQLのパッケージを作成し、それを呼び出してサーバー側でQRコードを生成します。


パッケージは以下より入手します。
https://github.com/zorantica/plsql-qr-code

package以下にZT_QR.pksZT_QR.pkbがあります。ぞれぞれパッケージZT_QRの定義部と本体です。
https://github.com/zorantica/plsql-qr-code/tree/master/package

APEXのアイテム・プラグインも提供されていますが、今回は(リージョンにQRコードを表示するため)プラグインは使いません。ページ・アイテムにQRコードを表示する場合は、プラグインを活用できます。

ZT_QR.pks、ZT_QR.pkbは、SQLワークショップSQLスクリプトを使ってアップロードと実行を行います。


パッケージZT_QRの作成ができたら、準備は完了です。

空白ページを作成します。ページ名Server PL/SQLとします。

先ほどのブラウザ側のJavaScriptと同様に、エンコードする文字列を与えるページ・アイテムをP3_SOURCEとして作成します。


同様に、QRコードを生成するボタンをGENERATEとして作成します。


QRコードを表示するリージョンを作成します。

識別名前QR Codeタイプ動的コンテンツソース言語としてPL/SQLを選択し、CLOBを返すPL/SQLファンクション本体として以下を記述します。

ZT_QR.F_QR_AS_HTML_TABLEを呼び出し、QRコードとなるイメージを生成しています。

送信するページ・アイテムとしてP3_SOURCEを指定します。


ボタンGENERATEを押した時に、リージョンQR Codeがリフレッシュされるようにします。

ボタンGENERATEに動的アクションを作成します。

名前onClick Generateとします。タイミングはボタンのデフォルトです。


TRUEアクションとしてリフレッシュを選択します。影響を受ける要素選択タイプリージョンリージョンとしてQR Codeを選択します。


以上で実装は完了です。


サーバー側のJavaScriptで生成する



サーバー側のJavaScriptの処理でQRコードの生成を行います。Oracle Database 23cとOracle APEX 23.1が必要です

以下のように動作します。


QRコードを生成するJavaScriptのライブラリからMLEモジュールを作成します。その後、MLE環境を作成し、作成したMLEモジュールをインポートします。

SQLワークショップオブジェクト・ブラウザを開き、MLEモジュール - JavaScriptを作成します。


MLEモジュールの名前QRCODEとします。バージョンの指定は不要ですが、ここでは1.4.4を入力しています。

ソース・タイプとしてURLを選択し、URLとして以下を指定します。

https://cdn.jsdelivr.net/npm/qrcode-generator@1.4.4/+esm

MLEモジュールの作成をクリックします。


MLEモジュールQRCODEが作成されます。


MLE環境の作成を実行します。


環境名QRCODEENVとします。MLE環境の作成を実行します。


MLE環境QRCODEENVが作成されます。インポートの追加をクリックし、MLEモジュールQRCODEをインポート対象に追加します。


モジュール所有者APEXのワークスペース・スキーマを選択します。モジュール名QRCODEインポート名qrcodeとします。

作成をクリックします。


インポートが作成されます。


以上で、QRコードを生成する処理をJavaScriptのコードから呼び出すことができるようになりました。

動作を確認してみます。

SQLワークショップSQLコマンドを開き、言語としてJavaScript(MLE)環境としてQRCODEENVを選択します。

以下のコードを実行します。


結果としてdata:image/gif;base64,で始まる文字列が表示されれば、MLEモジュールと環境は正しく作成されています。


APEXアプリケーションから、作成したMLEモジュールQRCODEを呼び出せるようにするため、ML環境を設定します。

アプリケーション定義セキュリティを開き、データベース・セッションMLE環境としてQRCODEENVを設定します。


以上で、APEXアプリケーションにQRコードの生成を実装する準備ができました。

空白ページを作成します。ページ名Server JSとします。

今までの実装と同様に、エンコードする文字列を与えるページ・アイテムをP4_SOURCEとして作成します。


QRコードを生成するボタンをGENERATEとして作成します。動作アクションページの送信とします。


QRコードを表示するページ・アイテムを作成します。ページ・アイテムのイメージの表示は、先ほどのテストで出力されたdata:image/gif;base64,で始まる文字列をイメージとして表示します。

識別名前P4_QRタイプイメージの表示ラベルQRとします。設定基準としてImage URL stored in Page Item Valueを選択します。外観テンプレートとしてHiddenを選択します。


プロセス・ビューを開き、QRコードを生成するプロセスを作成します。

識別名前Generate QR Codeタイプコードを実行とします。

ソース言語としてJavaScript (MLE)を選択し、JavaScriptコードに以下を記述します。


サーバー側の条件ボタン押下時としてGENERATEを指定します。


以上で実装は完了です。

それぞれ簡単に実装できる方法を選んでいます。QRコードの生成自体はJavaScriptやPL/SQLのパッケージによって行われているため、ボタンのクリック以外でもQRコードの生成を呼び出すことはできます。

QRコードの生成方法の紹介は以上になります。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/sample-qrcode-generation.zip

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

デジタル庁のイラストレーション・アイコン素材を使用する

 デジタル庁よりイラストレーション・アイコン素材が提供されています。配布の目的や利用方法、利用規約などは、デジタル庁のイラストレーション・アイコン素材の紹介記事に記載されています。

この記事の最後の方にダウンロードして使うというセクションがあり、イラストレーション・アイコン素材をzip形式でダウンロードすることができます。designsystem-assets.zipという名前で、素材を含んだZIPファイルがダウンロードされます。

このファイルに含まれるイラストレーションおよびアイコンを、Oracle APEXのアプリケーションで使用してみます。

アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。

素材のファイルはワークスペース内のすべてのアプリケーションから参照できるように、静的ワークスペース・ファイルとして作成する予定です。しかし、なぜか、静的ワークスペース・ファイルはアプリケーションの共有コンポーネントに含まれています。そのため、ワークスペースに保存するファイルでもアプリケーションを開いて操作する必要があります。

アプリケーションの名前はデジタル庁 - イラストレーション・アイコン素材とします。

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

アプリケーションが作成されたら、共有コンポーネント静的ワークスペース・ファイルを開きます。


作成済みの静的ワークスペース・ファイルが一覧されます。ファイルの作成をクリックします。


コンテンツとしてデジタル庁よりダウンロードしたファイルdesignsystem-assets.zipを選択します。ファイルの解凍オンにすることで、ZIPファイルに含まれるファイルを静的ワークスペース・ファイルとして参照できるようにします。

今回は、ディレクトリは特に指定しません。designsystem-assets.zipを展開するとファイルはすべてディレクトリdesignsystem-assets以下に作成されます。使い方によっては、ディレクトリを指定した方がよいでしょう。ファイルの文字セットUnicode(UTF-8)とします。

以上で作成をクリックします。

ZIPファイルのアップロードと解凍には、手元の時計で2分くらいの時間がかかりました。


作成された静的ワークスペース・ファイルを一覧します。


LICENSE.txtを含む、色々なファイルが作成されていることが確認できます。


ファイルの内容を確認するために、ページを作成して画像を一覧します。

イラストレーションのPNG画像を一覧するページを作成します。スマート・フィルタとカード・リージョンを使います。

ページの作成をクリックします。


スマート・フィルタを選択します。


ページ定義名前イラストレーションとします。データ・ソースソース・タイプとしてSQL問合せを選択し、SQL SELECT文を入力に以下を記述します。

へ進みます。


表示形式としてカードを選択します。

列FILE_NAME、FILE_NAME_SHORT、FILE_NAME_LONGは重複の無い一意の文字列ですし、列MIME_TYPE、FILE_CHARSETはすべて同じ値です。そのため、すべてのフィルタのチェックを外します

スマート・フィルタでは、文字列検索のみを行います。

へ進みます。


カード・レイアウトとしてグリッドタイトル列FILE_NAME_SHORT(Varchar2)を選択します。

ページの作成をクリックします。


ページが作成されます。いくつかの設定を調整します。

スマート・フィルタのフィルタP2_SEARCHを選択し、ソースデータベース列FILE_NAME_SHORTに限定します。

デフォルトでは検索可能なすべての列が指定されています。


カード・リージョン検索結果属性を開きます。

カード主キー列1としてWORKSPACE_FILE_IDを選択します。

2次本体としてFILE_NAME_LONGを選択します。これは静的アプリケーション・ファイルを直接指定するURLの一部です。

メディアソースとしてBLOB列BLOB列としてFILE_CONTENTを選択します。位置本体外観自動サイズ指定適合を選択します。

BLOB属性MIMEタイプ列としてMIME_TYPE最終更新列としてLAST_UPDATED_ONを選択します。

以上で変更を保存します。


ページを実行すると以下のように表示されます。

イラストレーションの素材の画像と、それをAPEXで参照するための文字列が表示されます。


アイコン素材のSVGについても、スマート・フィルタとカード・リージョンを使って一覧画面を作成します。ページの作成を実行し、スマート・フィルタを選択します。

アイコン素材のページの名前アイコンSQL問合せとして以下を記述します。



以降は、イラストレーションのページと同じ作業を行います。

ページが作成されたら、イラストレーションと同様にフィルタP2_SEARCHソースデータベース列FILE_NAME_SHORTに限定します。

カード・リージョン検索結果属性は、以下のように変更します。

本体拡張フォーマットオンにして、HTML式として&FILE_CONTENT!RAW.を記載します。列FILE_CONTENTとしてSVG要素が記述されており、SVG要素がエスケープされずにHTMLとして解釈されるようにしています。

カード主キー列1としてWORKSPACE_FILE_ID2次本体としてFILE_NAME_LONGを選択します。


ページを実行すると以下のように表示されます。

アイコンの素材の画像と、それをAPEXで参照するための文字列が表示されます。


これらの素材からアイコンやイラストレーションを選んで、APEXのページで使ってみます。

ホーム・ページにアイコンやイラストレーションを表示させます。

最初に、ボタンのアイコンとしてfast_track_line.svgを表示します。fast_track_line.svg参照を確認します。


ホーム・ページ
ページ・プロパティCSSインラインに以下を記述します。



ボタンを作成します。

識別ボタン名FAST_TRACKラベルFast Trackとします。外観ボタン・テンプレートとしてText with Iconを選択し、アイコンとしてfast-track-lineを指定します。


ページを実行すると、以下のようにボタンが表示されます。


イラストレーションl_01_rectangle_white.pngを表示してみます。

参照を確認しておきます。


ページ・アイテムを作成します。

識別名前P1_IMAGEタイプイメージの表示ラベルImageとします。

設定基準としてImage URL stored in Page Item Valueを選択し、デフォルトタイプとして静的静的値として上記の静的ワークスペース・ファイルの参照を記述します。


ページを実行すると、以下のように表示されます。


デジタル庁から提供されているイラストレーション・アイコン素材集を、Oracle APEXで利用する方法の紹介は以上になります。

例えば、画像アドレスをコピーすると確認できますが、静的ワークスペース・ファイルはブラウザからみると静的なファイルと違いがありません。


そのため、静的ワークスペース・ファイル(静的アプリケーション・ファイルも同様)へのアクセスが多い場合は、ファイルをCDNなどに移動するとデータベースへの負荷を下げることができます。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/digital-agency-illustrations-and-icons.zip

静的ワークスペース・ファイル(デジタル庁が提供している素材)は、アプリケーションのエクスポートに含んでいません。

Oracle APEX 22.2からは、コンポーネントのエクスポートとして、静的ワークスペース・ファイルをアプリケーションのエクスポートに含めることができるようになっています。

エクスポートの際にタスクからコンポーネントのエクスポートを呼び出します。


アプリケーションのエクスポートに含めたい静的ワークスペース・ファイルを選択し、エクスポートに追加することができます。


ホーム・ページで使用しているfast_track_line.svg、l_01_rectangle_white.pngに限定すると、以下の選択でアプリケーションのエクスポートにファイルが含まれるようになります。


今回の記事は以上になります。

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