当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。
記事そのもののリンクについてはご自由に行っていただいてよいです。

テクてく Lotus 技術者 Slack に参加しよう!

2017年4月7日金曜日

文書サマリーデータの上限を 16 MB に増やしてみた

皆さん、こんにちは。

昨日、桜の花が見ごろ~と書いたのに、あいにくの雨です。
これで桜の花が散ってしまわなければいいのですが・・・





さて、今日は、IBM Domino 9.0.1 Feature Pack 8から実現可能になった「文書サマリーデータの上限を 16 MB に増やす」に焦点を当ててみましょう。

元の記事は、こちらです。
IBM Domino 9.0.1 Social Edition フィーチャーパック 8 の新機能
文書サマリーデータの上限を 16 MB に増やす


9.0.1 FP7までは、1文書あたりのサマリデータサイズが64KBまでとされていました。
サマリデータとは、テキストフィールド、数値フィールド、日時フィールドで設定された文書アイテムのことを指します。
リッチテキストはサマリデータに含まれないため、除外して考えます。
また、表示用の計算結果フィールドは、サマリデータとして認識されるものの、文書のアイテムとして保存されることはないため、この上限値の計算式からは除外してもよさそうです。

文書アイテムがサマリデータかそうでないかを簡単に確かめる方法として、文書のプロパティを見ることが挙げられます。
文書を開かずにビュー上で、文書のプロパティを開きます。
左から2番目のタブを見ると、文書の各アイテムの情報が表示されます。
そのうち、どれか1つのアイテムを選択します。
すると、右側にそのアイテムの情報が表示されます。
この中に、「フィールドフラグ」という項目があります。そこに、"SUMMARY"と書いてあれば、そのアイテムはサマリデータということになります。

Field1アイテムはサマリデータです

余談ですが、ここのフィールドフラグを見ると、そのアイテムがユーザ名の場合、どんな種類なのかが分かるようになっています。
読者フィールドの場合、"READ-ACCESS NAMES "
作成者フィールドの場合、"READ/WRITE-ACCESS NAMES "
名前フィールドの場合、"NAMES"
です。
読者権限を設定したはずなのに誰でも見えるな、なんでだ?
といった時に、このフィールドフラグで確認できます。


本題に戻りましょう。
このサマリデータが文書全体で64KBまでとなっていました。
さらにいうと、1アイテムあたりの上限サイズは32KBです。
ここで気を付けないといけないのは、「$Revisions」「$UpdatedBy」の存在です。
それぞれサマリデータとして定義されるので、上限サイズからこれらのデータサイズを差し引いた分が1文書あたりにセットできるサマリデータということになります。

また、IBM Notes/Dominoの場合、LMBCSで格納されているので、文字数のカウントには注意が必要です。


ここで、本当にサマリの限界は64KBなのかどうかを確認するためにサンプルDBを作成してみました。
サマリデータ確認用サンプルDB

図では「フィールド1」~「フィールド6」までしか見えていませんが、実際には「フィールド10」まで作ってあります。
フィールド1-10の各テキストフィールドに値を入力して、[計算]ボタンをクリックすると、ラジオボタンの値が"ON"の場合に限り、一番右の列の「バイト」と書かれている箇所に、そのアイテムのサイズを計算してセットするようにしています。

実際に文書を保存する場合、フラグのON/OFFを見て、各アイテムをサマリデータとするかどうかを計算しています(OFFの場合はサマリデータにしない)。
ここで注意すべき点があります。
UI上で文書を保存すると、テキスト/数値/日時フィールドはすべてサマリデータとして保存されてしまいます。
そのため、このサンプルDBでは、UI上では保存できないようにして(QuerySaveイベントで止めています)、LotusScriptを使ってバックエンドで保存するようにしています。


※作成者、作成日、最終更新者、最終更新日、タイトル、カテゴリ、フラグ、サイズフィールドもサマリデータとして計算されるので、フィールド1-10には全部で64KBも入力できません。

このDBでデータを入力してみました。
まず、1アイテムに格納できる上限サイズは32KBかどうかを確かめてみました。
入力バイト数が分かるように半角英数字だけを入力していくと、確かに32KBを超えようとするとエラーメッセージが表示されました。
32KBでエラーになった
※画面ではアイテムサイズが32,761バイトになっていますが、制御用のデータとして6バイト使われるので、実際に格納できるのが32,761バイトまでということになります。

ここで、32761バイトまで入力して、他のフィールドにも同様にデータを入力します。
エラーが出るまで入力し続けて、保存します。
文書を保存してみた
保存した文書のサイズは約62KBで、サマリが約61KBでした。
このサマリの数値はフィールド1-10のアイテムサイズを合算したものなので、 実際にはもっと多いでしょう。
それでも、64KBを超えていないことは分かっていただけたと思います。


ここまでがIBM Domino 9.0.1 FP7までの話です(長いなぁ・・・)。
今度は、このサンプルDBをコピーして、サマリサイズを16MBまで拡張できるようにしましょう。
※コピーするのは、比較のためです。


まず、ODSを52にできるようにするために、Dominoサーバのnotes.iniに
CREATE_R9_DATABASES=1
の行を追記します。
その後、Dominoサーバを再起動します。

次に、先ほどのサンプルDBをDominoサーバ上にコピーします(IBM Notesクライアントで行います)。
これで作成されたNotes DBのODSは52になります。

そして、Dominoサーバコンソール上で
load compact -LargeSummary on "データベースファイルパス名"
と入力して、サマリデータを拡張します。
compactコマンドを発行

今回は、文書はコピーしないで設計だけをコピーしたので、あっという間に終わりました。
メッセージを読むとサマリデータの拡張を有効化しました。というようなことが書いてあります。

肝心のNotes DBはどうなったかな?と思い、プロパティを見てみましたが、これといって変わった個所はありませんでした。
load catalog
を実行してカタログDBの更新を行って、コピー前のDB文書と比較もしてみましたが、何も変わってません。
Domino Administratorを使って、DB分析を行いましたが、それらしいものは出力されていません。

えーっと・・・どうしろと!?

と、とりあえず、新規に文書を作ってみましょう。
まず、1つのフィールドに入力できるサイズの上限は32KBでした。
ここは変わってないんですね。
続いて、同じサイズのデータを別のフィールドに入力します。ここは面倒なので、コピー&ペーストで行いました。
サマリデータが拡張されているなら、エラーにならないはず!

ということで、どんどんデータを入力していき、保存してみました。
64KBを超えて保存できた!

文書サイズ、サマリデータサイズともに64KBを大幅に超えた160KBになっています。
限界値の16MBまでは程遠いですが(計算したら、全部のフィールドが32KBとしても500個のフィールドが設定できます!)、それでも従来の64KBを超えて保存することができるのが分かっていただけたと思います。


いかがでしょうか?
フィールドを増やしすぎたのはいいけど(ホントは良くないと思う・・・)、文書の保存ができなくなった!というのも、この設定を適用すれば、そんな心配もなくなります。


気がかりなのは、compactを実行しても、DBのプロパティも何も変わらないこと。
これ、絶対に度のDBに対して適用したかを忘れますよね・・・
どうにかしてほしいですね。




なお、最初に紹介したIBM Knowledge Centerの記事(IBM Domino 9.0.1 Social Edition フィーチャーパック 8 の新機能)中に
「単一フィールドのサイズの上限は、引き続き 64 K です。」
という箇所がありますが、正しくは
「単一フィールドのサイズの上限は、引き続き 32 K です。」
です。
IBMさん、修正してくださいね。



それでは今日はこの辺で・・・



Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2017年4月6日木曜日

Notes クライアント 9.0.1 FP8の強化内容について

皆さん、こんにちは。
ここ数日は暖かかったので、桜の花も見ごろを迎えたようですね。
皆さんは、お花見には繰り出したのでしょうか?
残念ながら私は、行ってません。大勢の人がいるところに行くのが嫌なのです(笑)
静かに花を眺めるのが好きなのです。

閑話休題。


今日はNotesクライアントに関係する話です。
当ブログでもすでに紹介しているように9.0.1 FP8の新機能は、
IBM Notes フィーチャーパック 8 の新機能
に書いてあります。

この中の説明を少し細かく見ていきましょう。


1.インターネット形式の名前の表示

説明によると、宛先入力の時にノーツユーザ名ではなく、インターネットアドレスが表示されますよ。
とのことですが・・・
よくわかりませんでした。
宛先の設定なので、「宛先の選択」ダイアログに表示されるのがインターネットアドレスになるのかな?と思って、見たのですが、一向に変わらない。ノーツユーザ名のまま・・・
「宛先の選択」ダイアログ


どういうことだよ!と一人でイライラしていたのですが、落ち着いて説明文をよく読み返しました。
すると、「ユーザーの入力に応じた名前とアドレスのリストが表示されます。」(抜粋)と書いてあるじゃないですか。
入力に応じた」?ダイアログでは入力してないよな、確かに。

ということで、直接宛先欄に入力してみました。
すると・・・
リストが表示された!
リストが表示されるじゃないですか!
これだ!
ということで、説明にあるように、[ファイル][設定](プリファレンスじゃないよ!)メニューから「設定」ダイアログを表示して、「メール」タブの中にある「表示名にインターネットアドレスを使用する」にチェックを付けます。
「設定」ダイアログのメールタブ

ちなみに、この画面は、メールDBを開いて、アクションメニューの[オプション][プリファレンス]でも開くことができます。
ビューのアクションボタンからでも開くことはできます

改めて、メールの宛先欄に直接値を入力してみたところ・・・
見事にリストがインターネットアドレス表示になりました!
図中のアドレスはテスト用なので送っても届きませんよ

ここまで書いてなんですが、日本での需要ってあるのかな?
不思議な機能です。

なお、上記の新機能の説明サイトでは一切説明がありませんが、これにはもう一つの機能が隠されています。
この機能を使用すると、送信済み/受信メールの宛先欄がノーツユーザ名からインターネットアドレスに切り替わります。

まずは、設定変更前の画面です。
確かにノーツユーザ名が表示されています。
変更前の画面

次に設定変更後の画面です。
なるほど、インターネットアドレスが表示されていますね。
変更後の画面


ところが、こちらの隠し?機能は、利用条件がさらに追加されます。
1.ロケーション文書で「デフォルトの表示名」が"基本ユーザ名を表示"になっていること
2.表示しているメール文書に「InetFrom」や「InetSendTo」といったアイテムが存在していること
です。



2.メッセージの最初の部分の表示

まずは、ノーツクライアントでの設定方法を紹介します。
メールDBを開いて、[表示][表示][メッセージの冒頭]メニューを実行します。
メッセージの冒頭メニュー

すると、メニューにチェックが付いて、メールビューにメッセージの最初の部分が表示されるようになります。
最初の部分が表示された


ふむふむ。なるほど。
表示されるねー。でも、吹き出しの表示時間、短くないか?あまり意味ないよな。


ですが・・・

説明と合致しません。
まず、この機能を実現するためには、「この設定が管理者によって有効にされると、~」(抜粋)とあります。管理者は何をどうやって設定するのかは、
すべてのメールファイルで「メッセージの冒頭の表示」機能を有効にする
に書いてありました。

どうやら、ノーツクライアントのnotes.iniに「EnableBeginningOfMessage=1」を追加しろとあります。
各ユーザに個別で設定させるのは大変でしょうから、ポリシー機能(デスクトップポリシー)を使って
設定すればいいのでしょう。

ですが・・・
この設定を行う前に、ノーツクライアントで試してみたところ・・・
できてしまうんですよね。
え?notes.iniの設定はいらないの???

どなたか、私に正しい答えを教えてください。


3.すべてのメールファイルで「日付によるグループ化」機能を有効にする

上記のサイトには記載されていないのですが、どう考えても、「2.メッセージの最初の部分の表示」と被るので紹介しておきます。

こちらもノーツクライアントで設定します。
メールDBを開いて、[表示][表示][日付によるグループ化]メニューを実行します。
日付によるグループ化

すると、メニューにチェックが付いて、メールビューが日付ごとにグループ化して表示されるようになります。
日付がグループ化された

グループ化(カテゴリ化?)されると、それごとの件数も表示してくれるのはありがたいですね。

ところで、こちらの設定方法は
すべてのメールファイルで「日付によるグループ化」機能を有効にする
に書いてあるのですが・・・

例によって、この設定を行わなくても、実現できてしまいます。
何でしょう?
何か落とし穴でもあるのでしょうか?


どなたか、私に正しい答えを教えてください(2回目w)


4.[返信/転送] 用に読み取り専用の MIME メールコンテンツを維持する


こちらですが、インターネットメールを返信したり、他の人に転送するときに、元のMIMEメッセージを保持したまま行いますよ。ということです。
分かりやすい確認方法としては、転送したメールがどのように表示されているかを見るのがよいでしょう。

まず、下図のようなメールを受信しました。
これは、インターネットアドレスからのメールです(元のメールはOutlookで作成しました)。
インターネットアドレスからのメール

そして、このメールを同じユーザに2回転送しました。
1回目は設定を変更する前、2回目は設定を変更した後に行いました。
転送方法は、メールを開いて、[転送][転送]アクションで行います。
アクションバーから実行してみた

このメールを受け取ったユーザで確認してみました。
すると、設定変更前のメールは、Bodyがリッチテキスト形式になっていて、[表示][表示][ページソース]が選択できませんでした(グレーアウト化されている)
設定変更前に転送されたメール

一方、設定変更後のメールは、BodyがMIME形式になっていて、[表示][表示][ページソース]が選択できました。
設定変更後に転送されたメール

実際に、そのままの形で保持されたかどうかまでは確認していません(やりたくもないw)。
ですが、少なくとも設定変更の前後で格納されるデータ形式が変わっていたのは事実ですので、確かにMIME形式が保持されたと言ってよさそうです。


こちらの設定方法は、
インターネットメッセージの転送または返信時に MIME 形式を保持する
に書いてあります。

まずは、ノーツクライアントのnotes.iniに「KeepReplyForwardMime=1」を設定します。
こちらもデスクトップポリシーで設定できますね。

次に、[ファイル][設定]メニューを実行して表示される設定ダイアログの「IBM Notes クライアントの基本設定」タブにある「MIME メールに対して埋め込みブラウザを無効にする」のチェックを外します。
※この項目はデスクトップポリシーでは設定できないようなので、ユーザ個人個人で設定してもらう必要があります。
IBM Notes クライアントの基本設定

これで出来上がりです。
2段階の設定が必要で、多少面倒ではありますが、前の2つと違って、この設定ができていないと、動きません。
ちょっと安心しましたw




さて、いかがでしたか?
Notesクライアントの新機能と言いつつ、全部メールDBのものでした。
それだけメールを重要視していると捉えるべきか、それとももうNotesクライアントに強化するべき項目はない。と捉えるべきなのか。
非常に難しい問題ではありますが、一度考えてみたほうが良さそうです。




それでは今日はこの辺で・・・






Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2017年4月3日月曜日

IDボールトによる文書の暗号化(4)・・・XPagesで文書を復号化する

皆さん、こんにちは。
ついに4月です。つまり1年の四分の一が終了したことになります。
ダラダラと過ごしていると一年があっという間に終わってしまいそうなので、 気を取り直していきましょう。


さて、今日もXPagesでの文書の暗号化/復号化についてです。
まさか、3月中に終わらせることができずに4月まで引っ張ることになるとは思っていませんでした。
ですが、今回でXPagesでの暗号化/復号化については完結となります。


前回までの記事はこちらです。

IDボールトによる文書の暗号化(1)・・・LotusScriptでIDボールトの情報を取得する
IDボールトによる文書の暗号化(2)・・・XPagesで文書の暗号化/復号化を行う条件
IDボールトによる文書の暗号化(3)・・・XPagesで文書を暗号化する


第4回目となる今日は、XPagesでの文書の復号化についてです。

Notesクライアントの場合はユーザIDの利用が必須になっており、Notesクライアントが自動で処理をしてくれるので、復号化の実装を行う必要がありません。
この辺りは専用クライアントを利用するメリットになりますね。

ただ、難点としてはエラーメッセージがステータスバーにしか表示されないということです。
ステータスバーに表示される復号化エラーメッセージ

ステータスバーは簡易ログになっているので、何かイベントが発生すればその都度メッセージが表示されるため、復号化のエラーに気が付かないこともあります。
また、復号化のエラーメッセージは毎回同じであるため、どの文書を開いたときに発生したのかが分かりにくいというところもあります。
このメッセージを@関数やLotusScriptで制御できればいいのですが、できそうにないのですよね。
せっかくなので、改善してほしいものです。


では、XPagesの場合はどうでしょうか?
公式ドキュメントに
XPage を使用した Domino での文書の暗号化と暗号化解除
というものがありますが、復号化については一切書かれていません・・・

実は復元についての方法は、この連載記事の中ですでに書いてあるのです。

1つ目は、アプリケーションの設定です。
Notes DBの「Xspプロパティ」に
xsp.domino.document.encryption=true

を追記します(すでにこの行があり、値がfalseになっている場合はtrueに変更します)。


2つ目は、dominoIDVaultBeanにサーバ名、ユーザ名、パスワードをセットすることです。

dominoIDVaultBean.setServerName( "IDボールトサーバ名" );
dominoIDVaultBean.setUserName( "Notesユーザ名" );
dominoIDVaultBean.setUserPassword( "NotesユーザIDのパスワード" );


上記のように記述して、直接値をセットしてもよいですし、
あらかじめXPagesの画面でログインをしてことで、サーバ名とユーザ名は以下のコードを実行することでセットできます。
dominoIDVaultBean.setDefaultValues();


※パスワードのセットもできそうなのですが、IBM Dominoの環境設定条件が分からず実現できてません。


この2つの条件をクリアすることで、暗号化された文書をXPagesの画面で参照することができます。

なお、当然のことではありますが、ユーザが文書にセットされているシークレットキーを保有している(NotesユーザID内に格納されている)必要があります。


・・・簡単ですよね。
暗号化の複雑さに比べたら、パスワードの入力だけどうにかすれば、ほとんどコーディング不要で実現できます。

また、復号化できなかった際のエラーメッセージですが、ステータスバーに表示・・・なんてことはなく、XPagesで提供されている「複数エラーメッセージコントロール」で実現できます。
エラーメッセージも自動で設定されるので、どんなメッセージにするか悩む必要もありません。
ここについてはNotesクライアントよりもXPagesの方が親切で良いですね。
復号化エラーのメッセージはエラーメッセージコントロールで実現可能

ところで、1つ目のXspプロパティですが、
UIでは「Enable document encryption for this application」という項目名です。
翻訳すると、「このアプリケーションで文書の暗号化を有効にする」ですね。
ところが、XPagesで文書の暗号化を行うだけであれば、このチェックボックスにチェックする必要はないんですね。
あくまでも文書の復号化を行うのに必要な項目なのです。
なんだかなぁ・・・という感じですよね。



とにかく、これでXPagesアプリケーションで文書の暗号化/復号化ができるようになりました。
XPagesで作成した暗号化文書はNotesクライアントで参照もできますし、逆にNotesクライアントで作成した暗号化文書はXPagesアプリケーションでも復号化ができます。

かなり実用的になったのではないでしょうか。
是非、暗号化機能を試してみてください。




IDボールトを使ったXPagesでの暗号化/復号化については、今回でひとまず完結としますが、実はまだ課題が残っています。

それはパブリックキー/プライベートキーによる暗号化/復号化の実装です。
今回の一連の記事で行ったのはシークレットキーというもので、NotesユーザIDの中に鍵を作り、それを暗号化/復号化に利用するものです。
そのため、あらかじめ鍵を作成して、ユーザに配布するという手順が必要になります。

パブリックキー/プライベートキーの場合、ユーザごとのパブリックキーで暗号化して、復号化する際は各ユーザのプライベートキーで行うというものです。
これなら鍵をわざわざ作成することも、ユーザに配布するということも必要ありません。



実際、iNotesではメール送信時の暗号化機能が実装されています。
ですので、XPagesでもできないことはないと思うのですが、私が作成したサンプルDBでは実行エラーになってしまいます。
どなたか、パブリックキーによるXPagesでの暗号化ができたら、是非実装方法を教えてください。





それでは今日はこの辺で・・・



Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ