LogicDesignerの外部連携を使用して一覧画面を作成する際に気をつけたこと

はじめに

こんにちは。開発部のD.Yです。

今回はLogicDesignerの外部連携を使用して、一覧画面を作成する際に気をつけたことを
紹介します。

実装方法

IM-LogicDesignerでユーザ定義(SQL)を用いたフロー定義を作成し、外部連携を使用して
FormaDesignerのグリッドテーブルで一覧画面を作成する。

気をつけたこと

ユーザ定義(SQL)の「取得範囲の指定」を行い、「取得件数の上限を設ける」ことです。

取得件数の上限を設ける理由としては、一覧画面に表示するデータ量が増えた場合の
処理速度の低下・サーバへの影響を考慮するためです。

実際に取得範囲の指定を使用し、入力パラメータの「limit」に「2000」を設定することで
SQLの取得件数を2000件の上限としました。

また、作成した一覧画面では取得件数の上限を設けたので、
上限以上のデータが表示されていないことが分かるように画面に注釈を加えました。

今回は取得件数の上限のみ使用しましたが、取得位置の設定も同様に入力パラメータの「offset」に設定することで取得位置を指定することができます。

ユーザー定義の設定とマッピングのみで、取得件数の上限や取得位置を指定できるため、
是非活用してください。

取得範囲の指定の方法については、以下の公式ドキュメントを参照ください。
document.intra-mart.jp

おわりに

今回はLogicDesignerの外部連携を使用し、FormaDesignerで一覧画面を作成した際に気をつけたことについて紹介しました。

単に機能を実現するのではなく、処理速度や負荷についてまで意識した実装を
心掛けていきたいと思います。

intra-martでの環境構築時のトラブルシューティング

今回は、intra-martでの環境構築時のメニューインポート時エラーの対処法についてご紹介させていただきます。

メニューインポート後、認可リソース不足で500エラーとなりトップページが開けない場合の対処法です。 メニューはほば全ての画面に設定されているため、エラーが発生すると操作ができなくなります。

500エラー

以下エラーが出力されている場合には認可リソースが不足していることが原因です。

[ERROR] e.http-500 - [] jp.co.intra_mart.foundation.authz.services.ResourceNotFoundException: [E.IWP.AUTHZ.DECISION.10007] リソースグループが登録されていません。

認可リソース不足に関しては、「サイトマップ」→「テナント管理」→「認可」から認可リソースを登録すれば解決します。

※認可設定については以下参照

document.intra-mart.jp

ページが開けない問題に関しては、URLの末尾にimui-theme-builder-module=headwithcontainerをつけてメニューを非表示の設定にすると解決します。

※PageBuilderについては以下参照。

document.intra-mart.jp

そのため、メニューインポート後に認可リソース不足で500エラーとなる場合は、

テナント管理者でログイン後、下記のように認可設定のURLを直接入力し、末尾にimui-theme-builder-module=headwithcontainerをつけ、認可リソースを設定することで解消します。

http://(HOST):(PORT)/(CONTEXT_PATH)/tenant/authz/settings?imui-theme-builder-module=headwithcontainer

※ (HOST)(PORT)(CONTEXT_PATH)は構築された環境によって異なります

おわりに

今回は環境構築時のメニューインポート時エラーの対処法を紹介しました。

私の場合は、不足している認可リソースが多すぎて手動登録では埒が明かず、メニューを一度すべて削除しました。

メニューインポート時は認可設定の確認も怠らないよう、皆さんもお気を付けください。

intra-martの設定項目について

はじめに

こんにちは。開発部のS.Rです。

今回の記事は、
intra-mart の開発時に覚えておくとよい設定項目について
簡単にご紹介させていただきます。

開発上級者の方にはもうすでに頭に入っていることと思いますが、
初学者の方はぜひ頭に入れていってくださいね。

ログ関連

目的:ログの保存先変更

  • 設定場所 WEB-INF/conf/log/im_logger.xml
  • タグ名  file
  • 備考   初期設定項目に含まれる文字”${im.log}”はWEB-INF/conf/server-context-config.xmlのタグ(log-directory)で設定されています。

ストレージ関連

目的:ストレージの保存先変更

  • 設定場所 WEB-INF/conf/storage-config.xml
  • タグ名  root-path-name

メール関連

目的:SMTPサーバ接続先の変更

  • 設定場所 WEB-INF/conf/javamail-config/javamail-config.xml
  • タグ名  smtp

DB関連

目的:シェアードデータベース接続先の変更

  • 設定場所 WEB-INF/conf/data-source-mapping-config.xml
  • タグ名  shared-data-source

その他

目的:ベースURLの変更

  • 設定場所 WEB-INF/conf/server-context-config.xml
  • タグ名  base-url

目的:セッションタイムアウトまでの時間変更

  • 設定場所 WEB-INF/resin-web.xml
  • タグ名  session-timeout
  • 備考   単位は分です。

目的:共通マスタ(ユーザ)検索でのあいまい検索可否変更

  • 設定場所 WEB-INF/conf/im-master-config.xml
  • タグ名  fuzzy-string-search
  • 備考   検索ができないパターンがあります。詳細はこちらを参照ください。

おわりに

設定ファイルを自在に操れるようになると、開発効率も上がります。 積極的に覚えていきましょう!

document.intra-mart.jp

intra-mart機能紹介 - Googleカレンダー連携について

はじめに

初めまして。システム開発部所属のO.Yです。

本日はintra-mart Accel Collaboration(以下iAC)の便利な機能である Googleカレンダー連携について紹介します。

iACのスケジュールカレンダーにGoogleカレンダーを連携するためには、Google側での設定とintra-mart側での設定がそれぞれ必要となります。
次章からは実際の設定方法について説明します。

Google側での設定

始めに以下のiACの操作ガイドを参考にしてOAuthクライアントIDの作成と、Google Calendar APIの有効化を行います。

document.intra-mart.jp
ここで作成したクライアントID及びクライアントシークレットについては次章で入力する必要があるため控えておきましょう。
なお、ナビゲーションメニューより「APIとサービス」-「認証情報」へ遷移し、作成したクライアントIDをクリックすることで、クライアント情報の確認が可能です。

intra-mart側での設定

1. Google OAuth2.0 認証クライアント設定
前章で作成したGoogleクライアントIDの認証情報をiACに設定します。
サイトマップから、「コラボレーション」-「個人設定」-「Google OAuth認証クライアント設定」をクリックし、Google OAuth2.0 認証クライアント設定画面に遷移します。
ClientID欄及びClient secret欄に作成したクライアントIDと生成されたクライアントシークレットを入力し、保存ボタンをクリックします。
Googleアカウントにログインするダイアログが表示されるため、スケジュールを連携するアカウントを選択してログインします。

2. 外部連携設定
「コラボレーション」-「個人設定」-「スケジュール表示設定」をクリックし、スケジュール表示設定画面に遷移します。

外部連携設定欄のカレンダー名称をクリックすると外部連携編集ダイアログが開くので、カレンダーID欄に今回共有するGoogleスケジュールの予定表のカレンダーIDを入力します。

外部連携設定

カレンダーIDはGoogleカレンダーの予定表の「設定と共有」をクリックした遷移先のページから確認することが可能です。

「設定と共有」をクリック

必要項目を入力後、OKボタンをクリックして編集画面を閉じます。 この時点では設定情報が保存されていないため、必ず画面下部にある保存ボタンをクリックして設定内容を保存することをお忘れなく。

3. スケジュール表示設定
ここまでくればカレンダー連携自体は完了しているため、最後に連携したスケジュールをカレンダーに表示させましょう。
「コラボレーション」-「スケジュール」-「スケジュール カレンダー」をクリックしてスケジュール画面を開きます。
「操作」-「表示するスケジュールの種類を選択する」をクリックし、スケジュール表示設定ダイアログを開きます。
スケジュール表示設定ダイアログを開くと、先ほどの外部連携設定で設定したカレンダーが追加されているため、チェックマークをクリックして有効にします。
予定表の背景色をデフォルトから変更して差別化するのをお勧めします。

スケジュール表示設定ダイアログ

最後に保存ボタンをクリックすれば、スケジュール表示設定の更新が完了し、カレンダーに連携した予定表のスケジュールが表示されるようになります。

余談

今回はGoogleカレンダーに登録されているスケジュールをiACのカレンダーに連携しましたが、GSOLのオープンソースであるiACカレンダー連携(iCal連携)を用いることで、GoogleカレンダーOutlookなどのiCalendar形式に対応しているアプリケーションに対して、iAC上に登録されているスケジュールを連携することが可能になります。

global-solutions.co.jp

QRコードを読み取るだけでスマホでもintra-martのスケジュールが見れるので、出先でスケジュールを確認したい場合などに有用です。
用途に合わせてこちらについても検討してみてはいかがでしょうか。

最後に

以上でintra-mart Accel CollaborationのGoogleカレンダー連携機能についての紹介を終わります。

SelenideでのBISのテストコード実装について(WF処理画面)

Selenideを利用したテストコードで、BISの申請処理を作成した時にハマったところを紹介します。

テストの内容とハマったところ

テストコードで行う操作としては以下の通りです。

  • 画面入力後、申請ボタンをクリック
  • 動的承認者を設定
  • 標準処理画面の申請ボタンをクリックして、申請を実行する

テストコードを実装してみたところ、
申請ボタンをクリックした後に表示される標準処理画面で操作が止まってしまい、エラーとなっていました。
またログを見ると「NoSuchElementException」が発生しており
操作しようとしていた要素がSelenideからは見つけることができないようでした。

原因調査と解決方法

Selenideはエラー発生時にスクリーンショットとHTMLファイルを保存する機能があります。
保存されたHTMLファイルとブラウザ上で表示させたHTMLを見比べてみたところ、HTMLファイルには処理画面のHTMLが存在しませんでした。
また、処理画面のHTMLをよく見てみると、iframeで実装されているようでした。
何か特殊な操作が必要なのかと思い、iframeとSelenideについて検索してみたところ、
以下のページが見つかり、iframeの切り替えが必要でありそうなことがわかりました。
Selenideを活用したい人に向けて - Qiita

そこでiframeを切り替える処理を追加してみたところ、エラーが解消されました。
なお後続の動的承認者設定処理も同様のエラーで止まってしまいましたが、
こちらは検索画面が別ウィンドウで表示されておりましたが、同様に切り替え処理を追加して対応できました。

実際のテストコード

実際のテストコードは以下のようになりました。

// bis申請画面の申請ボタンクリック
$("input[type=button][value=申請]").click();

// 標準画面に操作対象を切替
switchTo().frame("GB_frame");
switchTo().frame("IMW_GREYBOX_WINDOW");
switchTo().frame("IMW_PROC_MAIN");

// 動的承認者設定画面を表示
$x("//label[text()='フロー設定']").closest("tr").$$x(".//tbody/tr").get(0).$x("./td/a").click();

// ユーザ検索画面に切り替えて処理対象者を設定
$x("//div[@id='mainSetting']//tbody/tr[2]/td/a[1]").click();
switchTo().window("ユーザ検索");
switchTo().frame("frame-jp-co-intra_mart-master-app-search-tabs-user-list_user");
$x("//input[@id='searchTextbox']").val("aoyagi");
$x("//input[@id='searchButton']").click();
switchTo().window("ユーザ検索");
$x("//button[contains(@class, 'imui-button-selectall')]").click();
$x("//input[@id='decisionButton']").click();

// 操作対象を標準画面に戻す
switchTo().window(0);
switchTo().frame("GB_frame");
switchTo().frame("IMW_GREYBOX_WINDOW");
switchTo().frame("IMW_PROC_MAIN");

// 標準画面の申請ボタンクリック
$("#proc").click();
$x("//div[@aria-labelledby='ui-dialog-title-1']").$x(".//button/span[text()='決定']").click();

以上、Selenideを利用したWF申請処理のテストコードについてでした。

Selenideの紹介

intra-martのテストコードを実装する際にSelenideを利用しています。
今回はSelenideについて紹介したいと思います。

Selenideとは

Selenide(セレナイド、セレニド)はSeleniumを拡張した自動テスト用のフレームワークです。
公式サイトは以下です。
selenide.org


使ってみた印象としてはSeleniumよりシンプルにテストコードが書けそうだと感じました。
公式サイトや他のサイトでも詳しく紹介されていますが、以下の点がSelenideの特徴と思います。

  • APIがわかりやすい
  • 待ち処理を特に書く必要がない
  • ページオブジェクトを利用してテストコードを簡潔に出来る
  • テスト失敗時にスクリーンショットを自動保存する

APIについて

要素を選択するときは「$("#title")」のように書くことが出来たり、要素に値を設定する際は「val」で値を設定するなど、わかりやすいAPIが用意されています。

待ち処理について

自動テストはブラウザ上の操作を自動で行うため、画面描画中やスクリプト実行などで要素が活性に切り替わるタイミングなどで入力を試みて失敗することなどがあると思います。Selenideは要素の操作などに自動で待ち処理を追加してくれます。また「watiUntil」メソッドや「should」メソッドなどで明示的な待ち処理を実行することが出来ます。

ページオブジェクトについて

画面毎にクラスを用意して、要素のセレクタを前もって定義したり一連の操作をメソッド化する機能があります。
これによってテストコードをシンプルに実装することが出来ます。

スクリーンショットの自動保存について

アサーション用に「should」メソッドや「shouldBe」メソッドなどが用意されており、アサーションに失敗するとスクリーンショットを自動保存する機能が用意されています。また失敗時のhtmlファイルも自動出力されるため、原因調査もしやすくなっています。


以上、簡単ですがSelenideについて紹介しました。
今後は、intra-martでSelenideを使ってみて難しかったところなどを紹介したいと思います。

IM-BloomMakerを用いてコメント一覧表示画面を作成する~その1

はじめに

2021年度入社のY.Mです。

今回は、フローの処理済み完了案件から申請者、承認者のコメントを一覧画面として表示する機能を実装しましたので、紹介させていただきます。

IM-BloomMakerについて

IM-BloomMakerとは、IM-BISやIM-FormaDesigner等と同じようにローコード開発を行えるアプリケーションです。
最初に作成するコンテンツでは種別を選択することができimui、Bulmaの2種類があります。今回は、他の画面やアイテム等との見た目の兼ね合いを重視したため、imuiを使用していますがサンプルなどではBulmaを使用しています。
BulmaとはオープンソースCSSフレームワークのことであり、レスポンシブデザイン、Flexbox を簡易的に利用でき、華やかで見やすい配色と配置が可能なエレメントを利用できることが特徴です。

コンテンツを作成したら、基本的な画面を作成するデザイナ画面を編集できるようになります。デザイナ画面では、様々なエレメントと呼ばれる画面に表示させたいアイテムを配置していくことができます。エレメントで使用できるのはIM-BloomMaker標準のアイテムやintra-martで使えるアイテムの他、Bulmaのアイテムも使用可能です。テーブルやテキストボックス、繰り返しのリストやテーブル、IMの共通マスタを取得してユーザや会社・組織を検索できるエレメントも備わっています。今回は使用していませんが、グラフやバーコードスキャナも配置することも可能です。

デザイナ画面においてIM-BloomMakerがIM-BISやIM-FormaDesignerと異なっている点としては、コンテナページと呼ばれる領域にエレメントを配置していくため、座標の設定等がないことです。 そのため、エレメントを自由に配置していくためにはコンテナ等を配置して位置を調節する等の工夫が必要です。

また、URLのGET/POSTリクエストを送ったり、IM-LogicDesignerと連携してフローを実行することができます。しかし、全てREST-APIを通じて実行されるため、IM-LogicDesigner側でもルーティングの設定等が必要だったりと単純なフロー実行よりも設定が少し複雑となっています。さらに、「変数」と呼ばれるエレメントと直接紐づけられる情報もあります。この変数は様々なことに使用でき、基本的にはこの変数とエレメントの配置、アクション設定を使って画面を実装していく流れになっています。

IM-BloomMakerの開発の流れについて

IM-BloomMakerでは以下のような流れで開発を行っていきます。
※今回は例として作成したコメントの一覧画面を元に説明します。

  1. コンテンツを新規作成した後に、デザイナ画面を開きコンテナページに表示させたいエレメントを置きます。

    デザイナ画面

  2. 置いたエレメントそれぞれにプロパティや変数等を設定します。

    【リッチテーブルプロパティ】【繰り返しテーブルプロパティ】【変数エディタ】

  3. IM-LogicDesignerのフローを実行するアクションやJavaScriptのコードを記載できるカスタムスクリプト、指定したURLにGET/POSTリクエストを送るアクションなどを記述しボタンを押下した時、画面を読み込んだ時等でこれらのカスタムスクリプトやアクションが発生するように設定します。

    アクションエディタ
    実装の大まかな流れとしては以上になります。 複数回に分けて記事を投稿しますので、次回は詳細な実装内容の紹介になります。

ViewCreatorの計算式カラムについて

はじめに

2021年度入社のS.Hです。

今回は、ViewCreatorの計算式カラムを使用する際の注意事項について紹介させていただきます。

計算式カラムとは

計算式カラムとは、他のカラムのデータに対して関数を使用し、その結果を表示することができるカラムのことです。

計算式カラムの設定については、以下の公式ドキュメントを参照ください。

document.intra-mart.jp

計算式カラムに関する注意事項

計算式カラムを使用する際の注意事項は、「複雑な計算式を設定するとデータ参照の表示に時間がかかってしまう」ということです。

私の経験で言うと、表示をするのに約30秒かかるデータ参照があり、調査を行った結果、SUBSTRINGやROWNUMBERなどの関数を複数使用した計算式カラムが原因だったというケースがあります。

問題の計算式カラムから関数を外すと、約30秒から約2秒に短縮されました。 この経験から、関数を複数使用したカラムを設定すると、表示が遅くなる場合があると思われます。

データに対して複雑な操作を行いたい場合は、テーブルに計算後のカラムをあらかじめ用意しておくなど、別の方法で実装する方が無難です。

おわりに

今回は、ViewCreatorの計算式カラムを使用する際の注意事項について紹介しました。

計算式カラムを使用する際は、実装の段階でデータ参照の表示に影響が出ていないか確認するようにしましょう。

BISのバージョン削除時の注意事項

はじめに

こんにちは。開発部のS.Rです。
皆様は普段スマホをどの程度利用されていますでしょうか。
私は最近ちょっとの休憩のたびにスマホをいじってしまいます。
世の中には「スマホを触らずにいた時間が長ければ長いほど魚が育つアプリ」なんてものが
あるそうです。
私も早速魚育ててみようかな、と思っています。。。


今回の記事は、前回紹介したバージョン複製時の注意事項記事と同様に、
intra-mart、IM-BISの期間化機能(バージョン管理)に関する開発時の注意事項を
簡単にご紹介させていただきます。

IM-BIS期間削除に関する注意事項

IM-BISの期間を削除する際に気を付けなければならない点は、

「1期間を削除した際、その期間に設定されているルール定義も同時に削除される」ことです。

ルート分岐などに使用する「ルール定義」はIM-BISの複数期間に同一の資材を設定して
運用している環境も少なくないと思います。

IM-BISの製造過程での試験的な新規期間の作成や、誤って新規期間の作成をしてしまった場合には、
その期間に設定されている資材をすべて外してから
期間の削除を行うことをお薦めします。

おわりに

前回の『BISのバージョン管理とルール定義について』に続き、IM-BISのTips的内容でしたが、
頭の片隅に置いておくと、いざという時に役に立つかもしれません。

IM-BISの期間化機能の詳細については以下の公式ドキュメントを参照ください。

document.intra-mart.jp

BISのバージョン管理とルール定義について

はじめに

こんにちは。開発部のS.Rです。
最近は専らコーヒーにはまっています。
エスプレッソマシンまで買ってしまいました。
テレワークの生産性倍増です。

今回はintra-mart、IM-BISの期間化機能(バージョン管理)に関する、
開発時の注意事項を簡単にご紹介させていただきます。

期間化に関する注意事項

開発時、IM-BISの期間を区切る際に気を付けなければならない点とは、

「新規期間を作成すると、元の期間に設定されているルール定義が複製され、新規期間に自動設定される」ことです。

なお、ルール定義が複製される際にはランダムに振られたidが
複製されたルール定義に設定されます。

意図せずに資材が複製されることで、
資材の管理から漏れてしまう危険性があります。
期間化を行う際には十分に注意をしてくださいね。

IM-BISの期間化機能の詳細については以下の公式ドキュメントを参照ください。

document.intra-mart.jp

おわりに

私事ですが、開発も3年目に入り、intra-martのBIS開発に多少慣れてきたと思います。
細かい仕様の把握や、開発の効率を上げていき
着実にベテランへの道を進んでいきたいです。

性能試験について(試験実施編)

今回は以前の「性能試験について(性能試験とは編)」の続きで、性能試験の準備や実施方法、試験実施時の注意点などを紹介したいと思います。 gsol.hatenablog.com

事前準備

データの作成について

性能試験を実施するには、試験で使用するデータを作成する必要があります。データは以下のようなツールを使用して作成します。

業務データについてはアプリ担当者と相談して準備します。準備するデータは大きく2つの種類に分けられます。

  1. 実際の処理で使用されるデータ
    • 準備方法:負荷試験ツールを用いて実際の処理を重ねてデータを増やしていく。
  2. 負荷のために単純にデータの母数を増やしたいためのダミーデータ
    • 準備方法:プロシージャを登録して、元データをselect insertして増やしていく。

シナリオの選定について

シナリオの選定は以下のような基準で選定します。

  • 利用率の高かったり、お客様から要望のあった業務フロー
  • アクセスログ等から解析して利用率上位
  • 新機能を対象とする

AWS環境を利用する際に必要な申請

AWS環境で負荷試験をする場合は事前に申請しておく必要があります。申請は2つあります。

  1. 負荷試験を行う旨と試験の内容(予測されるピーク時のリクエスト数や利用するAZの情報、トラフィックの傾向とともに予想される最大・最少アクセスの時間等)についての申請

    • 事前申請が必要とされる負荷試験は、EC2に対して1 分を越えて継続する、1 Gbps (10 億ビット/秒) または 1 Gpps (10 億パケット/秒) を超える負荷を実施する場合で、外部からの攻撃ではなく性能試験を実施することを報告する必要があります。
    • ただし、提示されている負荷条件に達している場合に申請するものであるため、条件を満たさない場合には事前申請は不要です。
  2. ロードバランサーの暖気申請

    • 急激なトラフィック増が見込まれるため、事前にロードバランサ―を暖気(スケールアウト)させておく必要があります。
    • 負荷試験以外でもサービスイン初日であった場合にも申請されるケースがあります。
    • 代替手段としては、事前に負荷試験ツール等を使用してロードバランサ―に負荷をかけて暖気(スケールアウト)させておくという事も可能です。

試験実施

負荷試験ツール

負荷試験で使用するツールは、基本はフリーで事例が多いJmeterを使用します。Jmeterプラグインが充実しているので便利です。

Jmeter以外にも様々な製品はありますが、有償でライセンスが必要であったり使い勝手が難しいものあったりするため、比較的使いやすいJmeterを使用する事が多いです。

負荷をかける時間

負荷をかける時間は、特に決まっているわけではないのでお客様と相談の上で決めます(大体はこちらで提案します)。

数時間負荷をかけ続ける場合もあれば、20~30分間で行う場合もあります。

試験の実施時間帯

ケースバイケースでお客様や環境によって、業務終了後/夜間/休日/平日の日中の時間帯で実施したりします。

試験実施時の注意事項

  • 連携先のシステムや外部Webサービスの制限事項にも注意

    • 連携先のシステムが短時間での高負荷を禁止しており、試験が実施できないという場合もあります。
  • Jmeterで負荷をかける時の注意事項

    • Jmeterなどのシナリオは思考時間を考慮しましょう。

      • 本来ありえない負荷がかかってサーバー側がハングしてしまったりするので、思考時間を設定してリクエストによる負荷にバラつきを持たせる必要があります。
    • 負荷をかける際は徐々に負荷をかけていく時間、ピーク時間を分けましょう。

      • 急激に負荷をかけると、負荷試験ツール側/サーバー側の両方でハングしてしまって試験になりません。

        例)100ユーザで20分間の負荷試験を実施する場合

        ⇒ ①負荷をかけていく時間[5分] + ②負荷のピーク時間[15分]

           ①最初の5分間の間に実行スレッド数を増やしていく。

           ②5分間かけて100ユーザ分の負荷がかかる状態になったら、残りの15分間をピーク時間帯として計測していく。

チューニング(アプリケーション以外)

アプリケーション以外でのチューニングとしては、主に以下のような対応があります。

  • WEBサーバ
    • 帯域制限がある場合は、WEBサーバでコンテンツ圧縮対応を実施する。
  • DBサーバ
    • OracleDB内のバッファキャッシュのメモリサイズが不足して物理読み込みが多いため、メモリ割り当てサイズを上げる。
  • クラウド環境
    • 対象インスタンスでのネットワークの帯域制限に達してしまい処理遅延が発生したため、インスタンスのスケールアップを実施する(インスタンスをスケールアップする事で帯域制限の上限を上げる)。

おわりに

性能試験はチューニング及び再試験の対応を想定して、余裕を持ってスケジュールを組みましょう!

性能問題が発生した際は、チューニングや再試験が必要になります。 問題が発生する前提で、余裕を持ったスケジュールを立てて性能試験に臨みましょう。性能試験のスケジュールが遅れた場合、その遅れがプロジェクト全体の遅れにつながってしまいます。

性能試験は必ず実施しましょう!

性能試験は試験の計画に含め、必ず実施しましょう。 もし試験を実施せずに本番システム稼働を迎え、稼働後に性能問題が発覚した場合、業務に多大な影響を与えてしまうことになります。

メール送信の停止方法

今回はintra-martのAPIを使ったメール送信の停止方法について紹介します。

背景

運用テストなどでメール送信のテストを行う際には、メールを対象ユーザに送信しないようにしなければなりません。

その方法として、メールサーバを停止するなどが挙げられます。

ですがこれだと、メール送信自体は止めていないので、テストを行う際に下記のようなエラーが余計にログに出力されてしまいます。

[ERROR] j.c.i.s.m.t.a.LocalThreadTaskExecutor - [E.IWP.MESSAGEHUB.ASYNCRONOUS.00009] 非同期タスクの実行に失敗しました。

これによって、他のログが見にくくなってしまいます。

なので、このエラーを表示させないために、下記のメール送信リスナを使ってメール送信自体を止める方法をご紹介します。

MailSendListener (javadoc-all-dev 8.0.0 API)

使用方法

使用するには以下の2点の設定を行います。

  • MailSendListenerの実装クラスを作成
  • javamail-config.xmlファイルにlistenerタグを設定

MailSendListenerの実装クラスを作成

任意のパッケージ下にクラスを設定します。

package jp.co.gsol.mailsend.control;

import jp.co.intra_mart.foundation.mail.MailSenderException;
import jp.co.intra_mart.foundation.mail.javamail.listener.MailSendEvent;
import jp.co.intra_mart.foundation.mail.javamail.listener.MailSendListener;

public class MailSendControl implements MailSendListener {

    @Override
    public int onSendMail(MailSendEvent event) throws MailSenderException {
        return STOP_MAILSEND;
    }
}

今回はメール送信を停止させたいので、returnにはSTOP_MAILSENDを設定します。

ちなみにこのリスナでは戻り値をCONTINUEにすればメール送信され、また任意の処理が実行可能です。 メール件名や宛先をログ出力させることもできたりします。

詳細は上記のドキュメントを確認してみてください。

javamail-config.xmlにlistenerタグを設定

作成したクラスをjavamail-config.xmlファイルに以下のように追記します。 ドキュメントは下記を参考にしてください。

メール設定 — 設定ファイルリファレンス   第30版 2022-06-01   intra-mart Accel Platform

 <listener>
   <listener-class> jp.co.gsol.mailsend.control.MailSendControl</listener-class>
 </listener>

これで設定は完了です。

まとめ

今回はメール送信リスナを使い、メール送信自体を止める方法について紹介しました。

これを設定しておけばエラーログを出力せずに運用テストをすることができるので、気になる方はぜひ試してみてください。

性能試験について(性能試験とは編)

先日、社内会議で性能試験についての発表がありました。 発表された内容がとても分かりやすくまとまっていたため、ブログの方でも紹介したいと思います。

性能試験とは

  • 非機能要件を満たせているか確認するための試験で、以下のような項目から試験の前提条件や内容を決めます。
    • 同時接続数
      • どれくらいの負荷をかけるべきか
    • データ保持期間
      • どれくらいのデータをあらかじめ用意しておくか
    • レスポンスタイム
      • 単位時間内にどれだけ速く処理できるか
    • スループット
      • 単位時間内にどれだけの量を処理できるか
    • リソース(メモリ、CPU)使用率
      • 単位時間内にどれだけリソースを使っているか
  • 非機能要件に記載のないものについても試験に含めるようにします。評価は一般的な基準で行います。
    • 例:GCの負荷状況、ディスクI/O、ネットワーク利用状況、(クラウド環境の場合)ネットワークの帯域制限など
  • 上記から試験計画書、試験シナリオを作成し、お客様と合意をとります。

試験実施タイミングと実施期間

実施タイミング

  • 試験実施は総合テストフェーズで実施します。
    • 事前準備(試験計画など)は、前倒しで結合テスト以前から進めたりもします。

実施期間

  • 試験実施の期間はおおよそ1か月~2か月程度です。
    • チューニングや再試験を考慮して余裕をもった日程にすることが大切です。

性能試験のポイント

最後に性能試験で抑えておくべき重要なポイントをまとめます。

数年後想定での試験計画

  • 非機能要件定義書等で記載されているデータの保持期間(ワークフローの完了案件データ等)やユーザ数の増加見込み等を元にデータの積み込み件数やユーザの同時接続等を検討しましょう。

評価項目の確定

  • 試験計画書作成時に、非機能要件定義書等をベースにお客様とどこを評価対象とし、どこまでをゴールとするか確約を取っておきましょう。

試験の対象範囲

  • 試験計画書作成時に、対象となるアプリケーション(シナリオ)、サーバ台数(縮小試験込みか)、同時接続数等について工数と期間を考慮した上で、お客様と検討しましょう。

ログや各種情報の取得

  • 評価項目の他に、性能問題発生時にどこがボトルネックとなっているか切り分けが出来るように各サーバにおいてログや情報出力の内容を把握した上で取得出来るようにしておきましょう。

バックアップリストア

  • 検証環境や稼働前の本番環境での実施の他に、再試験を行う場合もあるので任意のタイミングで環境を戻せるように、バックアップ/リストアの手順の確立と動作確認した上でバックアップ取得を行っておきましょう(依頼を出すのか自分たちで対応するのかも確認は必要)。

利用するサービス及び環境の事前確認

  • 外部WEBサービス連携やクラウド環境を利用する場合、事前申請手続きが必要であったり、そもそも性能試験NG(短時間の高負荷) の場合もあるので、必ず事前に確認しておきましょう。

次回予定

  • 性能試験の実施について紹介します。

WeatherAPIを使ってintra-martの週間スケジュール画面に都道府県ごとの天気と気温を表示する

2021年度に入社したY.Kです。

今回はintra-martのCollaborationのスケジュール画面に、都道府県ごとの天気予報を表示する機能を実装しましたので紹介します。

事前準備

天気予報の取得にはWeather APIを使います。

https://openweathermap.org/api

このAPIは無料で使うことができますが、アカウントの登録が必要なのでその点は注意しましょう。

APIキーの確認方法

登録が完了すると天気予報を取得するためのAPIキーが発行されます。 このAPIキーはメニュー画面の『MyAPI keys』から確認できます。

f:id:sanok-gsol:20220307184821p:plain
WeatherAPIキーの確認画面

実装内容

APIキーを確認できたら早速実装に入りたいと思います。

都道府県選択用セレクトボックス作成

都道府県のデータは下記からjson形式で取得できます。

https://www.javadrive.jp/google-maps-javascript/data/data/pref.json

取得したデータの都道府県名を使って都道府県を選択できるセレクトボックスを作成します。

 $.ajax({
        url: 'pref_coordinate.json',
        dataType: "json",
        type: 'GET',
    })
    .done(function (data){
        //地域セレクトボックスを作成
        var prefectures = '<option class ="not-select" value="">未選択</option>';
        for (var i = 0; i < data.marker.length; i++){
            prefectures += '<option value=' + i + '>' + data.marker[i].pref + '</option>';
        }
        $('.imui-list-toolbar').append('<li><select class="weather-select" style="margin:5px">' + prefectures + '</select></li>');

日付横に天気アイコンを表示

続いて、セレクトボックスで選択された都道府県の天気を日付横にアイコンで表示させる処理を行います。 この天気アイコンを表示するために、WeatherAPIが提供するOneCallAPIを使います。

OneCallAPIドキュメント

One Call API: weather data for any geographical coordinate - OpenWeatherMap

呼び出しAPI

https://api.openweathermap.org/data/2.5/onecall?lat={lat}&lon={lon}&exclude={part}&appid={API key}

こちらのAPIで必要なデータは以下の3つです。

  • 緯度
  • 経度
  • APIキー

緯度と経度は、セレクトボックス作成時のjsonファイルに記載されていますのでそちらから取得します。APIキーは各自のマイページから確認してそちらをコピーして使いましょう。

天気アイコンにカーソルを合わせると気温が表示される

気温の表示に関してもOneCallAPIを使います。

天気予報を表示する

都道府県で取得した緯度と経度、そしてweatherAPIキーを入れて通信を行いデータを取得します。

'https://api.openweathermap.org/data/2.5/onecall?lat=' + 緯度 + '&lon=' + 経度 + '&exclude=current,minutely,houly,alerts&units=metric&appid=' + weatherAPIキー;

取得した天気予報には天気のアイコンや気温などもあるのでそちらも使って都道府県が選択されている場合にのみ日付横に天気を表示させます。

完成画面

実装をした際の完成画面です。マウスが映っていませんがマウスを天気アイコンに合わせてある状態です。

f:id:yamatotox:20210521221554p:plain
気温表示

まとめ

今回は簡易的ではありますが、天気予報をスケジュール画面に表示させる方法を紹介しました。WeatehrAPIを使えば難しい処理をせずに実装できるので、ぜひ試してみてください。

intra-martスクリプト開発APIで詰まったこと

はじめに

こんにちは。開発部のS.Rです。本年もよろしくお願いいたします。

私の今年の目標は、長らくのテレワーク生活で増えてしまった体重を元に戻すことです。

さっそくですが今回は業務中に詰まってしまったことと、その所感について述べようと思います。

発生したこと

スクリプト開発APIのFormaFileUploadItemManagerオブジェクト、registerFileTempメソッド使用でエラーが発生するが、原因が分からない。

出力されるエラーログは以下のみ。

[ERROR] FR_LOG - [E.FORMA.COMMON.00402] 引数が不正です。

原因

いろいろと調査をしていると、Java版で同等のメソッド(registerFileTemp)の引数がスクリプト版とは、少し異なっていることに気づきました(2022年3月時点)。そこでJava版と同じように、第一引数の ファイル情報(fileInfoParam)を配列にして渡したところ上手く動作しました。

ドキュメントに記載の引数の型に誤りがあったことが、今回のエラーの原因でした。

JavaAPI公式ドキュメント

https://api.intra-mart.jp/forma/apilist-forma-javadoc/doc/jp/co/intra_mart/foundation/forma/fileupload/FormaFileUploadItemManager.html#registerFileTemp-java.util.List-java.lang.String-java.lang.String-

JavaScriptAPI公式ドキュメント

https://api.intra-mart.jp/forma/apilist-forma-ssjs/doc/forma/FormaFileUploadItemManager/index.html#method-registerFileTemp_3

おわりに

今回のエラーに限らず、エラーの調査と対応では「視野を広く持つこと」を忘れないようにしたいです。

私自身の話になりますが「○○に気を付けよう」などの、自分がつまずきやすい点に応じたエラー対応時の自分ルールを複数持つことで、開発の効率が上がったと感じています。あらかじめ対応方針を決めておくことで、根拠の無い調査をして無為に時間を費やすことも少なくなりました。

自己分析を行い、「どのような対応の際に時間が掛かってしまったのか」を明らかにして開発の効率を上げていくことを、今年の目標に加えようと思います。