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

Translate

2014年12月9日火曜日

空き時間情報を検索してみる

おはようございます。

今年はホントにXPagesの話題が多かったですね。
でも、LotusScriptの話題も欲しいよね?ということで、久しぶりにLotusScriptの話題です。

本題に入る前に、にほんブログ村 IT技術ブログへ
をクリックしましょう。


今日は空き時間情報の検索についてです。
カレンダーにスケジュールを登録していて、他の人と予定が重なっていないかどうかを調べるのにいくつか方法が考えられます。
例えば・・・
  • 確認したい人のスケジュールを自分のカレンダーに表示させてみる
  • 会議招集を作成して、出席可能な時間の検索を行ってみる
  • 直接本人に聞いてみる(^^;
等でしょうか。

どれを使ってもいいのですが、LotusScriptでも実現できるので、やってみましょう。

検索に必要な情報は次の3つ+αです。
  1. 検索したい時刻の範囲
  2. 検索したい人のユーザー名
  3. 空き時間と認定する時間
  4. 返してほしい空き時間の数(1つで良いのか、複数なのか)

まぁ、4つ目は戻り値を単数にするのか複数にするのかということなので、厳密にいうと必要な情報ではありません。なので、3つ+αとしてます。

1.はNotesDateRangeオブジェクトに開始時刻と終了時刻をセットします。
2.は空き時間を検索したい人のユーザー名を配列にセットします(グループ名でも良いそうです)。
3.は指定した時刻の範囲の中で、空き時間として検知したい時間の分数をセットします(30分なら30
1時間なら60)。

ということで、サンプルです。

1 Sub Click(Source As Button)
2     On Error Goto ErrProc
3     
4     Dim session       As New NotesSession
5     Dim chkDateTime   As     NotesDateRange
6     Dim needTime      As     Integer
7     Dim names(1 To 2) As     String
8     Dim freeTime      As     Variant
9     
10     '空き時間を検索する開始/終了時刻
11     Set chkDateTime               = session.CreateDateRange()
12     Set chkDateTime.StartDateTime = New NotesDateTime( "2014/12/10 15:00" )
13     Set chkDateTime.EndDateTime   = New NotesDateTime( "2014/12/10 18:00" )
14     
15     '空き時間として設定したい時間の長さ(分)
16     needTime = 20
17     
18     '空き時間を検索するユーザー(複数設定可)
19     names(1) = "Masahiko Miyo"
20     names(2) = "Domino Administrator"
21     
22     '空き時間の検索
23     '4つ目の引数のfalseは時間内に複数の空き時間が見つかった場合、全部返す
24     'trueの場合、開始時刻に一番近いものを返す
25     freeTime = session.FreeTimeSearch( chkDateTime, needTime, names, False )
26     
27     If freeTime(0) Is Nothing Then
28         Msgbox "空き時間はありません", 0, "空き時間情報の検索"
29     Else
30         Forall x In freeTime
31             Msgbox x.Text, 0, "空き時間情報の検索"
32         End Forall
33     End If
34     
35     Exit Sub
36     
37 ErrProc:
38     Msgbox Cstr(Err) & Chr$(10) & _
39     Error & Chr$(10) & _
40     Cstr(Erl)
41     
42     Exit Sub
43 End Sub


10行目から20行目は検索に必要な情報をセットしています。
実際に検索しているのは、25行目です。
27行目から33行目で結果を表示しています。
空き時間情報が見つからない(スケジュールが全部埋まっている)場合は、空の配列が返ってくるので、27行目で確認しています。


引数が多いので、ちょっと面倒ですが、わかってしまえば、そんなに難しくはないと思います。

是非、チャレンジしてみてください。



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








【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ





2014年12月8日月曜日

2015年度のIBM Champions for ICSに任命されましたよ!

こんにちは。まだまだ現実逃避中です。12月はいけませんね。

さて、すでに多くの方がTwitterやFacebook、ブログ等で発信しているように
2015年度のIBM Champions for ICSが発表されました。
Announcing the 2015 Class of IBM Champions for ICS!


僭越ながら、私もまたまた再任させていただくことができました。
今回は全世界で96名と昨年よりも10%程増えました。日本からは私を含めて6名の方が選出されました。
ちなみに・・・どなたが選出されたのかは
2015 IBM Champions for ICS
を参照願います。


昨年の所信表明3年目のIBM Championに任命していただきました。では、いろんなことを言ってましたが、どうだったんでしょうか?

ブログへのコメントはまだまだ少ないですが、それでも以前に比べたら、着実に増えてきています。
今後も定期的に記事を投稿することができれば、コメントも増えてくるものと思いますので、それを励みに頑張っていきます。

また、テクてくのコミュニティ編ですが、前回(2014年10月)は、今回IBM Championに選出された阿部さんのお力も大きいですが、参加者同士が活発な議論ができて、大盛況でした(機会を作ってまた開催したいと考えてます)。
コミュニティを活発にすることで、Notes/Dominoの良さを伝えていただければと思っていますので、今後も継続していきます(まぁ、日本IBM様が任せてくれればのお話ですが・・・(笑))。




さて、チームスタジオの加藤様は来年はIBM Championに自薦しないとの所信表明をされましたが、私は来年も自薦しようかな?と思っています。
自分自身、コミュニティへの貢献がまだ足りていないかな?と感じているのが正直なところです。
自薦するためには、自分自身で活動ができたと認識できることが必要です。
ですので、2015年度もIBM Championの一人として、Notes/Dominoコミュニティへの貢献を続けていきます。

なにとぞ、よろしくお願いします。

もちろん、この記事を読んでいるあなたがIBM Championになってもいいんですよ。というか、なりましょうよ!



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

2014年12月3日水曜日

userBeanを使ってみよう

こんにちは。12月の記事は投稿したのに(←いつから月一になった!?とかいうツッコミはいりません)、なんとまた記事を投稿します!

師走で忙しいはずなのですが、ほぼ現実逃避状態なので、問題なしです!(え?問題あり?まぁまぁ)

とにかく・・・今日も記事に入る前ににほんブログ村 IT技術ブログへをクリックしてくださいね。


さて、では今日の話題へと移りましょう。
ずいぶん前の記事になりますが、XPagesでノーツアプリケーションのアクセス権をチェックしてみよう!というのを書きました。
XPagesでNotesDBに対するアクセス権を取得するにはどうすれば良いの?というものです。

このときは、SSJSのNotesDatabaseクラスのgetCurrentAccessLevelやqueryAccessPrivilegesを使って取得するという方法を紹介していました。

この記事に対してはいくつか有難いコメントをいただいていまして、その中に「Kazunori Tatsuki」さまから「Domino 9.0.1 もしくはExtension LibraryにあるuserBeanを使うと更に便利にACL周りの情報が取得できますね。」という情報を提供していただきました。

これは、詳細を調べて皆様にお届けしないと!ということで調べてみました。


Notes/DominoでXPagesを利用する場合、「Extension Library」という拡張モジュール群があります。
こちらをDominoサーバーにインストールすると、各種情報へのアクセスを提供する手段として、「Managed Bean」というものが利用できるようになります。

この「Bean」にはいくつかの種類があるようで、今回説明する「userBean」もその一種です。
これはSSJSもしくはEL(XPages データソース解説 - アクセス方法を参照)からアクセスすることができます。

記述方法は至って簡単。
userBean.プロパティ名称
とするだけ。
例えば、「userBean.commonName」と書きます。
計算結果フィールドコントロールに表示させたい場合、「値」プロパティに「式言語(EL)」として書くか、「JavaScript(サーバーサイド)」として書くかの違いだけです。いずれも記述方法は同じです。
式言語(EL)で記述する場合

SSJSで記述する場合

とても簡単ですね。
ということで、作成したサンプルがこちら。
userBeanのサンプル

ただ単にuserBeanで取得できるものを列挙しただけのものですが、現在のアクセス権なども取得できるので便利なのではないでしょうか?


なお、userBeanで取得できるものは、こちらのページを参照願います。
例えば、ACLの「文書の作成」を取得したい場合は、canCreateDocsなので、「userBean.canCreateDocs」という記述をすればよいことになります。

userBeanは現在のノーツDBに対するユーザのアクセス権情報を提供するものなので、利用するシーンは限られてしまいますが、NotesDatabaseクラスなどで計算するよりもはるかに速いし、記述も簡単なので、是非有効活用してください。

なお、Tatsuki様のコメントにもありますが、Domino 9.0.1であれば、そのまま利用できます。それ以前のバージョンの場合、Extension LibraryをDominoサーバーにインストールする必要がありますので、ご注意ください。


ということで、今日はこの辺で・・・








【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ





2014年12月1日月曜日

XAgentとは?

こんにちは。12月です。師走です。後1ヶ月で2014年も終わりです。
今年はもう少し記事の提供ができるかなぁと踏んでいたのですが、なかなか思うようにはいかないもので・・・
情報を入手するのは「タダ」かもしれないけど、情報を提供するのは「タダ」ではありません。
ということですね。

さて、では12月一発目の記事と行きましょう。
これをクリックしてからね。にほんブログ村 IT技術ブログへ


先月行われたXPagesDay 2014。私が担当したセッションの中で、別サイトのJSONデータを取得するためにはいくつかの方法がありますよ。という話をさせていただきました。
今回はその中でも「XAgent」について取り上げてみます。


そもそもXAgentとは何か?
詳しい説明は、こちらのサイトで解説されていますので、読んでみてください。英語ですがねー。
XAgents - Web Agents XPages style


XPages登場以前の、Domino Webアプリの場合、「?OpenAgent」というURLパラメータを付けてWebページを開くことで指定したエージェントを実行させることができました。
このエージェントの中にPrint文を記述することでページにHTML等を表示させることができます。
ここで、「Content-Type:」を出力するようにしておくと、HTMLではなく、XMLやJSONをページに表示させることができます。

これをXPagesでもやってみようというのがXAgentなのです。

なぜ、XAgentなのかというと、
XMLやJSONデータを取得する場合に限らず、他のWebサイトの情報を取得する場合、別ドメインのものは拒否されてしまいます。
これは、クロスサイトスクリプティングを防止するためです(こちらについては、CORSというキーワードで検索してください)。

?OpenAgentやXAgentを使うと、サーバ上でデータを取得することになるので、「別ドメイン」という事にはならなくなり、それを再利用する形にすることで回避するという訳です。



では、実際にXAgentの実装方法を確認していきましょう。

まず、適当な名前のXPageを作成します(ここでは「XAgent」としておきます)。
作成したら「すべてのプロパティ」にある「rendered」を"false"に変更します。
こうすることにより、このXPageを開いた時にHTMLが出力されなくなります(実際にページを開くとわかりますが、ソースがありません)。
XPageのすべてのプロパティ

次に、このページにJSONデータを出力するために、「afterRenderResponse」イベントに以下のコードを記述します。
afterRenderResponseイベント

コピペしたい人はこちらからどうぞ。
1var exCon    = facesContext.getExternalContext();
2var writer   = facesContext.getResponseWriter();
3var response = exCon.getResponse();
4 
5response.setContentType( "application/json" );
6response.setHeader( "Cache-Control", "no-cache" );
7 
8writer.write( "出力したいJSONデータ" );
9 
10writer.endDocument();
11facesContext.responseComplete();


取得したいデータがXMLの場合、5行目の"application/json"を"text/xml"にすれば良いです。
実際に取得したいデータは8行目に書いています。サンプルなので、このような形になっていますが、実際には出力予定のXMLやJSONを変数に格納しておけば良いです。


私が教わった方法は、java.io.InputStreamとjava.io.BufferedReaderを使ってURLからデータを読み込むという方法です。
このコードは先ほどの「afterRenderResponse」イベントのコードの先頭行に挿入する形になります(実際には8行目までにあれば大丈夫でしょう)。
URLからXMLやJSONを取得するコード

※ISEのA木様、情報提供ありがとうございました。大変勉強になりました!!


これでXPageを保存して、このページを開けば、指定したWebサービスのサイトのXMLもしくはJSONデータが出力されます。
後は、このページのデータを利用する形で別のXPageを作成すれば、RESTアプリケーションが出来上がります。
こんな感じで、XPagesDayのデモアプリは作られたのでした。




ということで一度覚えてしまえば、色々と流用できる便利なものです。
ぜひ覚えて、JSONデータを活用して、RESTも使いこなせるようになってください。



今日はこの辺で・・・
(12月の記事書いたから、今月はいいかな・・・(笑))

2014年11月19日水曜日

XPagesDayはどうでしたか?

こんばんは。2日間にわたって開催されたXPagesDay 2014。いかがでしたか?
基本情報から上級テクニック、そして今後のリリースについてまでいろいろな情報が飛び出しました。
すでにXPagesを始めている方も、これから始めようという方にもご満足いただけたのではないでしょうか。

私のセッションでは昨年に引き続きDominoデータアクセスサービス及びRESTについて話をさせていただきました。

セッション資料をslideshareに公開しましたので、参照していただければ幸いです。
ちなみに、こちらですね。



また、昨年の資料はこちらの記事に書いてありますので、併せてご参照ください。
XPagesDay2013開催中!



IBMの佐藤様のセッションでも言われていましたが、XPagesはまだまだ進化します。
私もその進化についていけるように、常に学習していきます。
皆さんも、どんどん学習してXPagesを楽しみましょう!


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

2014年11月17日月曜日

XPagesDay2014!!!

こんにちは。久しぶりの投稿です。なんと1ヶ月以上、空きました。
わっはっは。サボっていたわけではありませんよ。

なぜか!?

それは、あの一大コミュニティイベントであるXPagesDayが今年もやってくるからです!!!
3年連続となる今年もWebセッションとなります。


僭越ながら、私もまたまたセッションを担当させていただくことになりました。
そのため、ブログへの投稿ができない状態でした・・・

ちなみにセッションの申し込みはこちらからできますので、まだという方は是非お申し込みください。

日付はなんと、今週の2014年11月18日、19日。あれ?もう明日じゃないですか!?
忘れてた!という方は急ごう!!


なお、私は11月19日の
【B-3】XPagesでRESTを使ってみたらこんなんだった PartII
を 担当します。
資料のタイトルページ


なお、告知がこんな日になったのは、資料が出来上がらなくて、本番当日、ヤバいどうしよう・・・という状態だったということに他なりません・・・



では、当日Web上でお会いしましょう!

2014年10月7日火曜日

アーカイブの設定内容を取得する

皆さん、こんにちは。10月に入りましたが大型台風が続々やってきています。
注意してくださいね。台風のときはなるべく出歩かないように。できることなら在宅勤務にしましょう(私の願いでもあったりします・・・)。


さて、今日も張り切っていきましょう。
とその前に・・・にほんブログ村 IT技術ブログへをクリックしてくださいね。



ではでは。
今日は久しぶりのLotusScriptです。
そして、いまだにアクセスが多い「アーカイブ」についてです。



メールのアーカイブをするのがほとんどだと思いますが、どんな設定になっているかを確認する方法が分かりにくいですよね。
通常、ノーツDBのプロパティから「アーカイブの設定」というボタンをクリックして(下図)、専用の画面上で確認します。
ノーツDBのプロパティ
アーカイブの設定画面

特殊な画面なので、他の方法では取得できないかな?と思っていたのですが、調べてみたらプロフィール文書の集合体でできていたことがわかりました。
であれば、LotusScriptで取得することができるのではないか?という事でサンプルを作ってみました。

   
Sub Click(Source As Button)
    Dim session   As New NotesSession
    Dim db        As     NotesDatabase
    Dim pdoc      As     NotesDocument
    Dim proDoc    As     NotesDocument
    Dim i         As     Integer
    Dim proNum    As     Integer
    Dim proName   As     Variant
   
    Set db   = session.GetDatabase( "Dominoサーバー名", "メールファイル名" )
    Set pdoc = db.GetProfileDocument( "archive profile" )
   
    proNum   = Ubound( pdoc.GetItemValue( "ArchivePrivatePolicyList" ) )
    proName  = pdoc.GetItemValue( "ArchivePrivatePolicyList" )
   
    For i = 0 To proNum
        Set proDoc = db.GetProfileDocument( proName(i) )
        Msgbox _
        "アーカイブ名:" & proDoc.GetItemValue( "FullName" )(0) & Chr$(10) & _
        "ファイル名:"   & proDoc.GetItemValue( "ArchivePath" )(0), _
        0 + 64, "アーカイブDBファイル名"
    Next
End Sub

こちらのサンプルは、指定したメールDBのアーカイブDBファイル名を表示するものです。
アーカイブの条件は複数設定できるため、それぞれの条件でどのアーカイブDBが設定されているのかを取得して、メッセージボックスで条件の名前とともに表示しています。


これを応用すれば、アーカイブを設定しているユーザがどういうファイル名でアーカイブを取得しているのかがわかり、一括で管理できるようになるのではないでしょうか。

気になったら試してみてください。
では、今日はこの辺で・・・



※今回の記事は、私の調査に基づくものであり、公式見解ではありません。サンプルプログラムの利用にあたっては自己責任の上でご利用ください。





【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ