2018年9月18日火曜日

V10 の新機能に触れる#2 [Domino Query Language (DQL)]

前回はDomino V10 の新機能のひとつ New Relic 連携についてご紹介しました。

今回もベータ2を試用していて気になった新機能のひとつをご紹介します。 

それは Domino Query Language です。
略して DQL と呼ばれています。

DQL はデータベース内の文書を検索するためのクエリー言語です。

クエリーでは特定のサマリー・フィールド、またはビューの列と、それらの値など指定します。 

「サマリー・フィールド」というのは、ざっくり言えばリッチテキスト・フィールド以外のフィールドのことです。リッチテキストにある本文のテキストや添付の中のテキストは検索できません。

「クエリー」は次に示す様な文であり、個人的には理解しやすいと思っています。

ItemCode という名前のフィールドに入っている値が 00-123 の文書を探す
ItemCode = '00-123'

ItemCode という名前のフィールドに入っている値が 00-123 または 00-456 の文書を探す
ItemCode in ('00-123', '00-456')

TargetDate という名前のフィールドの日付値が 2008 年 3 月 4 日以後の文書を探す
TargetDate >= @dt('2008-03-04')

All Documents ビューの列 Level (=プログラム名)の値が Middle の文書を探す
'All Documents'.Level = 'Middle'

and / or を使って多少複雑なクエリーを指定することもできます
ItemCode in ('00-123', '00-456') and 'All Documents'.Level = 'Middle'


ベータ2では、このクエリーを発行する方法が Domino コンソールと OS のコマンドプロンプトといったように限定的ですが、製品版では LotusScript と Java から発行するためのデータベース・オブジェクトのメソッドが提供されるようです。
※OSのコマンドプロンプトは「管理者として実行」から実行します

HCL Technologies (V10 から Notes/Domino を開発している企業)が公開しているデモビデオ(youtube)では、JavaScript で DQL を使う様子を見ることができます。


前提作業(後述)を終えて早速試しました。

次の様に -q オプションでクエリーを指定して Domino コンソールから発行できました。
load domquery -f "DQLSample.nsf" -q "ItemCode in ('00-123', '00-456') and TargetDate >= @dt('2008-03-04')" -e

また、Domino のプログラムディレクトリに保存したテキストファイルにクエリー文を書くことで、次の様に -z オプションでファイル名を指定して発行できました。
load domquery -f "DQLSample.nsf" -z "dql_query.txt" -e

-e オプションを付けると、ツリー構造に分解されたクエリーのそれぞれに要した時間や検索コスト、ヒットした文書数などを知ることができます。

下はコマンドプロンプトから実行した例です。ビュー名と列のプログラム名を指定しています。
C:\IBM\Domino>domquery -f "DQLSample.nsf" -q "'All Documents'.ItemCode in ('00-123', '00-456')" -e
0. IN      (childct 2) (totals when complete:) Prep 0.0 msecs, Exec 153.672 msecs, ScannedDocs 0, Entries 36, FoundDocs 36
    1.'All Documents'.ItemCode = '00-123' View Column Search estimated cost = 5
[1A28:0002-1C58]      Prep 39.756 msecs, Exec 139.246 msecs, ScannedDocs 0, Entries 17, FoundDocs 17
    1.'All Documents'.ItemCode = '00-456' View Column Search estimated cost = 5
[1A28:0002-1C58]      Prep 0.109 msecs, Exec 14.411 msecs, ScannedDocs 0, Entries 19, FoundDocs 36

[1A28:0002-1C58] Total Documents found = 36
上の結果で"View Column Search" と表示されているとおり、検索にビューが使われたことがわかります。
比較のため、クエリーにフィールド名を指定した場合の結果を下に示します。
C:\IBM\Domino>domquery -f "DQLSample.nsf" -q "ItemCode in ('00-123', '00-456')" -e
0. IN      (childct 2) (totals when complete:) Prep 0.0 msecs, Exec 236.783 msecs, ScannedDocs 11654, Entries 0, FoundDocs 36
    1.ItemCode = '00-123' NSF document search estimated cost = 100
[247C:0002-20FC]        Prep 0.405 msecs, Exec 236.775 msecs, ScannedDocs 11654, Entries 0, FoundDocs 17
    1.ItemCode = '00-456' NSF document search estimated cost = 100
[247C:0002-20FC]        Prep 0.288 msecs, Exec 0.0 msecs, ScannedDocs 11637, Entries 0, FoundDocs 19

[247C:0002-20FC] Total Documents found = 36

今度は "NSF document search" と表示されています。

ビューを指定した時と比べると estimated cost (5:100)や Exec の時間(153.672:236.783)にずいぶんと差が現れました。

この結果からは、ビューを使ったほうがコストが低く、早く探すことができたようです。

ちなみに、私の環境では1回目と2回目以降では Exec の時間に差が見られ、2回目以降は1回目よりも早い結果となりました。


その後ビューをいろいろいじっていたところ、いつからかフィールド名を指定したにも関わらず、ビューを使って探すようになってしまいました。

下がその記録ですが、" View-based equality search" と表示され、 estimated cost が 100 から 5 へと減りました。
クエリーからよりコストの低い検索方法をDominoが判断した、ということでしょうか...?うーん...
C:\IBM\Domino>domquery -f "DQLSample.nsf" -q "ItemCode in ('00-123', '00-456')" -e
0. IN      (childct 2) (totals when complete:) Prep 0.0 msecs, Exec 3.329 msecs, ScannedDocs 0, Entries 36, FoundDocs 36
    1.ItemCode = '00-123' View-based equality search estimated cost = 5
[2268:0002-0484]        Prep 0.386 msecs, Exec 2.35 msecs, ScannedDocs 0, Entries 17, FoundDocs 17
    1.ItemCode = '00-456' View-based equality search estimated cost = 5
[2268:0002-0484]        Prep 0.240 msecs, Exec 1.289 msecs, ScannedDocs 0, Entries 19, FoundDocs 36

[2268:0002-0484] Total Documents found = 36

こんな場合に、どうしてもビューを使ってほしくなければ -j オプションで回避することができます。
C:\IBM\Domino>domquery -f "DQLSample.nsf" -q "ItemCode in ('00-123', '00-456')" -e -j
0. IN      (childct 2) (totals when complete:) Prep 0.0 msecs, Exec 126.455 msecs, ScannedDocs 11654, Entries 0, FoundDocs 36
    1.ItemCode = '00-123' NSF document search estimated cost = 100
[1A04:0002-1E90]        Prep 0.10 msecs, Exec 126.451 msecs, ScannedDocs 11654, Entries 0, FoundDocs 17
    1.ItemCode = '00-456' NSF document search estimated cost = 100
[1A04:0002-1E90]        Prep 0.4 msecs, Exec 0.0 msecs, ScannedDocs 11637, Entries 0, FoundDocs 19

[1A04:0002-1E90] Total Documents found = 36



さてさて、前提のお話が後回しになってしまいましたが、DQL を使えるようにするために 2つの準備を行いました。

ひとつは notes.ini へ UPDATE_DESIGN_CATALOG=1 を追加すること。

もうひとつは、検索するデータベースをビューで検索するために「デザインカタログ」(GQFDsgn.cat)へ追加することです。

デザインカタログ(GQFDsgn.cat)は Domino のデータディレクトリに自動で作成されます。

デザインカタログへの追加は -e オプションを指定して updall タスクを実行します。
load updall DQLSample.nsf -e

またビューを追加したり設計変更した場合は -d オプションを指定した updall タスクを実行してデザインカタログを更新しなければならないようです。
load updall DQLSample.nsf -d



以上、ベータ2で試した DQL についてまとめました。

製品版ではさらに検索にヒットした文書へアクセスする方法が提供されるのでしょうが、その方法はまだベータ2のドキュメントに記載されていません...

まだわからないこともありますが、DQL によってより高効率で検索可能な条件を探しやすくなりそうです。

2018年9月16日日曜日

V10 の新機能に触れる#1 [New Relic]

9.0.1 というバージョンが長く続きましたが、ようやく次期バージョン V10 がリリースされることになり、The World Premiere of Domino V10 と題したイベントが世界各地で開催されるようです。日本では「IBM Notes/Domino Day 2018 Autumn Tokyo」がそれです。
いよいよということで、Twitter など Notes/Domino 界隈にはLotusカラーであるイエローが溢れてまいりました。

そんな中、私も V10 ベータ2を試用する機会を得まして、いくつか新機能を試しています。

ところで、Domino サーバーで新機能を有効にする場合、「サーバー文書を変更しろ」とか「notes.ini の変更が必要」とか「テンプレートからDBを作って設定しろ」といったように、多少面倒な作業が必要だったり、おまけに再起動しなければならない、といったイメージがありますよね。

ベータ2 の Document を読んでいても、はやりそういった多少面倒な設定が必要な新機能が多いのですが、実際に試してみると意外にも見た目のインパクトが大きくて、かつ設定は拍子抜けするくらい簡単だったものがありましたので、それをご紹介します。


さて、みなさんは New Relic をご存知でしょうか?

私は知りませんでした。Wikipedia を見てみると
New Relic のサービスは、ウェブアプリケーションやモバイルアプリケーションのリアルタイム監視であり、クラウド、オンプレミス、あるいはそのハイブリッド環境で稼働させることができる。
とあります。状況監視のサービスを Saas で提供しているのですね。

Domino で稼働状況の監視と言えば、統計モニターデータベース(statrep.nsf)が真っ先に頭に浮かびます。これはサーバーの様々な状態を定期的にデータベースに記録するものですが、記録されたデータは数値等であり、データを時系列に並べたビューで眺めることができます。

V10 で新機能を有効にすると、稼働状況を New Relic へ定期的に(1分間隔で)送信します。

私の試用環境で有効にしたところ、New Relic のWebサイトでは下図のようなグラフが表示されました。



さて、新機能を有効にするには、 New Relicアカウント登録が必要です。
※アカウント登録の時点では、課金に必要なカード情報等の入力はありません

アカウントを登録してログインできると、登録時に入力した会社名が画面右上に表示されます。会社名をクリックして Account settings をクリックします。

すると、画面右側に License key として長い文字列が表示されますので、それをコピーします。

New Relic に表示させたい Domino サーバーの notes.ini へ次のように追加します。
NEWRELIC_LICENSE_KEY=<license key>
この <license key> には、コピーした License key の長い文字列を貼りつけます。

notes.ini へ追加する方法としては上の他に、Domino コンソールから次のコマンドを投入することでも可能です。
set config NEWRELIC_LICENSE_KEY=<license key>


設定はここまで。
その後、最初の稼働状況が送信されるまで数分待ちます。


New Relic の Web サイトへログインしたら、画面上部にある PLUGINS をクリックします。

続けて DominoStats をクリックすると、Domino サーバー名が表示されますので、それをクリックします。

すると最初に示しました、いくつかのグラフが表示されている Overview が表示されます。


アカウント登録が多少面倒と言えばそうなんですが、Domino 側はコンソールからコマンド1つ投入するだけで完了します。


なお、グラフのデータを表示できる期間ですが、私は無料版だからでしょうか、最長24時間までといった制限があるようでした。


実はこの機能、New Relic に向けて HTTP POST 要求を送っています。社内からインターネットへ抜ける際に認証が必要な環境では、例えば認証をスルーさせるといった設定の見直しが必要かもしれません。


以上、Domino V10 ベータ 2 で New Relic を設定するにあたっての Web サイトでの画面遷移を中心にご紹介しました。

2018年9月13日木曜日

第7回 のの会に参加しました

昨日は会社帰りに「のの会」に参加しました。



まあ、毎回参加している訳ですが...(^^;


毎度おなじみあう゛さんの @関数講座 は、今回も目の付け所が面白かった。
いつも何気無く使っている @All 等について深く掘り下げて検証されていました。


ところでのの会は、お菓子をぽりぽりつまみながらソフトドリンクをいただきつつ、わいわいがやがやお話するスタイルの会なのですが、今回は缶ビールが提供されました\( 'ω')/

ということで、2つのお話を私も(呑みながら)させていただきました。


1つは、のの会第7回のタイトル画像にあります「ゴースト文書」です。

そろそろ夏も終わりそうですが季節柄こんな話題もいいかな、などと思い「幽霊文書の作り方」というタイトルで資料を作り、いったんは slideshare にアップしたのですが、祟りが怖くなって非公開とさせていただきました(笑)。

どこかのスパイのエージェントが送りつける「なお、このメールは自動的に削除される」のようなメール(Notes文書)を Notes なら実現できるのですよw
どうしても知りたい方は個別にご連絡くださいませ。


もう1つは成功事例です。


Notes のヘルプデスクではおなじみ(?)の「フィールドが大きすぎる(32K)...」というメッセージが出てしまった文書について苦悩のほどを綴ったものです。

スライドの最後には私のようなひねくれた方法ではない、正統派の対処法(?)も掲載していますので、もしよろしければご覧ください。

2018年7月12日木曜日

第5回「のの会」に参加しました

昨日(2018/7/11)の仕事帰りに「のの会」へ参加しました。

毎回楽しみにしているあう“さんの関数講座ですが、今回も新たな発見がありました。

講座のスライドが毎回公開されていますので、ここではお伝えする事は控えますが、私が使ったことのない@関数の検証が興味深い発表でした。
ご参考: abOut.nsf

そして今回はお時間をいただいて、ノーツデータベースの多言語対応について、クイズを織り交ぜながらお話させていただきました。




上のスライドは発表した際に使ったもので、クイズは「検証」と称しています。25ページから27ページの条件を踏まえて是非チャレンジしてみて下さい。

質問は全部で8つあります。回答は質問の次のページにあります。

なお、回答の検証は 9.0.1 FP7 のクライアント上で何度も行なったつもりですが、ひょっとするとバージョンが異なれば違う結果になる場合があるかもしれませんので、皆さんの環境でもお試しください。


ところで次回の「のの会」は、スポンサー企業であるアクセルさんの新事務所に場所を変え、8月22日(水)の19時から開催の予定です!詳しくはこちらをチェックしてみてください

2018年4月12日木曜日

第2回「のの会」に参加しました

4月11日は「のの会」に参加しました。

「のの会」についてはこちらからご確認いただくとして、今回の内容は、先月ラスベガスで開催された IBM Think で発表された Domino Apps on iPad 等のビデオ鑑賞(岡本さんが撮ってくださったもの)、あべさとるさんの@関数講座、それから私も一コマ頂戴して発表させていただきました。

ノーツのアプリを設計変更なしにiPadで動作する iPad版Notesクライアント「Domino Apps on iPad」がグリグリ動いている動画をいくつか見させていただき、興奮しました。早く触ってみたい!

あべさとるさんの@関数講座はシリーズ化されるかもしれませんが、今回(初回)は @Ifや@Random などについて紹介してくださいました。さすが目の付け所が素人じゃないです...

そして私は...


Notes を長く使っていると、データベース(NSFファイル)の容量制限の壁にぶつかることがあります。
これまでの Notes/Domino の歴史の中で、その制限を回避するための機能追加はいくつもありました。
それらを3つに分類して紹介しています。

Notes の初心者から、なんでもご存知のエキスパートまで、意外と知らない機能や忘れてる機能があるのではないでしょうか。

2018年2月10日土曜日

@Transform と @Nothing をビューで使う場合、念のため @Trim を忘れずに

トラブルシュートしていたときに遭遇したことについて情報共有したいと思います。

1つのフィールド(フィールド名 "MailAddress")に複数のメールアドレスを記入できるのですが、そこにインターネットメールアドレスを含んでいるかどうかを調べようとしていました。

インターネットメールアドレスは "@" 記号を含んでおり、Notes メールアドレスには含まないという前提です。

次の式を用意しました。
@Transform( MailAddress; "x"; @If( @Contains( x; "@" ); x; @Nothing ) )

説明すると、MailAddress アイテムのリスト要素の1つを変数 x に代入し、変数 x が "@" 記号を含めば値を保持し、そうでなければ値を除去する(要素を減らす)、ということをリストの要素の数だけ繰り返します。

例えば、MailAddress アイテムに次の2つアドレスが入っていたとします。
"hoge taro/acme" : "hoge.jiro@acme.com"

この時、式は "@" 記号を含まない "hoge taro/acme" を除去しますので、返ってくる値は通常 1 つのアドレス "hoge.jiro@acme.com" になります。

@Nothing は リスト要素を返さない、つまり要素を1つ減らすのです。


そう、ビューでなければ。


ビューの列に先ほどの式を設定したところ、要素が減るものと、要素の数は減らず値がなくなるものの2パターン現れました。先の MailAddress アイテムの場合、1つのアドレス(要素)を返すものと、空っぽの要素+1つのアドレス(要素)を返すものがあったのです。
要素数が1になった値     "hoge.jiro@acme.com"
要素数が2のままの値     "" : "hoge.jiro@acme.com"

これと同様のことはビューの選択式でも確認しており、@Transform と @Nothing を使った次の式を記述すると期待した結果にならないことがありました。
SELECT @Elements( @Transform( MailAddress; "x"; @If( @Contains( x; "@" ); x; @Nothing ) ) ) > 0


このように @Nothing が要素を減らさない場合があることがわかりました。
また、ビューを Shift + F9 で再構築すると結果が変化する場合もありました。

なお、これらは Notes 9.0.1 に FP9 を適用した環境で確認しました。

もしこのような現象が確認できた場合、次の式のように @Trim を組み合わせて回避しましょう。
SELECT @Elements( @Trim( @Transform( MailAddress; "x"; @If( @Contains( x; "@" ); x; @Nothing ) ) ) ) > 0

2017年12月16日土曜日

全文検索の不具合を解消してみた

昨日(2017年12月15日)の「テクてくLotus 技術者夜会」に参加させていただきました。

昨年に引き続き、今年も12月は「ライトニングトーク」でした。

ライトニングトークには、普段から各種イベントで発表しているIBM Champion や日本IBM社員の方々に加え、いつも参加しているだけのメンバーも参加できるとあって、僭越ながら私も発表させていただきました。

もしご興味ありましたら、下のスライドをご覧ください。



内容ですが...

もう20年近く運用しているDBでフォームを作り直した。その後特定の条件で全文検索すると不具合がでることがわかり、メーカーサポートへ問合せましたが解決せず、いろいろやってなんとか自己解決できた。

といった自慢話成功事例です。

今年は(昨年の反省もあって)発表当日の朝に資料を送付するという完璧な準備のおかげか、主催者の御代さんに評価していただき、記念品「ぷらRoBoHon」までいただいちゃいました。


これに気をよくしたのか、これからもTips的なことを投稿していこうかという気になっています(笑)