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

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

2017年8月21日月曜日

XPagesでサポートしているRDBMSを試してみよう

皆さん、こんにちは。
気が付いたらお盆が過ぎていました・・・
東京は8月に入って、カラッと晴れた日がないので、夏という気がしないのも一つの要因でしょうか。
涼しいのは良いのですが、やはり夏は暑くないとしっくりと来ないですね。


では今日の話題に行きましょう。
今日も9.0.1 FP8の関連事項です。
もうすぐ9.0.1 FP9がでるはずなので、その前に終わらせておきましょう。ということです。

IBM Domino Designer 9.0.1 フィーチャーパック 8 の新機能
XPage 用のリレーショナルデータベースサポートの改善および JDBC ドライバプラグインウィザードの追加。
という記述があります。

今回はこれについて見ていきます。
上記のリンク文書を読み進めていくと、
XPages を使用したリレーショナルデータベース管理 (RDBMS) のサポートを読むように書かれています。
ここには、新しい機能についての説明がありますが、具体的にどのようにしたら利用できるようになるのかを記事内で紹介されているサンプルDBを元に見ていこうと思います。

1.JDBCドライバの入手

今回はサンプルDBを試すので、Derbyを利用します。
DerbyのJDBCドライバはApache Derbyから入手できます。
ここから、「db-derby-10.13.1.1-bin.zip」(2017年8月時点の最新バージョン)をダウンロードします。
ダウンロードしたzipファイルは任意の場所に展開しておきます。


2.XPages Plug-in用に変換

Domino Designerを起動します。
[Tools][JDBC Driver Plug-in Wizard]メニューをクリックします。
JDBC Driver Plug-in Wizardメニューが追加されている

JDBC Driver Plug-in Wizardのダイアログが表示されるので、以下の項目を入力します。
「Type」は今回はサンプルアプリケーションを使用するので、「Apache Derby」を選択します。
「JAR Files」は、[Add JARs]ボタンをクリックして、1.で入手したApache DerbyのJDBCドライバのJarファイルを選択します。
「Direcroty」はXPages用に変換したJDBCドライバを含んだUpdate Siteをどこのフォルダに出力するのかを選択します。このフォルダは任意の場所で良いですが後で利用するので覚えておきます。
JDBC Driver Plug-in Wizardダイアログ

すべて入力できたら、[終了]をクリックします。
Wizardが実行されて、指定したフォルダにUpdate Site用のファイルが作成されます。
作成されたUpdate Site用フォルダ


3.Dominoサーバへの適用

2.で作成したUpdate Siteは「Eclipse Update Site」DBに登録することでDominoに適用することができます。
「Eclipse Update Site」はテンプレートが用意されていますが、自分で作成する必要があります。
ただし、Dominoサーバーに1つあれば十分ですので、すでに作成してある場合はそれを利用します。

作成していない場合は、[ファイル][アプリケーション][作成]メニューで新規にNotes アプリケーションを作成します。
テンプレートのサーバーは、Dominoサーバーを選択します。
「詳細テンプレートの表示」にチェックを付けると、 「Eclipse Update Site (9)」というテンプレートが表示されるので、それを選択します。
ファイル名は「updatesite.nsf」としておきます。
新規アプリケーションの作成

Notes アプリケーションが作成できたら、それを開きます。
(下図ではすでに文書が作成されていますが、新規作成した場合はありません)
Eclipse Update Siteアプリケーションを開いたところ

[Import Local Update Site]アクションをクリックすると、下図のダイアログが表示されるので、[Browse...]をクリックして、2.で作成したUpdate Siteのフォルダから「site.xml」を選択します。
Import Local Update Siteダイアログ

選択したら[OK]をクリックします。
Update Siteの内容がImportされると、ビューに文書が表示されます。
Update Siteがインポートされて文書が作成された

Eclipse Update Siteに登録された文書の内容を反映するにはDominoサーバーを再起動する必要がありますので、再起動します。


4.サンプルDB(XPages JDBC)で動作確認してみる

XPages JDBCのサンプルアプリケーションは、https://github.com/OpenNTF/XPagesRelationalSampleで入手できます。
入手した「XPagesJDBC.nsf」を署名したらDominoサーバーにアップロードします。

WebブラウザでNotes アプリケーションを開きます。
XPagesJDBCをWebブラウザで開いた

画面右上にある[Setup]をクリックすると、Derbyへの接続テストが行えますので、実行します。
Derbyへの接続テストが成功




正しくセットアップできていると、「Connection Successfull」と表示されます。


あとは画面左側にあるアウトラインからビューをクリックすると、Derbyのデータが表示されるので、確認してください。




このように、ちょっとした手間でJDBCドライバを利用したXPagesアプリケーションが作れるようになっています。
JDBCドライバはDerbyの他、OracleやDB2、SQL Server等に対応しているとのことですので、色々と試してみてください。





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


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

2017年7月31日月曜日

Notes/DominoでRSSフィードを作成してみよう

皆さん、こんにちは。
7月も今日で終わりです。世間では学生さんたちは夏休み真っ盛りですね。
社会人な皆さんは夏休みはしっかりと取得しているでしょうか?
時には休息も必要なものですので、しっかりと休むようにしましょう。

私はと言えば、普段は暇をしていますが(汗)、なぜかここ最近は忙しくなってしまい、なかなか休息が取れていませんが・・・

忙しかった理由の一つに
こちらがあります。
「カレンダーアーカイブ with OnTime」という製品です。

OnTime Group Calendarという製品は皆さんご存知かと思いますが、その製品群の一つにOnTime Open APIというものがあります。
それを利用してNotesメールDBに含まれるスケジュール文書をアーカイブするという製品を開発してみました。
この製品の開発は(有)アクセルの岡本様のご協力がなければ実現できませんでした。
改めてここで感謝の意を表明します。ありがとうございました。

ちなみに製品については以下のリンクを参照してください。
株式会社エフHP内製品ページ: http://www.effect-force.co.jp/product2/carchive.html
OnTime Group CalendarHP内製品ページ: https://ontimesuite.jp/calendar-archive.php

気になった方は、上記のページからお問い合わせをしてみてください。


では、今日の話題に行きましょう。
「Notes/DominoでRSSフィードを作成してみよう」というものです。

IBM Notes/Domino 8.5からは「RSS Feed Generator」という標準テンプレートがついてくるので、それを使えば簡単にRSSフィードが作成できますが、それは別の機会で設定方法を紹介したいと思います(画面ショットとか面倒なんですよ(笑))。


今回は、JavaとXPagesを組み合わせて、実現してみようと思います。

実装する内容は次の通りとします。
特定のNotes DBに新規作成された文書をRSSフィードに表示させるようにする
  • 「特定のNotes DB」はXPages化されているものとする
  • 「特定のNotes DB」は1つだけとする(複数のNotes DBには対応させません)
  • 「特定のNotes DB」はハードコーディングではなく、環境設定文書に保存しておく
  • 「RSSフィード」の対象は 主文書だけとする(返答文書は対象外)
  • 「タイトル」はSubjectフィールド、本文は「Body」フィールドとする
  • WebブラウザでXPages画面を開くとRSSフィードのページが表示されるようにする

では早速見ていきましょう。

1.RSSフィード対象のNotes DBの設定を行う

・まず、フォームには「タイトル」用のフィールドが必要になります。
・RSSフィードは新規に作成された文書を取得するものなので、日付順のビューを用意します。
このビューは、主文書だけを表示するようにしておきます(選択式を記述してください)。
1列目に更新日時の列(式は@Modifiedで良いでしょう)を設定します。この時、「降順」でソートしておきます。
2列目以降はあってもなくても構いません。結果を分かり易くするのであれば、「タイトル」列を設定しておけばいいでしょう。
・「ACL」の設定を行います。通常ならば「-Default-」や「Anonymous」を読者にしておいた方がいいですが、社内で利用するのであれば、社内のルールに則ってACLを設定しましょう。

2.RSSフィードを表示するためのNotes DBを作成する

RSSフィードの対象Notes DBの設定ができたので、次に本体のNotes DBを作成します。
まずは、「環境設定文書」フォームです。
こんな感じのものを作ってみました。テスト用なので簡潔にしてあります。
環境設定文書の画面

「Notes DBファイルパス」は、Notes DBのパスです。Notes DBの新着文書の情報を取得する際に利用します。
「Notes DBタイトル」は、Notes DBのタイトルです。RSSフィードで表示するのに利用します。
「Notes DBホスト名(URLパス)」は、Notes DBをWebブラウザで表示する際のパスを記述します。RSSフィードなので、WebでNotes文書を表示するのに利用します。
「Notes DBの説明」は、RSSフィード画面で表示するものです(これは任意の値で良いです)
「対象ビュー名」は、Notes DBの新着文書の情報を取得する際に利用します。

フォームが出来たら、文書を作成します。
ここでは対象とするNotes DBは一つだけと決めておきましたので、文書は一つだけ作成します。

3.対象となるNotes DBの新着文書を取得するコードを作成する

今度は、対象となるNotes DBの新着文書を取得します。
そのためのコードは次のようにしました。

var getNotesData = function( configData ) {
    var dbFeed:NotesDatabase = null;
    var vwFeed:NotesView = null;
    var docFeed:NotesDocument = null;
    var retFeed = [3];
    retFeed[0] = new Array();
    retFeed[1] = new Array();
    retFeed[2] = new Array();
    try {
        dbFeed = session.getDatabase( "", configData[1] );
        vwFeed = dbFeed.getView( configData[2] );
        docFeed = vwFeed.getFirstDocument();
        var i = 0;
        while ( docFeed != null ) {
            retFeed[0][i] = docFeed.getItemValueString( "Subject" );
            retFeed[1][i] = configData[3] + "%24%24OpenDominoDocument.xsp?action=openDocument&documentId=" + docFeed.getUniversalID();
            retFeed[2][i] = docFeed.getItemValueString( "Body" );
            
            var docTmp:NotesDocument = vwFeed.getNextDocument( docFeed );
            docFeed.recycle();
            docFeed = docTmp;
            i++;
        }
    } catch(e) {
        print( "Error occurred at [getNotesData] -----From-----" );
        print(e);
        print( "Error occurred at [getNotesData] -----To-----" );
    } finally {
        if ( docFeed != null ) docFeed.recycle();
        if ( vwFeed != null ) vwFeed.recycle();
        if ( dbFeed != null ) dbFeed.recycle();
    }
    return retFeed;
}


対象のNotes DBから指定したビューの全文書を二次元配列に格納して返しています。
テスト用なので、ビューの全文書にしていますが、運用し続けていくと、文書数がどんどん増えていきますので、その辺はビューで制御するか、上のプログラムを改修するかなどして工夫してみてください。


ここで、引数のconfigDataを生成するための関数が必要になりますが、それは下記のようにしました。

var getConfig = function() {
    var vwConfig:NotesView = null;
    var docConfig:NotesDocument = null;
    var retData = [];
    try {
        vwConfig = database.getView( "vwConfig" );
        docConfig = vwConfig.getFirstDocument();
        retData[0] = docConfig.getItemValueString( "NotesDBTitle" );
        retData[1] = docConfig.getItemValueString( "NotesDBPath" );
        retData[2] = docConfig.getItemValueString( "ViewName" );
        if ( @Right( docConfig.getItemValueString( "NotesURL" ), 1 ) == "/" ) {
            retData[3] = docConfig.getItemValueString( "NotesURL" );
        } else {
            retData[3] = docConfig.getItemValueString( "NotesURL" ) + "/";
        }
        retData[4] = docConfig.getItemValueString( "NotesDBDescription" );
    } catch(e) {
        print( "Error occurred at [getConfig] -----From-----" );
        print(e);
        print( "Error occurred at [getConfig] -----To-----" );
    } finally {
        if ( docConfig != null ) docConfig.recycle();
        if ( vwConfig != null ) vwConfig.recycle();
    }
    return retData;
}


環境設定文書を取得して、そこから必要なフィールド値を配列に格納して返しています。
この辺はもっとスマートなやり方があるでしょうから、色々と工夫してみてください。


4.XAgentで画面出力部分のコードを生成

次に実際に取得できた(はずの)RSSフィードを画面に表示するコードを記述します。
こちらです。

// Generated RSS Feed
var outData = genFeed( cfg, notesData );
var exCon    = facesContext.getExternalContext();
var writer   = facesContext.getResponseWriter();
var response = exCon.getResponse();
response.setContentType( "text/xml" );
response.setHeader( "Cache-Control", "no-cache" );
writer.write( outData );
writer.endDocument();
facesContext.responseComplete();


こちらはXAgentを使用して画面に出力しています。
これは、rss.xspというXPageに設定しました。
RSSフィードはXMLデータなので、出力データのタイプを「"text/xml"」にしています。
XAgentについては、XAgentとは?で言及していますのでこちらを合わせてチェックしてください。
なお、「genFeed」という関数で実際にRSSフィード用のデータを作成しています。



5.RSSフィードを作成する

実際にRSSフィードを生成するためのコードを記述します。
これはJavaのライブラリを使用すると簡単に実装できます。
実装方法は、JavaFXでRSSを作成・読込・表示(ROMEライブラリ)の記事を参考にさせていただきました。
というかほぼ、この記事の中にあるサンプルコードで実装できました。
ですので、コードについては「あえて」記述しません。

実装方法だけ説明していきます(以下の操作は、Domino Designer 9.0.xの場合です)。
1.まず、Javaのコードを記述するのに必要なJavaライブラリファイルをダウンロードします。
2.Domino DesignerでNotes DBを開いたら、設計要素の「Jar」を開きます。
3.[Jarのインポート]メニューでダウンロードしたJavaライブラリファイルをインポートします。
インポートjarファイルの一覧
4.設計要素の「Java」を開いて、新規クラスを作成します。
「パッケージ」と「名前」に任意の値を入力して、[終了]をクリックします。
Javaクラスの生成
5.Javaのコードを記述します。
ここはノーヒントです。

6.XPagesからJavaプログラムを呼び出す

Javaプログラムを書いたのは良いけど、XPagesからどう呼び出すの?となりそうなので、ここは呼び出し方を書いておきます。
サンプルコードは次の通りです。

var genFeed = function( configData, notesData ) {
    var rssFeed:jp.hogehoge.GenerateRSSFeed = new jp.xpages.GenerateRSSFeed();
    return rssFeed.genFeed( configData, notesData );
}



var rssFeed:jp.hogehoge.GenerateRSSFeed = new jp.xpages.GenerateRSSFeed();
でrssFeedという変数にJavaの関数を割り当てています。
次のrssFeed.genFeed( configData, notesData );
でJavaプログラム内のメソッドを呼び出しています。
戻り値はRSSフィードのXMLデータとなります。


7.確認してみよう

実際にrss.xspというXPageを表示した画面がこちら(ブラウザはfirefoxを使用)。
rss.xspを表示したらRSSフィードの画面になった

ちゃんと、Notes DBの文書のようなものが表示されています(データは適当です・・・)


どうでしょうか?
これの面白いところは、Notes DBであれば、どんなものもRSSフィードの対象になりうるというところです。
Web化したのはいいけど、新着情報の取得とかどうしよう・・・というときにつかえる(かもしれません)。
例えば、カレンダー情報がアップデートされた時にこのRSSフィードを使うと、メールDBを開かなくても何か情報が追加されたことが分かるようになったりしますね。



上記で紹介した「カレンダーアーカイブ with OnTime」もJavaプログラムを使っていますが、NotesとJavaはかなり相性が良いので、皆さんもJavaを覚えてNotes アプリケーションをレベルアップしましょう!



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




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

2017年7月22日土曜日

Dominoでアクセス禁止ページを設定してみよう!

皆さん、こんにちは。

しばらく記事が書けずにいました。
ここのブログの他にも、ブログ記事を書くことになってしまったので、おろそかになっていました。
(まぁ、理由はそれだけではないのですが・・・)


さて、今日はXPagesもアプリ開発も何も関係ない話題です。

かなり前の話になりますが、
Prominic.NET
というホスティング業者がIBM Champions for ICS向けに開発用としてIBM Notes/Dominoシステムを無償で提供しますよ。
という話がありました。
詳しくはこちら→Hosting for IBM Champions - Prominic.NET

NRPCアクセスやWebアクセスができるものということでかなり便利に使えそうなので、申し込んでみました。
Webアクセスを許可しているため、インターネットドメインの取得だけは別途行う必要があるのですが、IBM Notes/Dominoを購入することに比べたら、微々たるものなので、潔く購入しました。

この後は所定の手続きに従って、連絡を待っていました。
数日後には、なんとまぁ、私専用のDominoサーバが構築されてそこにアクセスするためのIDも送られてきましたよ。
嬉しいですね。
今まで、Dominoアプリのデモをするには、自分のPCにインストールしてあるDominoサーバを起動していたので、準備に時間がかかることかかること。
それがすぐにデモを見せられるようになったのは嬉しいことです。


ところで、自分用のDominoがWebサーバとしてインターネット上にあるということは、不正なアクセスをしてこようとする人も少なからずいるわけです。


デモ環境として利用しているので大事なデータはおいていませんが、やはり気持ちいものではありません。

そこで、アクセスされて困るNotes DBはブロックするようにします。
一番簡単なのは、ACLを変更することです。
ですが、これだと、ログイン画面が表示されたり、HTTP500のエラーページが出るなど、
Notes DBが存在していることが分かってしまいます。

今回は、そういったことが分からないようにするための仕掛けを見ていきましょう。

やりたいこと
1.アクセスされて困るNotes DBにアクセスできないようにする
2.存在しないDBのURLを入力されても同じようなエラーを返すようにする

としておきます。


手順は次の通りです。
1.「Domino Web サーバー設定」DBを作成する。
 「Domino Web サーバー設定」(domcfg5.ntf)というテンプレートを元に、「domcfg.nsf」という名前でNotes DBを作成します(ファイル名は決まりです)。
 ※テンプレートを引き継いで設計のチェックは外しておきましょう
Domino Webサーバー設定DBを作成する

2.「エラーと返答フォームマッピング」の文書を作成する
 「エラーと返答フォームマッピング」ビューを開いて、[マッピングの追加]アクションを実行します。
 新規文書作成画面になるので、そのまま[保存して閉じる]アクションを実行します。

3.エラー画面を作成する
 IBM Domino Designerを使って、domcfg.nsfに「CustomGeneralErrorForm」という名前のフォームを作成します。このフォーム名は、先ほど作成したマッピング文書の中に指定されていた名前になります。
今回は、こんな画像を貼り付けたフォームにしてみました。
アクセス禁止用のフォーム設計
また、「HTML Head Content」にページのタイトルも設定しています。

4.Webアクセスを禁止したいNotes DBの設定を行う
WebからアクセスしてほしくないNotes DB(ドミノディレクトリやlog.nsf等)のDBプロパティを開いて
「URL参照を許可しない」にチェックを付けます。
URL参照を許可しない

これで完了です。

実際の画面を見てみましょう。

まず、設定適用前のエラー画面がこちらです。
「URL参照を許可しない」にチェックを付けていると、HTTP500のエラーを返します。
このチェックを外していると、ログイン画面が表示されます。
「URL参照を許可しない」にチェックを入れただけの場合

次に、「URL参照を許可しない」にチェックを入れて、なおかつdomcfg.nsfに「エラーと返答フォームマッピング」文書を追加してエラーフォームを作成したときの状態です。
作成したエラー画面が表示される


どうでしょう?簡単ですよね。

手順は、
Web サーバーのメッセージをカスタマイズする
に出ているので、詳しくはそこを参照してください。



実際には、Domino Webサーバのセキュリティを強化する方法はいくらでもあります。
IBM Lotus Domino Web サーバーをセキュアにする
こちらのドキュメントを読むと、よくわかると思いますので、自社のDominoのセキュリティが不安だという方は読んでみましょう。



では、今日はこの辺で・・・




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

2017年5月12日金曜日

西暦和暦変換をやってみよう

皆さん、こんにちは。
気が付いたら、黄金週間も終わって、しばらくは連休がない日が続くことになっています。
そう考えると憂鬱になりますね。5月病かな(笑)


さて、今日はしばらく記事を書いていなかったので、単なるネタ記事です。


今日も、どこぞでどなたかが呟いていましたが(スミマセン、こっからネタ拝借ですw)、今年って平成xx年だっけ?
かくいう私もよく忘れるので、Excelで変換して確認しています。


しかぁし!


Notes技術者たる者、Excelに頼ってはいかぁん!!
ということで、Notesで計算させることにしました(笑)

@関数を使って実現する方法を探したところ、西暦の年数から引き算をするという何とも原始的な方法しか見つかりませんでした。
だったら電卓使って計算するわ(<=暗算しろよ・・・とかいうツッコミは不要)!

ということで、LotusScriptを使ってできるかどうかを調査してみました。


・・・
はい、ありました。
Format関数です。
Format 関数 (LotusScript 言語)
第一引数に日付を与えたら、第二引数に日付/時刻の形式コードから「ggg」と「ee」(それぞれ元号と元号に基づいた年)をセットします。
これで日付に基づいた元号と年が表示されます。
簡単ですね。


ということで、サンプルです。
これは、フォーム内の「InputDate」というフィールドに入力された西暦の日付を和暦に変換して「OutputDate」というフィールドにセットするものです。


Sub Click(Source As Button)
    Dim uiws    As New NotesUIWorkspace
    Dim uidoc   As     NotesUIDocument
    Dim inputDT As     String
    Dim convDT  As     String
    
    Set uidoc = uiws.CurrentDocument
    
    inputDT = uidoc.FieldGetText("InputDate")
    convDT = Format( Cdat(inputDT), "gggee年mm月dd日" )
    
    Call uidoc.FieldSetText( "OutputDate", convDT )
End Sub


下図はこのプログラムを埋め込んだサンプル画面です。
西暦を和暦に変換する

画面デザインさえ凝らなければ、ものの数分で作れます。
さすがNotesですね。


このサンプルDB、ほしい人は弊社宛ににメールください(メールアドレスは探してくださいね) 。
今回は、無料で差し上げます。ただし、サポートは一切ありませんので悪しからず。

いらないよね(笑)




確かそのうち、平成の元号も変わるよね?とかなんとかで、和暦の計算がだんだん難しくなります。
Notesは元号が変わったら、Feature Packで対応してくれるのかな?とかいらぬ心配をしています(笑)



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





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

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 カスタマイズとセキュリティ強化 - 株式会社エフ