Code for final

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

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

intra-mart(accel)でポップアップ画面を表示したときスクロールバーが出る問題。

intra-mart Accel Platformではポップアップ画面は非推奨ですが、エンドユーザから昔ながらの操作性を維持したいということでポップアップを希望されることもあります。

その場合、window.open()でaccelの画面を指定して開くと思いますが、何故かスクロールバーが出ます。

これはなぜかというとaccelのテーマは縦と横の最小値が定義されているからです。

こういう場合は以下のようにCSSをオーバライドしましょう。

<style type="text/css">

  #imui_container {
    min-height: 0 !important; /* imの高さ指定を無効化 */
  }

  body {
    min-width: 0 !important; /* imの幅指定を無効化 */
  }

</style>

これでスクロールバーは消えます。

intra-martでルーティング追加したあと再起動してログインしただけなのに500エラーが出て詰んだとき。

accel開発経験者なら必ずあるのではないでしょうか。

  • メニューに新しい画面を追加して、ルーティングを追加して再起動してログインすると500エラーになって何もできなくなること。

  • ほかの人からメニューをもらってインポートしたあとトップページを表示したら500エラーになって何もできなること。

こういう場合は、たいてい認可リソースが不足しているのが原因です。
認可の仕組みをよく理解せずにてきとーにリソースURIを書いてしまったときに起きます。
認可リソースURIをルーティングに書くときはまず、認可の画面から先にリソースを作成しておく必要があります。

コンソールに不足している認可リソースが以下のような感じで出ていると思います。

Caused by: jp.co.intra_mart.foundation.authz.services.ResourceNotFoundException: [E.IWP.AUTHZ.DECISION.10007] リソースグループが登録されていません。 URI = service://sandbox

認可画面からリソース追加するかーとテナント管理者でログインすると500エラーが…
なんと、こうなったらテナント管理でもログインできなくなります。管理者なのに。

じゃ、システム管理者かーと思って、管理者のメニュー見ても認可はありません。
詰んだ。
という状況になります。
これで環境を作りなおしたひともいるんじゃないでしょうか。

ではこういうときどうするかというとテナント管理者でログインした後に以下の認可のURLを直接たたきます。

http://localhost:8080/imart/tenant/authz/settings?imui-theme-builder-module=headwithcontainer

社内のimに詳しいひとに教えてもらいました。
単純に認可の画面のpathだけたたいてもだめです。テーマのメニュー表示を無効にしないとメニューをロードするので結局500エラーになります。
こんなん普通のひとはわからないですよね。

こんなこともあるので新しい画面を作ったらメニューに追加するのは最後の最後をおすすめします。(開発中はURL直打ちのほうが早いです)
あと開発中の認可は"welcome-all"でいいと思います。

これで解決できるとは言え、メニューを表示するときそのメニューの認可リソースがないからってログインできなくなるのは横暴な気もしますが。テナント管理者はログインできるようにするか、メニューに表示されないくらいにとどめておいてほしいものです。