Philipp Hartenfellerさんが、彼のブログに以下の記事を載せています。
Oracle APEX anchored inline popups for data input2023年1月26日木曜日
カスタム属性data-parent-elementを使ったインライン・ポップアップの実装
ページ・プロパティのページ・ロード時に実行について
すこし気になったので、ページ・ロード時に呼ばれるJavaScriptの順番を確認してみました。
JavaScript:ファンクションおよびグローバル変数の宣言
生成されるページの先頭部分に<script type="text/javascript">として挿入されます。一番最初に実行されます。
JavaScript:ファイルURL
ファイルおよびグローバル変数の宣言の後に<script src="ファイル名">として、ファイルの読み込みが指定されます。
Document: DOMContentLoadedイベント
document.addEventListener('DOMContentLoaded', (event) => {
console.log('DOM fully loaded and parsed');
});
一番最初にイベントとして発生します。そのため、JavaScriptのファイルURLで指定されるファイル内に記述するか、ファンクションおよびグローバル変数の宣言に含める必要があります。
動的アクションのページのロード
JavaScript: ページ・ロード時に実行
イベント:theme42ready
ユニバーサル・テーマで定義されているイベントです。ユニバーサル・テーマの初期化が終了したときに発生します。
イベント:apexreadyend
APEXとしてページ・ロードが完了したときに発生します。theme42readyより後になります。
Window:loadイベント
window.onload = (event) => {
一番最後に実行されます。
ページ全体が、スタイルシートや画像などのすべての依存するリソースを含めて読み込まれたときに発生します。
2023年1月25日水曜日
リッチ・テキスト・エディタでHTMLを読み込むだけで元のHTMLが変更される
現行のOracle APEXは、リッチ・テキスト・エディタとしてCKEditor5を使用しています。
このエディタは読み込んだHTMLを編集するのではなく、一旦、内部的なモデルに従ったデータに変換し、変換したデータを編集します。HTMLからCKEditor5のモデルに変換する処理をUpcast conversionと呼んでいます。モデルからHTMLに変換する処理はDowncast conversionです。マークダウンの場合でも同様に、Upcast conversionでマークダウンから内部モデルに変換、Downcast conversionでモデルからマークダウンに変換しています。
このような仕組みなので、CKEditor5で記述していると危険なHTMLの記述が含まれる可能性は低く、より安全であるといえます。
しかし、生成されるHTMLはCKEditor5のGUIの機能に制限されますし、他のツールで記述したHTMLもCKEditor5を通すと、CKEditor5のモデルで表現できない部分は削除されます。
ただしこれでは使いにくい場合もあるため、Oracle APEX 22.2の新機能として、リッチ・テキスト・エディタにプロパティとしてカスタムHTMLの許可(Allow Custom HTML)が追加されました。HTMLに記述されている属性(Attributes)、クラス(class)、スタイル(style)が保存の対象となっています。初期化JavaScriptファンクションを記述することにより、詳細な制御も可能です。
CKEditor5によって保存されるHTMLを確認するためのAPEXアプリケーションを作成しました。
https://apex.oracle.com/pls/apex/r/japancommunity/ckeditor5-test/
一番下のページ・アイテムP1_SOURCEに以下のHTMLを記述し、ボタンSave P1_SOURCEをクリックします。
<span class="u-danger">u-dangerを設定したテキスト</span>
リッチ・テキスト・エディタのプロパティカスタムHTMLの許可をONにしていると、classが削除されないためu-dangerの指定通りバックグランドが赤く表示されます。そうでない方のリッチ・テキスト・エディタでは、class指定は無視されます。
2023年1月24日火曜日
OpenAI Whisperを使った文字起こしアプリの作成(5) - ブラウザからの音声入力
ブラウザで音声を録音し、そのデータを使って直接WhisperのAPIを呼び出して文字起こしをした結果を、ページ・アイテムに設定する実装を追加してみました。
以下のような動作になります。
Startボタンを押してからStopボタンを押すまでに、結果としてTextに文字起こしされる言葉を録音しています。
次に共有コンポーネントの静的アプリケーション・ファイルを作成します。
ファイル名はpage-actions.jsとします。内容は以下になります。今回は記述するJavaScriptのコードを、ひとつのファイルにまとめています。
参照はコピーしておきます。
ページ・デザイナにて、ホーム・ページを開きます。
JavaScriptのファイルURLを設定します。
音声レコーダーとなるリージョンと、START、STOP、TRANSCRIBEの3つボタンを作成します。
リージョンを作成します。
識別のタイトルはAudio Playerとします。タイプに静的コンテンツを選択し、ソースのHTMLコードとして以下を記述します。
<audio id="player" controls></audio>
リージョンの修飾を最小限にするため、外観のテンプレートとしてBlank with Attributesを選択します。
同様に、Whisper APIを呼び出し文字起こしを実行するボタンTRANSCRIBEを作成します。
動作の指定である詳細のカスタム属性は、以下の記述になります。
data-action="#action$whisper-transcribe?target=P1_TEXT&url=&G_TRANSCRIBE_URL."
以上で実装は完了です。アプリケーションを実行すると、最初のGIF動画のように動作します。
例えば日報を音声入力するとしても、いちいちファイルに保存するのは現実的ではないと感じたので、JavaScriptで実装してみました。以前に紹介したアプリケーションのエクスポートは置き換えています。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完
OpenAI Whisperを使った文字起こしアプリの作成(4) - APEXアプリの作成
Whisperによる文字起こしを行うAPIが作成できました。このAPIを呼び出すAPEXアプリケーションを作成します。
作成したアプリケーションは、以下のように動作します。
アプリケーション作成ウィザードを起動します。
名前はWhisper Transcribeとします。すべての機能はデフォルトで作成されるホーム・ページに実装します。そのため、設定は変更せずにアプリケーションの作成を実行します。
アプリケーションが作成されます。
ページ・デザイナにてホーム・ページを開きます。
最初に音声ファイルを指定するページ・アイテムを作成します。
Bodyにページ・アイテムを作成します。
識別の名前はP1_FILE、タイプとしてファイル参照...を選択します。
設定のファイルをパージするタイミングとして、End of Requestを選択します。セッション・ステートのストレージとしてリクエストごと(メモリーのみ)を選択します。
音声ファイルのアップロードとAPI呼び出しによる文字起こしは、1回のHTTPリクエストで完結します。そのため、アップロードした音声ファイルを処理完了後に保持する必要はありません。
音声ファイルのアップロードと文字起こしを実行するボタンを作成します。
作成したボタンのボタン名はSUBMIT、ラベルはSubmitとします。動作のアクションはデフォルトでページの送信になります。
作成したプロセスの識別の名前はTRANSCRIBE、タイプとしてAPIの呼出しを選択します。設定のパッケージとしてUTL_WHISPER、プロシージャまたはファンクションとしてTRANSCRIBEを選択します。
サーバー側の条件のボタン押下時にSUBMITを選択し、ボタンが押されたときにUTL_WHISPERのプロシージャTRANSCRIBEが呼び出されるようにします。

















































