Code for final

ふぁいなる向けのコード置き場です。すでにコードじゃないこともいっぱい。

intra-mart(accel)でModule.alertの代わりとなるっぽい汎用的に使えるエラー画面を出す。

intra-martを昔からやっている人はわかると思いますが、製品標準でエラー画面が用意されています。

そうです、Module.alertオブジェクトです。
エラー画面というか警告画面っぽいですけど。

以下のようにサーバサイドでメッセージID、詳細メッセージを渡すだけで戻るボタン付きのエラー画面が出せます。

Module.alert.back(messageId, detail);

intra-mart Accel Platform SSJS API Documentation

intra-martで作成された業務アプリでシステムエラーが出た際はこれに頼っているケースがほとんどではないかと思います。

そんなModule.alertですが、accelから非推奨になりました。
しかも、代替えメソッドはありません。と書いてあります。

なぜなくなった? why?

まぁエラー画面くらい自分で作りなさいってことかーと理解して
UIデザインガイドラインを見てたらなんと代替っぽいのがありました。

6.5.2. 汎用メッセージ画面 — UIデザインガイドライン(PC版)   第5版 2015-04-01   intra-mart Accel Platform

なぜにUIデザインガイドラインに?ということは置いといて、渡せるものも増えていろいろパワーアップしているみたいです。

Transferオブジェクト intra-mart Accel Platform SSJS API Documentation

以下のようなコードをサーバサイドで書けばOKです。

      Transfer.toErrorPage({
        title: 'タイトル',
        message: 'メッセージ',
        detail: ['詳細メッセージ1', '詳細メッセージ2'],
        returnUrl: '/login', // 戻り先 URL
        returnUrlLabel: 'ログイン画面へ戻る',
        parameter: {
          key: 'value',
          list: ['1','2','3']
        }
      });

↓上記のコードで出るエラー画面 f:id:finalstream:20160503200108p:plain

これってModule.alertの代替ちゃうん?って思いましたが、accelで汎用的なエラー画面を表示するときはTransferオブジェクトを使いましょう。

そもそもaccelの開発ではajaxをメインでやると思うので、エラーメッセージはクライアントサイドでimuiShowErrorMessageを使って出すことが多く、あまり使う機会はないかもしれませんが覚えておいて損はないと思います。

intra-mart Accel Platform Client Side JavaScript API - imuiShowErrorMessage

intra-martで作成したアプリ(スクリプト開発)のログを簡単に出力する方法。

ログ絡みでもう一個だけ。

intra-martで作成したアプリ(スクリプト開発)でログを簡単に出力するやり方です。
スクリプト開発プログラミングガイドの記載内容ではちょっとだけ理解に時間がかかったのでまとめときます。

1. ログ設定を作成する。

アプリ用のログ設定を作成します。
loggerのnameはソースを配置するフォルダ名と同じにする必要があるので注意してください。
appenderとか指定していないのでログは標準出力(コンソール)に出ます。
リリース時はレベルをoffにすれば出なくなります。
内容は以下のように書きます。作成後は再起動してください。

WEB-INF/conf/log/im_logger_appname.xml

<included>

  <!-- jsspのappnameフォルダ配下のソースで有効になるロガー設定 -->
  <logger name="appname">
    <level value="debug" />
  </logger>

</included>

 

2. コードを書く。

あとはログを出力するコードを書くだけです。
以下の例では結果のオブジェクト(result)をjson形式でデバッグログとして出力しています。
コードはログ設定で指定したnameのフォルダ名(appname)配下のソースに記述する必要があります。

f:id:finalstream:20160502232547p:plain

sandbox.js

     // ロガーを生成
     var logger = Logger.getLogger();

     // なんか処理した結果を想定
     var result =  { error: false, count: 10 };

     // デバッグが有効の場合、resultをjson形式でログに出力
     if(logger.isDebugEnabled()) logger.debug('init() result: {}', ImJson.toJSONString(result));

上記のたった2つを行うだけで以下のようなログがコンソールに出力できます。
Loggerにobjectをそのまま渡しても[object object]と出るだけですので、ImJson.toJSONString()でstringにしています。

[DEBUG] a.sandbox - [] init() result: {"error" : false, "count" : 10}

ロガー名は"a.sandbox"となっていますが、デフォルトではコンソールに出力されるロガー名は指定した長さになるように省略されます。
省略しない場合は"appname.sandbox"で、ファイルに出力した場合は省略されずに出ます。

ロガー名はjavaだと完全修飾クラス名(FQCN)ですが、スクリプト開発だとsrcフォルダ配下のファイルパスを.で区切ったものになるみたいです。

※ちなみに説明で使用しているappnameは開発するアプリの名前に変更してください。

intra-martでSQLログを効率よく出力する方法。

intra-martでSQLログを出力する場合ですが、真っ先に思いつくのが製品標準のdatabaseロガーを使う方法です。

ログレベルがデフォルトでoffになっているのでdebugにします。
WEB-INF/conf/log/im_logger_database.xml

こうするだけで以下にSQLログが出るんですけど
WEB-INF/log/platform/database.log

コンソールがやたらと流れるようになります。
10秒もしたら以下の文言でコンソールが埋め尽くされます。

[DEBUG] DB_LOG. - [log.connection.open] コネクション(System/System) がオープンされました。
[DEBUG] DB_LOG. - [log.access.query] クエリーに成功しました。
[INFO] DB_LOG. - [log.transaction.commit] トランザクションがコミットされました。
[DEBUG] DB_LOG. - [log.connection.close] コネクション(System/System) がクローズされました。

DBログのほうにもトランザクションとコネクションが…っていうノイズ入りまくりです。こんなのTRACEでいいような…。

どうやら非同期タスク監視のSQLが1secおきに実行されていているのを拾っているっぽいです。

これではログが流れて効率が悪いです。

im社もこの問題は理解しているっぽく、対処方法が以下のログ仕様書に付録として記載されています。

付録 — ログ仕様書   第8版 2016-12-01   intra-mart Accel Platform

ドキュメントを読めばわかりますが、log4jdbcを使います。
これでノイズのないSQLだけのログが出力できます。
実はこれ、もの凄い便利なことがあって通常、SQLログというとSQLとパラメタが別々に出ると思いますが、こいつはSQLにパラメタが埋め込まれた形で出力されます。
なのでコピペだけでSQLが実行できます。
さらに実行にかかった時間も出るので性能も確認できます。
これはデバッグが捗ります。

以下のような感じで出ます。(ドキュメントより引用)

[INFO] j.sqltiming - select b.menu_group_id from ( SELECT menu_group_id FROM b_m_menu_group_cate_inclusion WHERE 
category IN ('im_sitemap_pc') ) a inner join b_m_menu_group_b b on a.menu_group_id = b.menu_group_id 
inner join b_m_menu_b c on b.menu_id = c.menu_id ORDER BY c.sort_number,b.menu_group_id 
 {executed in 43 msec}
[INFO] j.sqltiming - SELECT * FROM imaz_resource WHERE resource_id = 'd0b2358a8017b27c11bfacc2e7640f85b47d3f89aeacaaebe3d1c24ba92486be' 
 {executed in 0 msec}

intra-martでSQLログを出す際は、絶対log4jdbcを使ったほうがいいです。

SQLログってアプリを開発する上で結構重要なものだと思いますが、ログ仕様書(タイトなプロジェクトだとこんなの見る余裕がない)しかも付録として記載されていてもったいない感じだったので書いてみました。