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

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

2018年1月28日日曜日

フォームのアクセス権をプログラムで制御する

皆さん、こんにちは。
いつも冬になると寒いなぁと感じていますが、今年は特に寒さが厳しく感じますよね。
いつも2月が寒さのピークだと思っていますが、1月でこの寒さだと2月になったら・・・
考えるのも嫌になります。

さて、今日は前回(というか前日)の予告通り、
「フォームで文書を作成できるユーザー」の情報をLotusScriptで取得できないものかどうかを確認してみます。
Notes DBは前回作成したものを利用します。

1.なぜ確認するのか?

まずは、なぜ確認する必要があるのかを考えてみます。
少なくともNotesクライアントで利用している場合、「フォームで文書を作成できるユーザー」の設定が行われていれば、自動で制御が行われて、文書が異常に作成されることはなさそうです。
ただし、バックエンドで文書を作成後、その文書を編集するという荒業があるので、確認はできた方が良さそうです。
また、最近はNotesクライアントでの利用ではなく、Webブラウザからの利用を推進する動きもありますので、Webブラウザでの動作についても確認する必要があるでしょう。


2.Web画面で実行するとどうなる?

ということで、Webブラウザで実行するとどうなるかを確認してみましょう。
Webブラウザで動かすには、クラシックWeb(従来のWeb化の方法で、フォームやページを使って行うものですね)とXPagesを使う方法があります。

さきにクラシックWebで行ってみます。
クラシックWebの場合、Notesクライアント用に作成したNotes DBでも改修をしなくてもそこそこ動いてくれるのがいいところですね。
なので、ビューをそのままWebブラウザで表示して、@Command([Compose];"フォーム名")のアクションを実行してみました。

結果はこちら・・・
WebブラウザでのComposeコマンド実行

なんと、エラーになりました!
素晴らしい!ちゃんと「フォームで文書を作成できるユーザー」に設定されている内容を認識するようです。
ただ、エラーメッセージが分かりにくいですね。「アクセスが認証されていません。」だとログインそのものに失敗したのかな?とか変な心配をしてしまいそうです。
ちなみに、設定されているユーザーの場合は、Webブラウザでも新規に文書が作成できました
少なくとも、本来作成できてはいけない文書が作成されるという事はなさそうですね。


3.XPagesの場合はどうなる?

では、つぎにXPagesで試してみましょう。
XPagesの場合、文書を作成するためのページを開いて、そのページの中で「データソース」をバインドするというちょっとやり方になります。

まず、文書を作成するためのページを開くために、ビューページで次のようなアクションを作成しました。
指定したページを開く
このアクションを実行したところ・・・
見事にページが開いてしまいました。
文書を作成するためのページ
NotesクライアントやクラシックWebでは、そもそもこの段階まで進むことができませんでしたので、すでに動きが違うことが分かります。
でも、文書が保存できなければOKですよね。

ではフィールドに値を入力して、保存してみます。
保存にはシンプルアクションの「文書の保存」を選択しました。
現在の文書を保存するというシンプルアクション

結果は・・・保存できちゃいました。
XPagesだと文書が保存できちゃう・・・
あれ?あれれ?
ダメじゃん!XPages!ちゃんと「フォームで文書を作成できるユーザー」を見てよ!困るじゃん!

はい、そういうことで、XPagesの場合は、どうやらバックエンドで文書を作成しているのと同じような動きをしているようです。
これは困りましたね。


4.制御の仕方を考えてみよう

ということなので、やはり「フォームで文書を作成できるユーザー」の値が取得できる必要がありそうです。
では、どうやったら取得できるのでしょうか?
この値はフォームそのものに影響を与えるということは前回の記事の中で紹介しています。
ということは、フォームの情報を取得できれば良さそうだということが考えられます。
IBM Notes/DominoのLotusScriptクラスにはNotesFormというクラスが用意されていますので、そちらを確認してみます。
FormUsersというプロパティがあります。どうやらこれで取得できるのではないでしょうか?
FormUsersプロパティの説明

そこで以下のようなプログラムを作成してみました。
Sub Click(Source As Button)
    On Error Goto ErrProc
    
    Dim session As New NotesSession
    Dim db      As     NotesDatabase
    Dim form    As     NotesForm
    Dim ret     As     String
    
    Set db   = session.CurrentDatabase
    Set form = db.GetForm( "メイントピック" )
    
    ret = "【フォームで文書を作成できるユーザーの一覧】"
    Forall x In form.FormUsers
        ret = ret & Chr$(10) & x
    End Forall
    Msgbox ret, 0 + 64, "FormUsersの確認"
    
    Exit Sub
ErrProc:
    Msgbox _
    "エラー行数:" & Cstr(Erl) & Chr$(10) & _
    "エラー番号:" & Cstr(Err) & Chr$(10) & _
    "エラー内容:" & Error, _
    0 + 16, "FormUsersの確認"
    
    Exit Sub
End Sub

実行した結果は下図の通り。
実行結果

確かに取得できているようです。
あとは、実行しているユーザーがこのユーザー(及びグループ)に合致しているかどうか(グループの場合メンバーかどうか)を確認して文書の作成を許可するかどうかを決めればよいでしょう。

XPagesの場合、LotusScriptではなく、SSJSになりますが、SSJSにもNotesFormクラスがあります(getFormUsers()で取得できます)ので、同じように制御することができるでしょう。


5.まとめ

なかなか難しい話になってしまいましたが、いかがでしたか?
フォームのアクセス権についてはヘルプでもさらっと書いてあっておしまい。なので、なかなか詳細を理解している人は少ないのではないかと思います。
かく言う私も今回色々と調べて分かったことがたくさんありました。

分からないことが起きたら、慌てずにどういうことが起きているのか、本当ならどうなっているべきなのか等々、整理しましょう。
そこから、解決への糸口が見つかるかもしれません。
他の人に質問するにしても、問題が整理されていれば、相手もどこから調べていけばいいのかすぐにわかります。
いちいち整理している暇なんてないよ!すぐにできなければ困るんだ!
という場合であっても、結局はきちんと整理してから調査した方が早いということは多々あります。


今回の場合は、NotesFormクラスのFormUsersプロパティを使うことで、誰がこのフォームで文書を作成してよいのかどうかが分かることが理解できていただければOKでしょう。



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


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

フォームのアクセス権について

皆さん、こんにちは。
もうすぐ1月も終わろうというのに、気がかりなことがあります。
それは・・・
2018年度のIBM Championsの正式なアナウンスがまだされてない!ということです。

例年であれば、12月中には発表されるのですが、2018年度のIBM Championsの発表は翌年の1月になりますよ。という通知が来たので、「年越しかぁ、嫌だなぁ」と思っていました。
なかなか発表されないなぁ。と思っていたら、
2018年1月12日 17:10過ぎに、メールが届きました!!
You're a 2018 IBM Champion!

わーい\(^o^)/ って、正式アナウンスは???
いつも、正式アナウンスがあってメールが来るじゃないか!?
ということで、正式アナウンスが行われる(はず)のブログ(IBM Champion Program News and Views)をチェックしてみました・・・

あれ???載ってない。どういうこと???

どうも、今回は全ブランドのIBM Championを一斉に発表しようとしているらしく、その作業に追われているようで、遅れている模様です。
うーん・・・全ブランドのIBM Championって何人くらいなんだろうか?ICS関連だけで百数十名ですから、600名近くになるのかな?それを一斉に発表って、そりゃぁ時間もかかるでしょう。

ということで、正式アナウンスはまだ(2018/01/27現在)ですが、そのうちされると思いますので、気長に待ちましょう。


さて、雑談はこれくらいにしておいて(長いな・・・)、本題に入りましょう。

今回はフォームのアクセス権について調べてみました。

1.アクセス権とは何?

フォームのアクセス権について触れる前に、Notes文書のアクセス権について触れてみます。
IBM Notesでは文書のアクセス権というのはよく聞くと思います。
「読者フィールド」に設定してあるユーザーしか、その文書を読むことができない、また、「作成者フィールド」に設定してあるユーザーしか、その文書を編集することができない(ACLのレベルが"作成者"の場合のみ)というものですね。
ただし、正確に言うと若干違います。
「フィールド」はフォームに設定してあるものです。文書が持つものは「フィールド」ではなく、「アイテム」です。
文書をコピーして、別のNotes DBに貼り付けたとします。
貼り付けた先のNotes DBに「読者フィールド」がなくても「読者」のアイテムに設定されている人しかその文書を読むことができないですよね。
つまり、文書のアクセス権とは文書ごとに設定されるものであるということです。

2.フォームのアクセス権て何?

では、フォームのアクセス権とは何でしょうか?
実際にはそういった用語はなさそうなので、ここでは私が理解していることを伝えていきます。
下の図は、Domino Designerで開いたときの「フォーム」のプロパティです。
一番右の「セキュリティ」タブ(一番右側)を開いたときの状態です。
フォームのアクセス権
ここを見ると、「フォームで作成した文書のデフォルトのアクセス権」という項目と「フォームで文書を作成できるユーザー」という項目があります。

文書のアクセス権と同じように考えると、
フォームで作成した文書のデフォルトのアクセス権」は、文書のアクセス権のデフォルト値を設定する。
フォームで文書を作成できるユーザー」は、文書を作成できるユーザーを設定する。
となりそうです。
さて、実際のところはどうなんでしょうか?



ということで、百聞は一見に如かず!ということで試してみましょう。


3.フォームのアクセス権を設定してみよう(1)

まず、「フォームで作成した文書のデフォルトのアクセス権」について設定しましょう。
Domino Designerでフォームを作成します。
その後、フォームのプロパティの「セキュリティ」タブを開きます。
"読者以上すべて"のチェックを外すと、下の選択肢がアクティブになるので、リストの中から設定したいユーザーにチェックを付けます。
このリストに表示されているのは、Notes DBのACLエントリ及びロールです。そこにないユーザー/グループを設定する場合は、右側にある人の形をしたアイコンをクリックして、ドミノディレクトリから設定することも可能です。
フォームで作成した文書のデフォルトのアクセス権
今回は、図に見えている3つのユーザー/グループを設定しました。
これでフォームを保存して、実際に文書を作成・保存してみました。
なお、比較のために、「フォームで作成した文書のデフォルトのアクセス権」を変更する前の状態で文書を作成してあります。

その結果が、こちらです。

比較してみたところ、設定変更後の文書には「$Readers」というアイテムが余分に作成されていました。
アイテムの属性や値は下図の通りです。
$Readersアイテムがある

 属性(フィールドフラグ)は、"SUMMARY READ-ACCESS"となっています。これは「読者」を表しています。値は、上の「フォーム」で設定したものと一致しています。
つまり、この文書はここに設定してあるユーザー及びグループのメンバーのみ読むことができるという事になります。
 デフォルトの状態("読者以上全て"になっている)で文書を作成した場合、この「$Readers」というアイテムは文書には作成されません。
これは誰も文書を読むことができないというわけではなく、このNotes DBに読者以上のアクセス権を与えられているユーザは全員、読むことができるという事です。


4.フォームのアクセス権を設定してみよう(2)

つぎに「フォームで文書を作成できるユーザー」を設定します。動きを分かり易くするために、「フォームで作成した文書のデフォルトのアクセス権」の値はデフォルト値に戻しておきます。
フォームで文書を作成できるユーザー
設定した値は「LocalDomainAdmins」というグループにしました。私のDomino環境の中で管理者ユーザ―として設定しているグループです。
これでフォームを保存してみました。

さて、どうなるでしょうか?
まずは、管理者グループに含まれるユーザーで見てみます。
文書を作成できるということで、[作成]メニューに表示されるかどうかを確認してみました。
・・・無事に表示されています。
[作成]メニューに表示されている

ここから文書を作成して保存してみましたが、デフォルトの設定で作成したものと変わりはありませんでした。

では、次に設定されていないユーザー(ACLでは「作成者」権限を付与してある)で試してみました。
先ほどと同じように、[作成]メニューから文書を作成しようと・・・
あれ?メニューに表示されてないぞ!?
[作成]メニューに表示されない!?

はい。その通りです。
「フォームで文書を作成できるユーザー」ですから、そこに設定されていないユーザーは、新規に文書を作成することができないのです。

つまり、この「フォームで文書を作成できるユーザー」という設定は、文書に影響を与えるものではなく、フォームそのものに影響を与えるものなのです。

しかし、ここで諦める(?)にはまだ早いです!


5.@関数で文書の作成はできないのか?

はい。IBM Notesには@Command([Compose];"フォーム名")というコマンドがあります。
これを使えば、[作成]メニューからでなくても文書を作成することができます。
これをNotes DBに設定してみて、そこから文書を作成することができるかどうか試してみました。
その結果がこちら・・・
Composeコマンドで試みたが・・・
あえなく撃沈しました(笑)
まぁ、当たり前ですよね。作成できるリストに入ってないのですから。IBM Notesからすれば、「何やってんだよ!作成させないって言ってんだろ!」というところでしょうか。


しかし!我々にはまだLotusScriptという武器があります(笑)

6.LotusScriptだったら?

LotusScriptで新規文書を作成する場合、NotesUIWorkspaceクラスのComposeDocumentメソッドを使用します。
サンプルは当ブログの文書の作成に出ていますので、そちらを参照ください。
ということで、プログラムを作成して実行してみました。

結果は・・・
Composeコマンドの時と同じエラーで撃沈しました(笑)
まぁ、同じことをやっているので、この結果は想定できていました。
IBM Notesも「懲りないやつだなぁ」と思っていることでしょう。

いや、まだだ!
LotusScriptにはバックエンドクラスというものがある!
そうだ、バックエンドで文書を作成したらどうなるんだ!?

ということでやってみました(笑)
ソースはこんな感じです。
Sub Click(Source As Button)
    On Error Goto ErrProc
    
    Dim session As New NotesSession
    Dim db      As     NotesDatabase
    Dim doc     As     NotesDocument
    Dim uiws    As New NotesUIWorkspace
    
    Set db  = session.CurrentDatabase
    Set doc = db.CreateDocument
    Call doc.ReplaceItemValue( "Form", "fsMain" )
    Call doc.ReplaceItemValue( "Subject", "バックエンドで文書を作成" )
    Call doc.ReplaceItemValue( "Categories", "LotusScript" )
    
    Call doc.ComputeWithForm( True, True )
    Call doc.Save( True, True, True )
    
    Call uiws.ViewRefresh()
    Exit Sub
ErrProc:
    Msgbox _
    "エラー行数:" & Cstr(Erl) & Chr$(10) & _
    "エラー番号:" & Cstr(Err) & Chr$(10) & _
    "エラー内容:" & Error, _
    0 + 16, "バックエンドで文書を作成"
    
    Exit Sub
End Sub



あえて、NotesDocumentクラスのComputeWithFormメソッドを使ってフォームで再計算させるようにしています。

で、実行してみました。
結果がこちら。
バックエンドで文書を作成したら・・・


えーっと・・・
作成できてしまいました(笑)
惜しい、惜しいぞ!
正直、ComputeWithFormを実行した段階で、「アクセス権がありません」というエラーが出るのを予想していたのですが、見事にスルー!

うーん・・・どうなんでしょうね。
まぁ、フォームの画面を見ながら作成するわけではないので、思ったように文書を作成するのは難しいということで、良しとしましょう(笑)



7.まとめ

今回は、フォームの「フォームで作成した文書のデフォルトのアクセス権」という項目と「フォームで文書を作成できるユーザー」について調べてみました。
両方とも、Domino Designerで見たときのフォームのプロパティであるにも関わらず、片方は作成された文書に影響するものですが、もう片方はフォームそのものに影響を与えるという、同じ括りにするにはちょっと違和感があるようなものでした。

これらのプロパティの意味が分かってくれれば、今回の記事を書いた意義があるというものです。
さて、次回の予告ですが、 「フォームで文書を作成できるユーザー」の情報をLotusScriptで取得できないものかどうかを確認してみます。
(本当はこれを書きたかったけど、持っていきかたを間違えた・・・orz)





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




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

2018年1月1日月曜日

JavaScriptによるイベントの確認

新年、明けましておめでとうございます。


さて、ということで、どこかの誰かさんが「新年のブログまだですか?」とか言うので、書いてやろうじゃないか!と思ったので書いてやる次第です(笑)
新年になって早々・・・

内容は、昨日書いた
LotusScriptによるイベントの確認
に対して、JavaScriptによるフィールドイベントの確認についてです。

JavaScriptはNotesクライアントでも動きますが、LotusScriptで書いた方が楽ですから、
ここではWebクライアントおよびXPagesでの動作について書いていきます。

検証に使用するNotes DBも昨日と同じものを利用します。


1.クラシックWebの場合
クラシックWebでのフィールドイベントを設定する方法は、Notesクライアントとほぼ同じです。
フォームのフィールドを選択して、「OnChange」「OnBlur」イベントに記述するだけです。
WebでのonChangeイベント
「実行」の個所を"Web"、"JavaScript"にして、コードを記述すればOKです。
上の例は「fldText」というテキストフィールドの「onChange」イベントに記述しています。
コードの内容はWebブラウザのコンソールログにメッセージを表示するものです。
すでにNotesクライアント用のコードが記述してあるので、左側のところが上下の二色になっています。
同じように「onBlur」イベントにもコードを記述してみました。
設定自体は簡単ですね。

実行してみた結果がこちらです。
コンソールログへの表示なので、Webブラウザで「F12」キーを押してデバッグモードにしています。
クラシックWebでの実行結果

画面下部の赤枠部分を見てください。
Notesクライアントの場合、OnBlurイベントが発生してからOnChangeイベントが発生していましたが、
WebではonChangeイベントが先に発生しています。
NotesクライアントをWeb化しようとする場合、ここでは注意が必要という事ですね。

では、XPagesの場合はどうでしょう?

2.XPagesの場合
XPagesの場合、フォームに設定・・・はできませんので、XPage画面を作成してその中で設定します。
下図のような画面を作成して、イベントにコードを記述してみました。
XPagesのCSJSでイベントチェック

編集ボックスコントロールを配置して、そのonblurイベントにCSJS(クライアントサイドのJavaScript)を記述してみました。コードの内容は先ほどのクラシックWebのものと同じです。
同様にonchangeイベントにも記述してあります。
実行結果は下図です。
CSJSでのイベント確認の実行結果

クラシックWebの時と同じようにテキストフィールドに値を入力して、他のフィールドに移動してみたところ、
onchangeイベントが発生してからonblurイベントが発生しました。
Web系ではonchangeが先に発生するようですね。


XPagesの場合、CSJSだけでなく、SSJS(サーバーサイドJavaScript)での記述もできます。
こちらは少し面白い結果が出ました。

SSJSの場合、Dominoサーバーにイベントが送られるので、「サーバーオプション」を"更新なし"以外にする必要があります。
SSJSでのイベントチェック

実行結果は次の通りです。
SSJSでの実行結果

SSJSの場合、onchangeイベントはフィールドから移動しなくても発生します。
サーバーに随時値を送っているからだと思われます。
上の図で時間が少し開いているのは、値の変更後、すぐにフィールドを抜け出てしまうと、onblurイベントがなぜか発生しなくなるからです。
これもサーバーで処理をしている関係なのでしょうか?


さらに、SSJSとCSJSの両方にonblur、onchangeイベントを記述しておくと、onblurとonchangeが同時に発生しても、CSJSのonblurも実行されなくなります(フィールドの値を変更すると、onchangeしか発生しない。フィールドの値を変更しないでフィールドから外れるとonblurは発生する)。

細かい検証をしたわけではないので、正しく動いてくれているかどうかは不明ですが、実装する際は気を付けてみてください。






それでは今日はこの辺で。
今年も当ブログをよろしくお願いいたします。


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

2017年12月31日日曜日

LotusScriptによるイベントの確認

皆さん、こんにちは。

2017年もついに終わりを迎えますね。

今年は皆さんにとってどんな一年だったでしょうか?
私は後半、自信を取り巻く環境が大きく変わりました。まだ、その変化に自分自身が付いていけてない部分がありますが、年が明けたらそうも言ってられないのでなんとか気持ちを切り替えていこうかと思います。


さて、今年最後の記事は、
IBM Verse ExtensibilityにしようかXPagesにしようか、Watson Work Spaceにしようか等々色々迷いましたが、
NotesエンジニアはまだまだLotusScriptが好きだろうという事で
LotusScriptでのイベントの確認をやってみます。
何気に書いてなかったんですね。

ただ、普通にQueryOpenとかQueryCloseとかについて書いても面白くないので、
今回はフィールドのイベントであるOnBlurとOnChangeについて検証してみます。

いずれのイベントも元々はWebで利用するためのものです(下図参照)が、
OnBlurイベントのデフォルト設定
「実行」と書いてある場所を"Web"から"クライアント"に変更すると、右側の"JavaScript"の選択肢に"LotusScript"が追加され、Notesクライアントでの動作の場合、LotusScriptで記述できるようになります。

では、このOnBlurとOnChangeはどういったイベントなのかを見ていきましょう。

Designerヘルプによると、
OnBlurは
編集モードでカーソルがフィールドから抜け出たときに発生します。
注: このイベントは R6 で新しく追加されました。

とあります。
あれ?フィールドから抜け出たときのイベントなら「Exiting」があったよね?と思う方もいることでしょう。
そこでExitingについてのヘルプを見てみると、
編集モードでカーソルがフィールドから抜け出たときに発生します。
注: Release 6 以降では、OnBlur を使用することをお勧めします。

とあります。
うん、やはり同じ意味のイベントですね。
ですが、R6以降はOnBlurを使ってね。とあります。
R5以前からIBM Notes/Dominoを利用している方で、すでにR6以降にバージョンアップした方は修正するようにしましょう。

OnChangeイベントの方はどうでしょう?
編集モードでフィールドを変更したときに発生します。
注: このイベントは R6 で新しく追加されました。

このイベントは、フィールドにフォーカスがあたっている間に値が変更され、その後フィールドがフォーカスを失った場合に発生します。
とあります。
つまり、OnBlurと同時期に発生するイベントですが、フィールドの値が変更されていないとイベントは発生しないという事になります。


では、フィールドの値が変更されるとはどういったことを意味するのでしょうか?
テキストフィールド、数値フィールド、日付フィールド、チェックボックスフィールド等のOnBlurイベント、OnChangeイベントに

Sub Onblur(Source As Field)
    Msgbox "<フィールド名> <イベント名>", 0 + 64, "イベントテスト"
End Sub


といった形でLotusScriptを記述してみました。
すると、
ただ単にフィールドをクリックして、別のフィールドに移動した場合、
OnBlurのイベントが実行されて、メッセージボックスが表示されました。
フィールド間を移動しただけの時

続いて、フィールドの値を変更してから別のフィールドに移動してみたところ、
OnBlurイベントが発生してメッセージボックスが表示された後に、OnChangeイベントが発生して対応するメッセージが表示されました。
フィールドの値を変更してから別のフィールドに移動した時

フィールド間の移動は、マウスクリックでもいいですし、キーボードでTabキーを押したときでも反応します。入力デバイスを意識しなくていいのは助かりますね。

また、チェックボックスフィールドやラジオボタンフィールドで選択肢を変更しても反応するし、 テキストフィールドで文字列を入力してもOnChangeイベントが反応してくれるのも嬉しいポイントです。

こういったイベントはWebでは当たり前に行えているのですが、LotusScriptだとできないのかな?と思い込んでいた人もいるのではないかと思います。

まだまだLotusScriptは使ってない機能が多数あると思いますので、是非探してみてください。
きっと今あるアプリケーションをレベルアップできると思います。


それでは今年はこの辺で。
良いお年を・・・



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

2017年12月24日日曜日

IBM Verse ExtensibilityとOnTimeを連携させてみよう!

こんにちは、今日はクリスマスイブだそうです。
私には1mmも関係ありませんが(笑)

今日は、先日一足早いクリスマスプレゼント?をいただいたので、それの紹介をします。
クリスマスプレゼントとは「IBM Verse Extensibilityに関する」ものでした。

IBM Verse Extensibilityについては前回の記事でname pickerについて実装方法を紹介しましたが、今日は「com.ibm.appreg.ext.templatedLink」を使ったOnTimeとの連携方法についてです。

IBM Verseのビジネスカードから、対象ユーザーのOnTimeのカレンダーを開くというものです。

私は前回同様、IBM Verse On-Premises版での実装方法の紹介です。
それでは見ていきましょう。

1.参考URL
なお、同じ内容のIBM Verseのクラウド版での実装は、IBM Championの吉田さんが紹介してくれていますのでそちらも是非ご覧ください!
IBM Verse 機能拡張を使って、ビジネスカードからユーザーの OnTime カレンダーを開く



2.前提条件
・IBM Verse On-Premises 1.0.3が必要になります。
こちらは2017年12月20日にダウンロードできるようになりました。
パスポートアドバンテージもしくはソフトウェアアクセスオンラインからダウンロードしてください(ライセンスが必要になります)。
・OnTime Group Calendarが必要になります。
こちらは別途製品のご購入をお願いします。

IBM Verse On-Premises 1.0.3の資料は
IBM Verse On-Premises 1.0.3 の資料
で確認できますので、しっかりと読んでおきましょう。

OnTimeの資料は
OnTimeご紹介資料
で確認できますので、しっかりと読んでおきましょう。

3.OnTimeのカレンダーを開く方法
まず、どうやってOnTimeのユーザーのカレンダーを開くのかですが、
こちらのURLに方法が紹介されています。
ブラウザクライアント起動時のパラメータ指定
このページの中の
「■特定のユーザーやグループを指定して開く。」というセクションにあります。
それによると、
http://HOSTNAME/FOLDER/OnTimeGCClient.nsf/web?open&user="user1@example.com"
となっています。
このうち、"user1@example.com"がカレンダーを開きたいユーザーのメールアドレスを指定するとのことです。

つまり、IBM Verseでユーザーのメールアドレスが取得できれば、後は上記のURLを開けばいいという事になります。

4.IBM Verse Extensibility用のURLページを生成する
IBM Verse Extensibilityの設定方法は前回の記事で書いています。
application.jsonにJSON形式でパラメータを設定して、その中にURLを記述すればいいのです。
が、しかし・・・
IBM Verse ExtensibilityはURLを開く際に、正しくページを開けるようにURLエンコードしてくれます。
その結果、「@」という文字列がエンコードされてしまい、「%40」になってしまうのです。
そこで、吉田さんのブログ記事ではredirect.htmlを用意して、その中で再度「%40」を「@」に変換するという事を行っています。
IBM Verse On-Premisesでも同じように変換すればいいのですが、そこはhtmlファイルを設置するのではなく、XPagesでやってしまいましょう。

利用するXPagesは前回の記事で利用したネームピッカー用のものにします。
XPageの名前は何でも良いですが分かり易くするために「openOnTime.xsp」にしました。
このXPageの「onClientLoad」イベントに
クライアントサイドJavaScriptとして
var sHref = location.href;
var sPath = location.pathname;
var sUrl  = sHref.replace( sPath, "/OnTimeGC/ontimegcclient.nsf/web" ).replace( '%40', '@' );
location.href = sUrl;

というコードを記述します。
※「/OnTimeGC/ontimegcclient.nsf」については自社のOnTimeのクライアントDBのパスを入力してください。

5. IBM Verse Extensibilityの設定
IBM VerseからOnTimeを開くプログラムができたので、IBM Verse Extensibilityの設定であるapplication.Jsonの設定を行います。
基本的な記述方法については前回の記事を参照していただくとして、今回はすでにIBM Verse Extensibilityを使っている場合の追記方法という形で紹介します。
application.Jsonの内容

application.Jsonの中に"extensions"という記述があります。ここに開発した拡張機能の内容を記述するのですが、配列になっているので、"{}"を","で囲って記述すればいいのです。
追記する内容は上の画像の赤枠の部分になります。
typeには機能である"com.ibm.appreg.ext.templatedLink"を、
objectには拡張機能の対象となるビジネスカードを表す"com.ibm.appreg.object.person"を、
payloadのtextにはプログラムの機能名を記述します(日本語も可能ですが、unicodeエンコードする必要があります)
payloadのhrefには、先ほど作成したXPagesのURLに
"/web?open&user=\"${profile.primaryEmail}\""
を追加した内容を記述します。


6.動作確認
これで後は、IBM Verseを起動して、動作確認をします。
ビジネスカードからOnTimeのユーザーのカレンダーが開けば成功です。
実際に動かした動画を見てください。



さぁ、どうでしょうか?
IBM Verse On-PremisesとIBM Verse Extensibilityの組み合わせにより、色々なことができそうだというのが分かっていただけましたでしょうか?
今回はわかりやすいOnTimeとの連携を紹介しました。
ここから先は皆さん自身がアイディアと工夫で実践してみてください。


他のアプリケーションではできない(できても難しい、費用が高い・・・)といったことも 、IBM Notes/Dominoならきっとできるでしょう!
使い方次第で、もっともっと便利になりますよ。
IBM Notes/Dominoはそういったものですからね。



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


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

2017年11月21日火曜日

IBM Verse Extensibilityを使ってみよう!

皆さん、こんばんは!今日も夜に更新です!(言い切った!)

昨日はIBM Verse On-Premisesを導入してみました。今日もしっかりと動いています!
ということで、今日はその続きとなる「IBM Verse Extensibility」についてみていきます。
テクてく11月度の資料は
【資料公開】テクてく​​​​​​​​​​​​L​o​t​u​s​​技​​術​​者​​夜​​​会​​​:​ザ・​デベロッ​パー編​​​​17​_​11_1​7
に公開してありますので、そちらを読んでいただくと、より一層理解が深まりますので、お忘れなきよう!

その他、
GitHub にもサンプルアプリケーションが公開されています。
IBM Verse Developers
開発者用のドキュメントはこちら。
IBM Verse

これらも必ず見ることをお勧めします。

では、IBM Verse Extensibilityを見ていきましょう。
小難しいアーキテクチャはおいておいて・・・
どういったものかというと、
「IBM Verse」を拡張したり、他のWebアプリケーションと連携する
ものです。
その中で、Verse Extension Pointsという形で用意されている拡張機能は、
今のところ、
com.ibm.appreg.ext.simpleLink
com.ibm.appreg.ext.templatedLink
com.ibm.verse.ext.widget
com.ibm.verse.ext.namePicker
com.ibm.verse.ext.beforeOnSend
com.ibm.verse.ext.liveText
です。

テクてくでは、
com.ibm.verse.ext.liveText
com.ibm.verse.ext.beforeOnSend
com.ibm.verse.ext.namePicker
が紹介されました。

このうち、
 com.ibm.verse.ext.beforeOnSend
については、IBM Championの吉田さんがご自身のブログで紹介していますので、そちらをご覧ください。
リンクはこちら。
IBM Verse からのメール送信前に確認画面を表示する

このブログでは、
com.ibm.verse.ext.namePicker
をXPagesを使ってできるかどうかを試してみましょう。
環境としては、当然ですが、昨日構築したIBM Verse On-Premisesを利用します。
クラウド版のIBM Verseとは若干違う可能性もありますがご了承ください。

テクてくでは、「Custom Name Picker」として、以下の方法で実現したよという説明がありました。
1.Verse UI内にIFRAMEが生成されます。
2.IFRAME内にHTMLで作成した画面が表示されます。
3.iNotesの全文検索APIを利用して、ドミノディレクトリからユーザー情報を検索します。
4.検索結果をHTMLの画面内に表示します。
5.ユーザー名をpostMessageでVerseに送信します(宛先にセット)。

この説明を聞いてデモを見ながら、「あれ?画面をXPagesで作ってもできんじゃね?」と思いました。
ということで、HTMLの画面をXPagesで作ってみましょう。


1.XPages アプリケーションの作成
 Verse On-Premisesを構築したDominoサーバー上にNotes DBを作成します。
 ACLは「-Default-」は"読者"で良いですが、「Anonymous」は"なし"にしておきましょう(ドミノディレクトリの情報を表示するので、最低限のACL設定はした方が良いです)。


2.XPage の作成
XPage の名称は何でも良いです。ただし、Verse ExtensibilityにURL情報を渡す必要があるので、長くしすぎないようにしましょう。

データソースはドミノディレクトリを設定します。自DBではないところに注意しましょう。
ビューはユーザー情報を表示するためのビューを設定します。
テクてくでは専用のビューを作っていたので、同じようにビューを作成してそれを定義しました。

ビューの設定情報は、
3. Extend Domino Directory
を参照してください。
(実はXPagesで作るのであれば、ビューは既存のもので良かったのですが、折角なので流用しました)


3.画面ロードの設定
2.IFRAME内にHTMLで作成した画面が表示されます。
ということをXPages の中で行う必要があります。
これはイベントハンドラを利用しているので、CSJSで記述する必要があります。
XPagesでは「出力スクリプト」コントロール(xp:scriptBlock)を使うことで記述することができます。
記述方法は、サンプルのui.jsからそのまま引用できます。
テクテクの公開資料の中にある「custom-name-picker」用の「ui.js」の1-41行目をそのままコピペします。
その際、12行目の
"https://djxtest01.lab.japan.ibm.com",
は自分のDominoサーバーのホスト名に書き換えます。
私の場合、こんな感じになりました。
出力スクリプトに記述した画面ロードのコード



4.ネームピッカー用のビュー設定

ビュー情報をXPageにセットする方法ですが、ビューコントロール(xp:viewPanel)ではなく、繰り返しコントロールを使いました。
これは、
5.ユーザー名をpostMessageでVerseに送信します(宛先にセット)。
を簡単に行えるようにするためです。
サンプルコードを見るとわかりますが、この部分は、CSJSで書かれています。
ビューコントロールで該当する行をダブルクリックしたときのイベントを書くのが面倒だったということですね(笑)
作った画面はこんな感じです。
Verseでのネームピッカーとなる(はず)の画面

ユーザー名の部分はクリックできるように、リンク表示にしています。
ここでXPagesで正しく表示されるのかのテストをしてみました。
XPages でネームピッカーもどきを表示してみた

一応、ドミノディレクトリの情報は表示できています。


5.宛先セット方法
あとは、ここで選択されたユーザー情報をVerseに戻せればOK(のはず)です。
テクてくでも講師の方が「postMessage さえどうにかなれば簡単ですよ」みたいなことを仰っていたので、無理をせずに、サンプルをほぼ流用させていただきました。
postMessageのコード
こちらはイメージでの表示とさせていただきます。
※実際のコードは、テクてくのサンプルについているのでそちらをご利用ください。
違っているのは、
var userEmail = document.getElementById( "#{id:internetAddress1}" ).innerHTML;
var userName = document.getElementById( "#{id:link1}" ).innerHTML;

だけです。
これは画面上で選択されたユーザー情報を取得する箇所なので、XPages での記述となっています。
残りは全く同じです。


6.IBM Verse Extensibilityの設定
アプリケーションはできた(はず)なので、あとはIBM Verseとの連携設定をするだけです。
この連携設定には、
「application.json」というファイルを使います。
このファイルはVerse Extension Pointsごとにフォーマットが決まっているので、一度作ってしまえば簡単に作成できます(他人がつくったものも流用できます)。
ということで、テクてくで公開されたサンプルの「application.json」をカスタマイズします(笑)
application.jsonのサンプル
 大事なのは、「url:」の個所です。ここに先ほど作成したXPagesのURLを設定します。
これにより、IBM Verseで宛先をクリックすると動作するようになります。
この「application.json」はIBM Verse On-Premisesの場合、Dominoサーバー上に配置する必要があります。
通常、
\VOP\application.json
に配置するのですが、DominoサーバーのDataディレクトリに置きたくないよ!
という場合、Dominoサーバーのnotes.iniに
VOP_EXTENSIBILITY_APPLICATIONS_JSON_FILEPATH=xxxx\application.json
※xxxxは任意のファイルパス
と記述することで、任意のディレクトリに配置することができます。


7.動かしてみた
IBM Verseでメールを作成後、[宛先]の個所がリンクになりクリックできるようになるはずです。
実際にクリックしてみると・・・
ロード中の画面

といったIBM Verse Extensibilityで作成した画面をロードしてますよ。という表示がされた後、XPages で作成したネームピッカー用の画面が表示されます!

XPages のネームピッカー用画面がIBM Verse内に表示された!

ここで、リンク状態になっている名前をクリックすると、宛先もしくはCc、Bccにセットされます。
これで画面下部にある[メッセージに戻る]をクリックしてメール本文を書いた後、[送信]をクリックすれば、セットした宛先にメールが送信されます。

どうでしょう?
XPagesでもネームピッカーの画面が作成できるとなれば、かなりIBM Verseの拡張の敷居は低くなったのではないでしょうか?
また、これを機にXPagesも触ってみようかな?という事になってくれれば、尚良!ですね。

XPages の画面ロードと宛先セットはVerseのお作法に従う必要はありますが、その中身はXPagesで自由に作ることができます。今回、私が作成したサンプルはとてもシンプルでこのままでは業務の利用はとてもできませんが、ちょっとカスタマイズすればかなり使えるようになると思います。


IBM Verse On-Premisesが使えるようになったので、一緒にIBM Verse Extensibilityを使ってみましょう!


ということで、IBM Verseの記事、前後編はこれで終わりとします。


今日はこの辺で・・・







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

2017年11月20日月曜日

IBM Verse On-Premisesを導入してみよう!

皆さん、こんにちばんは。
前回の投稿からほぼ一カ月が過ぎました。ホントに遅筆で申し訳ないです。

言い訳の一つでもすると(毎回だな・・・)、11月は毎年毎年イベントが多いのです。
少しずらしてほしいものです。
ブログの更新も大事な作業の一つ(仕事ではない・・・)なのですが、多くのイベントがあると優先順位が下がってしまうんですよね。


さて、これくらいにして今日の話題に行きましょう。
11月15日に行われたノーツコンソーシアムオープンセミナーで、「ザ・ノーツ研究会」がIBM Verse On-Premisesの構築方法について発表を行いました(発表したのは私なんですけどね・・・)。
資料はこちら→S15_TheNotes_NotesConsortiumOpenSeminar2017_NotesLabo.pdf

そして、11月17日に行われたテクてくLotus技術者夜会ではIBM Verse Extensibilityの話。

もう、これはIBM Verseについてブログの記事を書け!というお告げとしか思えません(思えない・・・)。

ということで、これから2回にわたって、IBM Verseについての記事を書きます。前半の今回は、IBM Verse On-Premisesの導入方法について書いていきます。
実際問題、上記のノーツコンソーシアムオープンセミナーの資料を見ていただければ、構築できるはずなんですが、いきなりIBM Verse Extensibilityの話を書いても、???となりそうだったので、その前段ということです。


では、見ていきましょう。

なお、全体の手順は
IBM Domino メール・サーバーでの Verse オンプレミス の構成とインストール
にばっちり出ていますので、そちらを読んでいただければ、以下の文章は全く必要ありません(笑)

1.前提条件


IBM Verse On-Premisesを導入するには、条件があります。
Windows版 or Linux版のIBM Domino 9.0.1 FP8 IF3以上です。
私が構築した環境は
64bit版Windows Server 2008 R2 Enterprise
IBM Domino 9.0.1 Feature Pack9
IBM Notes 9.0.1 Feature Pack9
IBM Verse On-Premises 1.0.2
でした。

2.OpenSSLの導入

新インフラ研究会では、 「Let's Encrypt for Domino」の利用を推奨していましたが、私はオンプレのテスト環境なので、自己証明書で十分でしたので、OpenSSLを利用しました。
手順は、
Windows 環境で OpenSSL と KYRTool を利用して自己署名証明書を作成する
に出ていますので、この通りに実施してください。
注意点としては、コマンドプロンプトで実行する際、フォルダに空白が含まれる場合、""で囲う必要があることです。
私の場合、Notesクライアントは「D:\Program Files (x86)\IBM\Notes」にインストールされているので、「5.キーリングファイルの作成」では、
D:\Program Files (x86)\IBM\Notes>kyrtool ="D:\Program Files (x86)\IBM\Notes\notes.ini" create -k "D:\Program Files (x86)\IBM\Notes\data\keyring.kyr" -p password
とする必要があります(その他のコマンド実行時も同様です)。
コマンド実行時はフォルダに注意!

3.DominoのHTTPの設定

IBM Verse On-PremisesはWebブラウザで閲覧するメールなので、HTTPタスクを起動する必要があります。
その際、いくつかの設定を追加しておく必要があります。
(1)サーバー文書
[インターネットプロトコル] - [Domino Web Engine] 「出力に UTF-8 を使用」を"はい"にします。
[ポート] - [インターネットポート] 「SSL キーファイル名」に上記で作成したSSL証明書のファイル名(指示通りに作成していれば、"keyring.kyr")を入力します。
[ポート] - [インターネットポート] - [Web] 「SSL ポートステータス」を"有効"にします。
(2)ファイルの配置作成したSSL証明書(keyring.kyr)をIBM DominoサーバーのDataディレクトリにコピーします。
(3)サーバーのnotes.ini
HTTPJVMMaxHeapSize=1024M
HTTPJVMMaxHeapSizeSet=1
を設定します(set config命令で設定できます)。
また、ServerTasks=の行にHTTPを追加します(すでに追加されている場合は不要です)。
(4)HTTPタスクの起動
HTTPタスクを(再)起動します。
起動していない場合は、サーバーコンソールで
load http
起動していた場合は、サーバーコンソールで
tell http restart
とします。

4.IDボールトの設定

IBM VerseではIDボールトの設定も必要です。
設定方法は、当ブログ内のIDボールトの設定方法を見ていただいてもいいですし、IBMのドキュメントであるID ボールトの構築とトラブルシューティングを見てもらっても構いません。
IDボールトを設定した後、ポリシーを定義して、Notesユーザーに割り当てるのを忘れないようにしましょう。

5.Verse On-Premisesのモジュールのインストール

ここでようやくIBM Verseの作業に入ります(今までの作業は準備だったということがここで初めて分かります)。
一度、HTTPタスクを停止します。
サーバーコンソールで
tell http quit
を実行します。
IBM Verse On-PremisesのモジュールはPassport Advantage もしくはSoftware Access Catalogから入手可能(なはず)です。
私がダウンロードしたファイル名は「VERSE_ONPREMISES_V1.0.2_MP_ML.zip」でした。
これを解凍すると、さらに「IBM_Verse_On_Premises.zip」という圧縮ファイルがあります。
これを解凍してできた「eclipse」フォルダをDominoサーバーの\domino\workspace\applications\eclipseにコピーします。
※同名のフォルダがあるので、統合してください。


(オプション)
・IBMから出ているドキュメントでは、リダイレクトDBの設定を進めていますが、これは必須ではありません。私の環境では、使いませんでしたので、説明は省略します。
・また、VOPDesign.nsf内のビューをメールDBにコピーとありますが、FP9の環境では、すでにメールテンプレートに含まれていますので、作業は不要です。

6.HTTPタスクの起動と資格情報ストア・アプリケーションの作成

サーバーコンソールで
load http
を実行します。
HTTPタスクが起動したら、
サーバーコンソールで
keymgmt create nek credstore
keymgmt create credstore credstore
の2つのコマンドを実行します。
これらは暗号キーの生成と格納するNotes DBの作成を行います。


7.メールDBの索引の更新

利用者のメールDBに全文索引を作成します。
その後、サーバーコンソールで
load updall mail
を実行して、メールDBに対して索引の更新を行います。

8.IBM Verseの起動

Webブラウザで
http:///verse
と入力して、Enterを押します・・・
すると、
IBM Verse On-Premisesの画面

見事にIBM Verseの画面になりました!

どうでしょうか?
手順は少し多いですが、Verseの導入と考えるのではなく、DominoのSSL化、とかIDボールトの導入をついでにやっているんだな。とするといいと思います。

さて、これでIBM Verse Extensibilityを利用する準備ができました。
次回はいよいよ11月のテクてくで紹介された内容の実践に移っていきます。
乞うご期待!?


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





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