2018年12月29日土曜日

#鬼わか V10アプリ開発 シリーズが始まりました

年末のテクテクLotus技術者夜会で某I社の方から「 #鬼わか シリーズが始まります!」と発表がありましたが、ホントに年末に公開されましたねw


第 1 回「IBM Domino V10 を CentOS 7 にインストールしてみよう #鬼わか 解説」


お恥ずかしい話、私は業務で Linux に触る機会がなかった、というよりある意味避けてきたのかもしれませんが、App Dev Pack に触ってみたいし、今年から参加させていただいているノーツコンソーシアムのザ・ノーツ研究会では Linux に触れる場面で理解が追い付かず辛い経験をしたこともあって、トレーニングを兼ねてこの年末年始に自宅PCにインストールしてみようと考えていました。

そんな時にこの記事はタイムリーでありました。


ところで、自宅PCは Windows 10 Pro なのですが、ここで Linux を稼働させるとなると、これも触れる機会の無かった(避けてきた?)「仮想化」を試すチャンス到来!

そんなわけで次の3つを導入したわけです。


  1. VMware Workstation 15 Player for Windows 64-bit Operating Systems
  2. CentOS 7 x86 64 DVD 1810
  3. Domino Community Server for Non Production 10.0.1 Linux


※Notes は Community 版の 10.0.1 を Windows 10 Pro (ホストOS側)へインストールしています

冒頭の #鬼わか の記事は、後半の Tips を含め Linux を触ったことのない私でもほぼ問題なく理解できる内容でした。

これから Linux 版 Domino を導入してみようという方にとっては非常に分かり易いのでお勧めです。

記事の内容と異なる点として、今回は Community Server を使用したせいでしょうか、Domino のモジュールの展開先は
/linux64/domino/
ではなく
/linux64/DominoEval/
となりました。

欲を言わせてもらえば、ポートを開けるためのコマンド例も欲しかった...
firewall-cmd --permanent --add-port=1352/tcp


ここまで来たら IBM Domino App Dev Pack までインストールして試してみたいところですが、#鬼わか の今後の記事が公開されてから考えたいと思います。

というか、自宅PCへのインストールとなるとベータ版しか選択肢が無さそう(?)ですが、今後に期待したいと思います。

2018年12月23日日曜日

NotesDominoQuery クラスを使ってみよう!

Notes と Domino の 10.0.1 がリリースされました。

早速、トライアル版の Domino と Notes (+ Designer + Administrator)をダウンロードして、ベータ版へ上書きインストールしました。どちらも問題なく完了しました。

このリリースに合わせて Domino Designer 10.0.1 のオンラインヘルプ が公開されましたので眺めたところ、LotusScript に追加された幾つかの新たなクラスが記載されていました。

その中でも今回は NotesDominoQuery クラスに少し触れてみたのでご紹介します。

NotesDominoQuery クラスは、V10 からサポートされた Domino Query Language (以下、DQL) を扱うクラスです。

※DQL については以前のブログエントリでもご紹介しましたので割愛します。


まずは NotesDominoQuery クラスの Explain メソッド を使って、クエリの実行に関する情報を見てみたいと思います。Explain メソッドは domquery コマンドの -e オプションに相当します。
以下のコードをエージェントにタイプします。

Dim ss As New NotesSession
Dim db As NotesDatabase
Dim dq As NOTESDOMINOQUERY
Dim query As String
Set db = ss.Currentdatabase
Set dq = db.Createdominoquery()
query = "Subject = 'test document'"
Print dq.Explain( query )

そしてエージェントを実行するわけですが、クライアントから実行しようとすると「Method is not available: Function is not supported for remote databases」とメッセージが表示され、実行できません。



現状は Domino サーバー上で実行する必要がありそうです。

そこで、サーバー上でエージェントを実行できるようトリガーとターゲットを変更し、Domino のコンソールから「tell amgr "AppName.nsf" 'AgentName'」とコマンドを投入してみたところ、コンソール上に次のように表示されました。

> tell amgr run "DQ.nsf" 'DominoQuery#1'
[8228:000B-5B74] 2018/12/22 23:19:43   AMgr: Start executing agent 'DominoQuery#1' in 'DQ.nsf'
[8228:000B-5B74] 2018/12/22 23:19:43   Agent Manager: Agent printing:   Query Processed: [Subject = 'test document']  0.Subject = 'test document' NSF document search estimated cost = 100    Prep 0.153 msecs, Exec 27.660 msecs, ScannedDocs 3569, Entries 0, FoundDocs 4  ******************
[8228:000B-5B74] 2018/12/22 23:19:43   AMgr: Agent 'DominoQuery#1' in 'DQ.nsf' completed execution

オレンジ色で示した箇所が Explain メソッドの結果です。

FoundDocs が 4 ですので、4件の文書がヒットしたことがわかります。

文書検索にかかるコストが 100 と高く見積もられています。おそらくはクエリーに最適化されたビューを作っていないためコストが高くなったのでしょう。そのせいか検索にかかる時間も長くなっているように思います。


では、クエリーを実行して文書を取得する Execute メソッドを試してみたいと思います。
エージェントに次のコードをタイプします。

Dim ss As New NotesSession
Dim db As NotesDatabase
Dim dq As NOTESDOMINOQUERY
Dim query As String
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument

Set db = ss.Currentdatabase
Set dq = db.Createdominoquery()
query = "Subject = 'test document'"
Set dc = dq.Execute( query )
Set doc = dc.Getfirstdocument()
Print doc.Subject(0)

Subject フィールドの値に "test document" がセットされている文書の集合から、最初の文書を取り出し、Subject フィールドの値を表示します。

そして Domino のコンソールから先ほどと同様にコマンドを投入した結果がこちらです。

> tell amgr run "DQ.nsf" 'DominoQuery#2'
[8228:0010-0F78] 2018/12/23 00:16:51   AMgr: Start executing agent 'DominoQuery#2' in 'DQ.nsf'
[8228:0010-0F78] 2018/12/23 00:16:51   Agent Manager: Agent printing: test document[8228:0010-0F78] 2018/12/23 00:16:51   AMgr: Agent 'DominoQuery#2' in 'DQ.nsf' completed execution

正しく表示できました。

ベータ版では今回試した Explain に相当する機能は提供されていましたが、文書を取得する手段は存在しませんでした。

10.0.1 では文書を取得するメソッドも実装され、それが正しく機能することが確認できました。

2018年12月22日土曜日

テクてくLotus技術者夜会に参加しました

ここ数年の「テクてくLotus技術者夜会」12月度のテーマは

年忘れ!テクてく Lotus 技術者夜会ライトニングトーク

となっていまして、いつも登壇されている IBM Champion の方々のほか、私のように普段は参加するだけの人も何かしゃべってね!と数カ月前から軽く釘をさされます。

今回も事前に準備していた資料を夜会オーナーに渡していたのですが、発表当日になって「今年前半に取り組んだ事のほうがうけるかなあ」と思い直して急いで資料をこしらえて差し替えてもらったのがこちらになります。





上の資料を少し補足します。

ACLに登録されているユーザーやグループといったエントリに加え、グループの場合はドミノディレクトリのグループ文書からメンバー欄の値を取得し、「グループとメンバー」「グループとグループ」といった構造を整理してhtmlを出力する、といったプログラムを LotusScript で作りました。

「ユーザー」や「グループ」をノード、各ノードの関係を矢印で表現します。

Cytescape.js では表示するグラフの種類を選ぶことができます。私が試したDBの中でもノードが多すぎるものは描画時間が長くなるせいか、ブラウザがタイムアウトするような挙動となることもありましたが、別のグラフで表示してみると表示できる場合もありました。





そして私の発表が終わって、いつもの終了時刻まで他の登壇者のトークをお気楽に聞いていたところ「2次会が21時開始でまだ時間がある」ということで、差し替えたはずのスライドもお話することになりました。




こちらは、たまたま読んだ FP8 の What's New で見つけたものが、私の欲しかった機能じゃないか?とピンときて検証してみた、というお話です。

What's New の説明文は、私にはとてもイメージしづらかったので、フォーム/ビュー(設計)とコードとテスト結果を記載してます。

実は createViewNavFromKey 、バージョン 10.0.1 のオンラインヘルプ にも記載がありません(汗)。追加してくださいねー >IBM & HCL


以上の2つのお話が夜会オーナーに評価されたようで賞品をいただきました!


(昨年に続き)今年もありがとうございます!


2018年12月14日金曜日

Notes/Domino のサマータイム対応について調べてみた(後編)

先月の「のの会」でお話したサマータイムについての話題が「入門編+管理者編」でした。

昨日開催の「のの会」第10回では、開発者編としてお話させていただきました。

次のスライドがその内容です。



サマータイム導入?【開発者編】 - その時 Notes/Domino は正確な時を刻むのか from Haruyuki Nakano

今年最後の「のの会」ということで、会の後には忘年会を兼ねた懇親会がありました。
いやー、呑んだし食ったし行きたい店だったしメニューの希望が通ったし、サイコーでした。

来年もわかりやすくて実感しやすく、ちょっとタメになる小ネタを準備して皆さまのご来場を心よりお待ちしています。

引き続き「のの会」をよろしくお願いいたします。

2018年12月2日日曜日

Notes/Domino のサマータイム対応について調べてみた(前編)

早いもので今年も残すところ1ヶ月を切りましたね。

IT関係者として今年を振り返ると、「元号」「サマータイム導入?」といった、カレンダー絡みの話題が世間を賑わせた1年だったな、という印象です。

サマータイムについては、勤務先の関係でぼんやりとした関心はありましたが、その時どうなるのかといったことを深く考えたことはありませんでした。

そして「日本に導入することになるかも?」となった今年、初めて自分事として考え、真面目に検証してみようと思い立ったのです。


そして検証した結果をまとめ、「のの会」第9回でお話させていただいた内容が次のスライドです。


 
サマータイム導入?【管理者編】 - その時 Notes/Domino は正確な時を刻むのか from Haruyuki Nakano


この発表資料は「管理者編」としています。そうはいってもNotes/Dominoと直接関係しない話題(タイムゾーンとは、といったようなもの)」が前半を占めていますので、適宜読み飛ばしていただければと思います。
ここに開発関連の話題を含めなかったのは、ボリュームがありすぎて発表時間とページの都合がつかなかったからです(笑)。


近いうちに「開発者編」も公開いたしますが、まずは「のの会」第10回でお話してからでしょうかね...

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 サイトでの画面遷移を中心にご紹介しました。