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

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

2017年8月28日月曜日

IBM Domino 9.0.1 Feature Pack 9をインストールしてみました

皆さん、おはようございます。
今週で8月も最後です。つまり今年はあと4ヶ月ほどになります。
早い、早すぎる・・・一年ってこんなに短かったっけ?というくらいに早いです。

なので、色々と早くやらないといかん!ということで本日の話題に行きます。

皆さん、ご存知かと思いますが、先日IBM Notes/Domino 9.0.1 FP9がリリースされました!(実は前回の記事を公開したときには、すでにリリースされていたというオチも・・・)

FP8が2017年3月上旬にリリースされて以来、約5カ月ぶりのリリースです。
私の見立てでは、9月末にリリースかなぁなどと勝手に予想していたので、ちょっと慌てています。

ですが、リリースされた以上、検証しないわけにはいかないので、早速?インストールしてみました。


まず、Feature Packの入手方法は、前回(FP8)と同じく、Fix Centralから行えます。
https://www-945.ibm.com/support/fixcentral
からダウンロードできました(要IBM ID)。

今回は先にDominoをインストールしたのでそちらの紹介から。
私の環境はWindowsの64bit版をつかっているので、「DominoServer_901FP9_W64」を選択してダウンロードしました。
ダウンロードした「domino901FP9_w64.exe」を実行するだけなのも前回と変わらずです。
粛々と実行して、インストールしましょう。

今回も テンプレートが更新されていますので、それもダウンロードしておく必要があります。
FP9で提供されているテンプレート

FP8では、ドミノディレクトリとメールだけでしたが、FP9ではそれに「DJX管理ツール」「個人アドレス帳」が追加されています。
細かいところは調査していませんが、「個人アドレス帳」が更新されているので、各クライアントに配布して設計の置換をしてもらうという作業が必要になるでしょう。

さて、インストールが完了してDominoを起動したので、本当にFP9になっているかを確認しましょう。
下図は、Domino Consoleを起動して、「show server」コマンドを実行したものです。
sh servreの結果

赤枠で囲ってあるように、IBM Domino 9.0.1 FP9になっていますね。

この後、テンプレートの置換を行います。ドミノディレクトリも更新されていますので、行いましょう。
ここで朗報です!
FP8までは、「pubnames.ntf」と「djxdd.ntf」のBDタイトルが同じで、区別がつかない!と言っていましたが、
FP9で見事にDBタイトルが修正されました\(^o^)/
これでもう間違えないで済みますね!
テンプレートのタイトルが!!

どうせ、直ってないだろうと思い込んでいた方は、気を付けましょう。見つかりませんよ(笑)




さて、ここで終わってしまっても良いのですが、あまりにもあっさりしすぎているので、新機能についてもいくつか見ていきましょう。

新機能については、フィーチャーパック 9 の新機能に記載されていますので、熟読しましょう!

当ブログでは、これらのうち、「Domino REST API の機能強化」について触れていきます。
まあ、RESTと聞いたら黙ってられませんからね。

まず、「添付ファイルサポートの改善
FP8までは、REST APIでNotes文書の情報を参照した時、文書内に添付ファイルが存在していると、BASE64でエンコードされた状態でデータが表示されていました(下図参照)。
添付ファイルがBase64でエンコードされている
これはこれで便利なのですが、添付ファイルの容量が大きい場合、JSONデータも大きくなってしまいます。その結果、レスポンスが遅くなるという事が懸念されます。

そんな時に文書参照用のREST APIのURLに「?attachmentlinks=true」を追加すると、添付ファイルデータがリンク情報を返すようになります。
添付ファイルはリンク情報として表示されている

これなら、レスポンスデータのサイズも小さくなりますね。
添付ファイルそのものは、JSONデータ内の「contentLocation」アイテムの値にあるURLから取得することができます。
添付ファイル名が日本語の場合、エンコードされたままになってしまうのでそこだけ注意しましょう。


次に、「全文検索スコア」です。
REST APIで検索を行うと、相対検索スコアが表示されるというものです。
おそらく、Notesクライアントで全文検索をしたときの「関連度順」にソートする際に利用されるデータのことではないかと思います。
こちらは実際に試してみましょう。
Notes アプリケーションでDomino Data Serviceが使えるようにしておきます。文書を参照するので、「ビューと文書」にしておきます。
Domino データサービスを有効化しておく

検索用のビューでもDomino Data Serviceを有効化しておく必要があります。
ビューでも有効化しておく

また、Notes アプリケーションに全文索引を作成しておく必要があります。

REST APIでの検索は、次のように行います。
http://[Dominoサーバーホスト名]/[Notesアプリケーションパス]/api/data/collections/unid/[ビューのUNID]?search=[検索条件]

実際に実行した結果は下図の通りです。
検索結果の表示

各文書の項目に「@score」というのがありますね。これが相対検索スコアです。JSONデータを取得したら、この順序でソートすれば、関連度順に並べることが可能になりますね。

ちなみに、FP8で同じ検索を行った時の結果は下図の通りです。
「@score」という項目がないことに注目してください。
@scoreがない


最後に、「管理者による REST リソースのより詳細な制御」です。
こちらは、
DAS_DATA_DB_COLLECTION=0
をDominoサーバのnotes.iniにセットすることでREST APIによるDomino サーバのアプリケーション一覧の表示をできなくするようにするものです。
これをせっていしておけば、DominoサーバにどんなNotes アプリケーションがあるのかを隠すことができますので、設定しておくのは良いと思います。

この設定をしていない場合、
「http://[Dominoサーバーホスト名]/api/data」とすると、下図のようにNotes アプリケーションの一覧が表示されます。
Notesアプリケーションの一覧

しかし、Dominoサーバーコンソールで
set con DAS_DATA_DB_COLLECTION=0
とした後に再度ブラウザで開いてみると・・・
Notesアプリケーションの一覧がエラーになる

このように403エラーになります。
Notes アプリケーションの一覧は表示できませんが、Data Serviceが有効になっているNotes アプリケーションに対してREST APIのコマンドは有効なままになっています。

元に戻すには
set con DAS_DATA_DB_COLLECTION=1
とすればOKです。



もう一つ、新機能の紹介をしておきましょう。
既存メッセージでのメールルールの実行をユーザーに許可する」です。
これは、今までのバージョンでできなくて苦労したという方は多いのではないでしょうか。

今までは、ルールを作成しても、有効化された後に受信したメールしか適用されず、「受信ボックス」の中がごちゃごちゃになっていることがありました。

ですが、この機能を使うと、ルールを作成する前に受信していたメールに対してもルールを適用することができるようになります。

手順は次の通りです。

1.メール設定ポリシー文書を作成/更新する。
ドミノディレクトリをFP9のテンプレートで正しく更新できていることが前提条件です(当たり前ですね)。
ドミノディレクトリを開いて、メール設定ポリシー文書を作成します(すでに作成してある場合はそれを編集モードで開きます)。
新規に作成する場合、[設定][ポリシー][設定]ビューを開いて、[設定の追加...][メール]アクションを実行します。
メール設定ポリシー文書を作成

[基本]タブの「名前」欄に任意の値を入力します(必須項目です)。
[メール][基本]タブを開きます。
「メールビューとフォルダの管理」というセクションに「既存のメールでルールの実行を有効にする」という項目があるので、そこにチェックをつけて保存します。
※他の項目は、自分の環境に合わせて設定してください。
メール設定ポリシー文書の[メール][基本]タブ

作成したメール設定ポリシー文書をポリシー文書に関連付けさせます。
ポリシー文書にメール設定ポリシー文書を関連付けさせた

念のため、Dominoサーバーと対象ユーザーのNotesクライアントを再起動します。


2.メール文書でルールを作成する
DominoサーバーとNotesクライアントの再起動が完了したら、メールDBを開きます。
こちらのメールDBはFP9のメールテンプレートで設計の置換が行われている必要があります(これも当然ですね)。

そうしたら、ルールを適用したい既存文書用のルールを作成します(すでに作成してあるルールが利用できそうであれば、この作業は不要です)。

私はテストのために以下のルールを作成してみました。
新規ルールを作成

3.メールのプリファレンスを修正する
メールのプリファレンス画面を開きます。
すると、[メール][基本]タブに「メールを閉じるときにルールの実行を有効にする([メール]タブを再度開いたときに有効になります)」という項目が追加されていることが分かります。
ここにチェックが付いているはずです。もしチェックが付いていなければ、チェックをつけて[OK]をクリックしてください。
メールのプリファレンス

プリファレンスを変更した場合、一度メールDBを閉じて、開きなおします。


4.ルールを実行する
メールDBを開いたら、[オプション][ルール][ルールの実行]アクションをクリックします。
ルールの実行アクション

「既存のメールでルールを実行」ダイアログが表示されるので、実行したいルールを選択して[選択したルールの実行]アクションをクリックします。
※ルールが1文書しかなくても必ずチェックをつける必要があります
選択したルールの実行

実行するかどうかの確認ダイアログが表示されるので、[OK]をクリックします。
確認ダイアログ

ルールの実行が完了すると、その旨を知らせるメール文書が作成されます。
自動応答文書

実際にルールも適用されました。
送信エラーレポートフォームの文書がエラーフォルダに移動している



どうでしょう。
これだけでもFP9にバージョンアップしたくなりませんか?

他にもいくつか機能が用意されています。
残念ながら私が保有しているテスト環境では、その他の新機能を試すことが出来そうになかったので、皆さん自身の目で確かめてみてください。






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


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

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