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

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

2014年12月26日金曜日

本日で仕事納めです

みなさん、こんばんは。
本日(2014年12月26日)で、弊社は仕事納めとなります。

従いまして、私のブログ投稿も今年はこれが最後となります。
例年ですと、年越しブログは書かないのか!とか、新年一発目の記事はいつ書くんだ!と揶揄されますが、今年はそういうことを言われる前にお休みを宣言してしまうという魂胆です(笑)

今年は久しぶりに記事数を増やすことができました。
XPagesだけでなく、SametimeやIBM Verseについての記事を書くなど、新しいことが着々と進んでいて、それをウォッチで来たからだと思います(嘘だな・・・)。

それでも、年間50本も書いていないので、少ないとは思っています。
読んでくれている方がいるから書くわけですので、そういった方々のためにももう少し更新頻度を上げた方が良いかな?と。

また、累積アクセス数がもうすぐで50万に達するというところまで来ています(ホントはこの記事を書くまでに達してほしかったのですが・・・)。

ということで、来年はなんとか週一のペースまで持っていければいいな。と感じています。


それと、ブログはそこそこ認知していただけるようになったと感じていますので、別のことにも挑戦していきたいと考えています。
それが何になるのかは全くわかりませんが、違った形でみなさんと接することができれば良いですね。



さて、それでは来年も当ブログをよろしくお願いします。




ホントに、年越しブログは書かないからね!お休みしますから!

2014年12月25日木曜日

クリスマスとXPages

おはようございます。クリスマスです。
ホントなら楽しい夕べのはずだったのですが、誰かさんの無茶ぶりにより、クリスマスにXPagesのブログを書くことになりました(え?自業自得だろ?そうなんですがね・・・)。

しかし、発想力が貧弱なこの私にそんな洒落たものは書けません。
ひたすら考えました・・・

そして、「XPagesはJavaScriptがかけるんだから、世の中にあるどなたかが作成したJavaScriptのプログラムも動くに違いない!いや動く!」という想いから、
JavaScriptでクリスマス関連のことをやっているサイトを探しました(笑)


あるもんですね。見つけましたよ。JavaScriptでクリスマス。
actywayというサイトにクリスマスに使いたい!雪のパーティクルをチラチラ降らす JavaScript を作ってみよー : actywayという記事がありました。

しっかりとJavaScriptをダウンロードできるようにしてくださっています。素晴らしいですね。
今回は「snowparticle.3.js」をダウンロードしました。

では、早速XPagesに組み込んでみましょう。
せっかくなので、新規にノーツDBを作成します。
そして、「xmas」という名前でXPageを作成します。

雪が降るので背景は白色以外にしておきます(黒とか濃紺にしておくといいかも)。

ダウンロードした「snowparticle.3.js」をメモ帳で開いて全部コピーします。
そうしたら、「onClientLoad」イベントのクライアントJSとして貼り付けます。
CSJSとしてonClientLoadイベントに追加

これで完成です。なんとまぁ簡単ですね。

そうして動かしてみたものがこいつです。
video


背景の画像はフリーのものを探してきて設定してみました。
動画はFirefoxで動かしたものにしていますが、IE11、chromeでも動くことを確認しています。



いかがでしょう?XPagesはこのようにJavaScriptを動かすことができます。
JavaScriptならいくらでもサンプルがありますので、いいなと思うものがあったら再利用してみましょう(著作権がある場合もあるので、そこは確認してくださいね)。

では、今日はこの辺で。
メリークリスマス。




2014年12月22日月曜日

特定の文字の出現回数を数えるには?

おはようございます。
12月も下旬になり、もうすぐクリスマスですね。あ、その前に明日は「天皇誕生日」で休日です。
こっちもお祝いしましょうね(私は何もしないのですが・・・)
さて、クリスマスというと
https://twitter.com/guylocke/status/540505164482752512
で書いたように、XPages関連のブログを書きますということになってますが・・・
今日、この時点で全くのノーアイディアです。
さて、かけるんでしょうか・・・かけたら褒めてくれていいですよ(笑)


では、今日も本題に入る前に、
にほんブログ村 IT技術ブログへ
をクリックしてくださいね。


上に書いたようにXPagesネタがまるっきり思いついていませんので、今日もLotusScriptネタです。

今日は今までに紹介した関数を使って、違う事をやってみます。
文字列中に、特定の文字が何回出現したのかを数えてみるというものです。

PHPだと「substr_count」という関数があるようで、簡単に取得できますがLotusScriptや@関数にはこのような機能を備えたものはありません。
他の方法を考えましょう。

考えたけど分かりません・・・ここはGoogle先生に聞いてみましょう。
「特定の文字を数える」で検索したところ、
Excelでの方法が出てきました。

どうやら、SUBSTITUTEという関数を使って、検索したい文字を""に変換して、変換前後の文字列長の差でカウントしているようです。
ふむふむ、なるほど・・・

SUBSTITUTEなどという関数はLotusScriptにはありませんね。しかし、同じような機能を持つ関数はありますね。
@関数なら@ReplaceSubString関数や、@Replace関数、
LotusScriptならReplace関数ですね。


今回はLotusScriptで実現してみようと思うので、Replace関数を使ってやってみましょう。
Sub Click(Source As Button)
    Dim inData  As     String
    Dim outData As     String
    Dim inLen   As     Long
    Dim outLen  As     Long
    Dim srchStr As     String    '検索対象文字
   
    srchStr   = ";"
    inData  = "aaaaa;bbbbb;cc;;ddddd;eeeee;ff"
    outData = Replace( inData, srchStr, "", , , 5 )
    inLen   = Lenbp( inData )
    outLen  = Lenbp( outData )
   
    Msgbox "改行数は" & Cstr( inLen - outLen ) & "です。"
End Sub

8行目は検索対象の文字です。
9行目が元のデータです。
10行目のReplace関数で、元データから検索対象の文字を""に置換してoutDataという変数に格納しています。

11,12行目は置換前後の文字列の文字数を数えて格納しています。
14行目で置換前の文字数から置換後の文字数を引いた結果を表示しています。

これにより、検索対象の文字がいくつあったのかが分かるようになっています。


応用すれば色々なことができそうなので、是非改良してみてください。

では、今日はこの辺で…




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


2014年12月9日火曜日

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

おはようございます。

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

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


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

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

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

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

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

ということで、サンプルです。
Sub Click(Source As Button)
 On Error Goto ErrProc
 
 Dim session       As New NotesSession
 Dim chkDateTime   As     NotesDateRange
 Dim needTime      As     Integer
 Dim names(1 To 2) As     String
 Dim freeTime      As     Variant
 
 '空き時間を検索する開始/終了時刻
 Set chkDateTime               = session.CreateDateRange()
 Set chkDateTime.StartDateTime = New NotesDateTime( "2014/12/10 15:00" )
 Set chkDateTime.EndDateTime   = New NotesDateTime( "2014/12/10 18:00" )
 
 '空き時間として設定したい時間の長さ(分)
 needTime = 20
 
 '空き時間を検索するユーザー(複数設定可)
 names(1) = "Masahiko Miyo"
 names(2) = "Domino Administrator"
 
 '空き時間の検索
 '4つ目の引数のfalseは時間内に複数の空き時間が見つかった場合、全部返す
 'trueの場合、開始時刻に一番近いものを返す
 freeTime = session.FreeTimeSearch( chkDateTime, needTime, names, False )
 
 If freeTime(0) Is Nothing Then
  Msgbox "空き時間はありません", 0, "空き時間情報の検索"
 Else
  Forall x In freeTime
   Msgbox x.Text, 0, "空き時間情報の検索"
  End Forall
 End If
 
 Exit Sub
 
ErrProc:
 Msgbox Cstr(Err) & Chr$(10) & _
 Error & Chr$(10) & _
 Cstr(Erl)
 
 Exit Sub
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イベント

コピペしたい人はこちらからどうぞ。
var exCon    = facesContext.getExternalContext();
var writer   = facesContext.getResponseWriter();
var response = exCon.getResponse();

response.setContentType( "application/json" );
response.setHeader( "Cache-Control", "no-cache" );

writer.write( "出力したいJSONデータ" );

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

2014年9月24日水曜日

XPagesで複数DBの内容を一つのビューとして表示させてみる

秋分の日を迎え、日が短くなり、いよいよ秋本番となってきました。
秋と言えば、スポーツの秋、食欲の秋、読書の秋、等々いろいろありますが、やっぱり「Notes/Dominoの秋」でしょう(笑)。

ということで今日もブログ記事を更新です。
早速本題に・・・と行きたいのですが、恒例のボタンクリックをしてくださいね。
にほんブログ村 IT技術ブログへ


では本題に入りましょう。今日もXPagesについてです。


XPages化にあたっての問題点?
先週の9月16日にノーツコンソーシアムのXPages研究会がありました。
その中で既存のノーツDBをXPages化するにあたって、質問がありました。
「複数のノーツDBに情報がわかれて登録されている。そのため、毎回毎回それぞれのDBを閲覧しないといけない。XPages化するにあたって一つのビューから複数のノーツDBの情報を参照することができないだろうか?」
というものです。

参加者たちは、複数のデータソースが定義できるんだから実現できるんじゃないかな?
と怪しげです。

これが解決すれば、XPagesの導入の手助けになるのであれば、是非解決したいところです。
さらには、こちらのスキルのレベルアップにもなります。
という事で私が独自に調べてみました。


考えてみよう
まず、複数のノーツDBの情報を表示するということなので、新規にノーツDBを作成してその中で表示させることにしました。


次にノーツDBの情報を表示するとなっていますが、ここではビューの情報が表示されれば良いでしょう。
ということで、ビューコントロール(9.0.xだと「表示」コントロールという名称です)が使えるかな?と思いましたが、以下の理由でやめました。
  • 複数のノーツDBの定義方法が不明(そもそもできるのかどうかも不明)
  • 複数のノーツDBが同じビュー名、さらに同じ構造(列情報)になっているか不明

アプリケーションを作成するのに、決まった方法はないので、ビューコントロールに固執する必要はないだろうということで、別の方法で解決することにしました。

とりあえず、表示させたいノーツDBのビューをデータソースとして定義してみることにしました。
データソースは「Dominoビュー」とすれば良いはずです。

そして、複数のデータソースを連結するのと、ビューの内容を表示するということで、「繰り返しコントロール」を使うことにしました。
先に定義したデータソースはここでJavaScriptを使って連結すればできるかな?と。

これがうまくいけば、後は繰り返しコントロールの中にフィールドを配置すれば、できる!(はず・・・)


実装してみよう
なんとなく、実装の方法が見えてきたので、実際に実装してみましょう。
※テストプログラムなので、こんな見切り発車的なやり方してますが、実際の開発ではちゃんと設計してからやりますよ(多分・・・)。
まず、新規にノーツDBを作成します。ここでは、「multiview.nsf」という名前で作成しました。
新規ノーツDBを作成

次に、XPageを作成します。名称は任意ですが、ここでは「main」としました。
「main」という名前でXPageを作成

「main」XPageを開いたら、データソースを定義します。
ここでは、「TagCloudBBS.nsf」(タグクラウド掲示板)と「wfboardxpg.nsf」(全社掲示板)という2つのノーツDBのビューをデータソースとして定義します。それぞれ「($All)」ビューを定義してあるのでそれを定義します。
画面だと見づらいので、ソースコードを書き出します。

 
 
 
 


各ノーツDBの($All)ビューはこんな感じに作ってあります(手元にあったテスト用のノーツDBを使っています)。

タグクラウド掲示板の($All)ビュー

全社掲示板の($All)ビュー


別々の設計要素になっていることがわかってもらえましたでしょうか?
ただし、まるっきり別々になっていると統合したビューとして表示させるときに問題になるので、
「タイトル」「最終更新日」「文書UNID」の列だけは作成するようにしました。


そして今度は、「繰り返しコントロール」を配置します。名前はデフォルトのままで構いません。
繰り返し限度もデフォルトのままで良いでしょう。
コレクション名には任意の名前を入力します。ここでは「rowData」としました。
使用するバインドデータは、JavaScriptにして次のような式を入力しました。
var db1ID = view1.getParent().getReplicaID();
var db2ID = view2.getParent().getReplicaID();
var array1 = view1.getColumnValues(4) + ";" + view1.getColumnValues(1) + ";" + db1ID + ";" + view1.getColumnValues(6);
var array2 = view2.getColumnValues(2) + ";" + view2.getColumnValues(0) + ";" + db2ID + ";" + view2.getColumnValues(3);
var retArray = array1.concat(array2);
retArray.sort( function( a, b ) {
 if ( a < b ) return 1;
 if ( a > b ) return -1;
 return 0;
});
retArray;

array1というのは「TagCloudBBS.nsf」(タグクラウド掲示板)のデータソースをカスタマイズした配列です。
array2というのは「wfboardxpg.nsf」(全社掲示板)のデータソースをカスタマイズした配列です。
それぞれ、「最終更新日」、「タイトル」、「ノーツDBのレプリカID」、「文書UNID」を";"で結合しています。
そして、array1.concat(array2)で配列同士を結合してretArrayに代入しています。
このままだと、array1の後ろにarray2が配置されるだけなので、sort関数で最終更新日の降順に配列を並び替えています。
そして並び変わった配列を戻しています。
※JavaScriptの関数についてはgoogle検索等で調べてください。たくさん出てます。


データソースはできたので・・・
これで、データソースの定義はできました。
次に実際に値を表示させるための設定を行います。
まずは、繰り返しコントロールの配下に「1行4列」の表を作成します。
幅は100%にしておきます。

一番左のセルに「計算結果フィールド」コントロールを配置します。

ここで本当にデータが生成されているのかを確認するために
値の式を
rowData
と入力してみましょう(単純データバインディングではなく、JavaScriptに変えてから入力します)。
できたら、Webブラウザでプレビューしてみてください。
繰り返しコントロールのデータを表示してみた

なんとかデータは表示されているようです。ですが、これではただ単に表示されているだけでほとんど役に立ちません。
そこで、式を次のように修正します。
var xx = @Explode( rowData, ";" );
xx[0] 
これは、繰り返しコントロールのデータを";"で区切った配列として扱い、そのうち1番目のデータを返すというものです。1番目のデータは「最終更新日」として作成してあるので、つまりは最終更新日だけをひょうじするというものになっています。


二番目のセルには「リンク」コントロールを配置します。
ラベルには以下の式を入力します。
var xx = @Explode( rowData, ";" );
xx[1]
先ほどの式との違いは、配列の2番目のデータを使用するというところです。2番目はタイトルを配置しているので、タイトルが返ってきます。


また、タイトルをクリックしたら該当文書が開くようにしたいので、リンクタイプに以下の式を入力します(横の◇をクリックして、「値の計算...」を選択します)。
var xx = @Explode( rowData, ";" );
var url = context.getUrl();
var sPath = url.getScheme() + "://" + url.getHost() + ":" + url.getPort() + "/";
sPath + xx[2] + "/%24%24OpenDominoDocument.xsp?documentId=" + xx[3] + "&action=openDocument";

sPathというのは現在のサーバのURLパスを示しています。
"/%24%24OpenDominoDocument.xsp?documentId="というのは、指定した文書UNIDをXPageで表示するというURLパラメータです。
*1 ここではテストプログラミングなので、それぞれのノーツDBにあらかじめ文書表示用のXPageを作成してあります。
*2 表示用のDB(新規作成)と既存のノーツDBが同じサーバ内にあるという前提で作成してあります。

3番目のセルにも「計算結果フィールド」コントロールを配置して、以下の式を値として入力します。
var xx = @Explode( rowData, ";" );
xx[2] 
これはレプリカIDを返す式です。

同じように4番目のセルにも「計算結果フィールド」コントロールを配置して、以下の式を値として入力します。
var xx = @Explode( rowData, ";" );
xx[3] 
これは文書UNIDを返す式です。


保存して、Webブラウザでプレビューしてみたのが次の図です。
プレビューしてみた

まだちょっと情けないですが、出来ています。
この後、列タイトルの表を追加したり、列幅を調整したりした結果がこちらです。
完成版


いかがでしょうか?
これで既存のノーツDBが複数に分かれていても、一つのDBを経由することで簡単に?参照することができるようになります。

文書を表示するためのXPageは今回は作成していませんが、これも新規作成したDBの中に組み込むことができますので、うまく作れば既存のDBにほとんど手を入れずにXPages化することも夢ではありません。

是非是非、試してみてください。
それでは今日はこの辺で・・・


Web化するならXPages!



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






2014年9月17日水曜日

XPagesで添付したイメージを画面に表示させる

最近、ブログの投稿がされてない!と怒られました。はっはっは・・・
でもね・・・記事を書かせたい(私のモチベーションを上げる)と思うのであれば、コメントくださいね。
役に立ったのか立ってないかだけで構いませんので、 書いてください。匿名でいいんです。
このブログはNotes/Dominoを使っていただいている皆様のために書いています。

ですが、有益な情報なのか、そうでないのかを決めるのは読んでいただいている皆様です。
ぜひ、他の利用者へのフィードバックとしてコメントをください。


想いを吐露したので、少しすっきりしました。ということで?今日もブログを更新しましょう。





XPagesについて質問があったので、それを解決する方法について書いてみます。
NotesアプリケーションをWeb化したことがある人からすると、「なんだよ、こんなの知ってるよ」という内容かもしれませんがお付き合いください。


質問内容は・・・
XPagesアプリケーションで文書に画像ファイルを添付した。
文書を開いた時にその画像ファイルをイメージとして表示させるにはどうすれば良いか?
このイメージは文書のタイトルと同等の扱いとしたい。なので、画像は文書内の目立つ場所に独立して表示させたい。
というものでした。
ノーツクライアントのアプリケーションの場合、クリップボード経由で画像ファイルを貼り付けられたので簡単に実現できますが、XPagesやWebアプリの場合はどうなんでしょう?(下図はノーツクライアントで画像ファイルを貼り付けてみたところ)
ノーツクライアントなら画像を貼り付けられる

考えてみた
Webアプリケーションの場合も考えると大変なので(めんどくさい・・・)、XPagesで実現する方法を考えてみました。
リッチテキストがあるならば、XPagesからもイメージの貼り付けはできますが、これだとその場所にしか表示できません。となると「目立つ場所に独立して表示させたい。」という要件を満たしません。
となると、やはり添付ファイルで実現するのが良いでしょう。


やってみよう
まずは添付ファイルをアップロードできるようにします。
こちらについてはXPagesで添付ファイルの処理をする(アップロード) に記事を書いていますので、そちらを参照願います。
それでは、実際に表示する方法についてみていきましょう。
画像ファイルをイメージとして表示するので、「イメージコントロール」を利用します。
イメージコントロールをドラッグ&ドロップする時に、イメージのリソースをどうするのか選択する画面になりますが、「イメージプレースホルダーの使用」を選択して[OK]をクリックしてください。
「イメージプレースホルダーの使用」を選択

プロパティの中に「イメージソース」という項目があるので、そこの◇をクリックしてスクリプトエディタを開きます。
ここに
document1.getDocument().getUniversalID() + "/$FILE/" + @AttachmentNames()
という式を記述します。
この式でWebアプリケーション上で添付ファイルを指し示すURLを生成しているのです。
「document1」はデータソースの名前なので、ご自身の環境に合わせてください。
document1.getDocument().getUniversalID()は、開いている文書の文書UNIDを指します。
添付ファイルは「$FILE」に格納されているので、 それを定義しています。
@AttachmentNames()は文書内にある添付ファイルの名前を取得してくる関数ですね。

これだけで終わりなのですが、添付する画像ファイルの縦横の長さがまちまちだとそのままのサイズで表示されるので文書ごとに統一感がなくなります。
そこで「高さ」と「幅」に固定値を設定しておきます。ここでは両方とも150ピクセルとしました。
イメージコントロールのプロパティ

実行してみた
実際にXPagesからファイルを添付して開きなおした状態がこちらです。
XPagesで添付ファイルを表示してみた

これの優れているところは、添付されているファイルが画像ファイルであればノーツクライアントから添付しても正しく表示されるという事です(画像を直接貼り付けている場合は不可です)。



注意事項
ここで実現している方法は、文書中に添付ファイルが一つしかないこと、添付ファイルは画像ファイルである事ということが注意点としてあります。
添付するファイルの数を限定する方法については、XPagesで文書保存時に添付ファイルの数を限定させるには で書いていますので、そちらを参照願います。



このようにちょっとした工夫でできますので、色々と試してみてください。
では今日はこの辺で・・・

2014年8月21日木曜日

XPagesでワークスペースを表現してみよう

みなさん、こんにちは。
秋の気配がしたかと思ったのですが、まだまだ暑いですね。気温の上下に影響されて体の調子を悪くしないように気を付けましょう。

さて、今日も始める前にボタンをクリックしてくださいね。
にほんブログ村 IT技術ブログへ


今日の話題はXPagesでワークスペースを表現してみよう!です。

1.ワークスペースのおさらい
Notesクライアントの機能の一つに「ワークスペース」というものがあります。
Notesアプリケーションをアイコン形式で表示するあれですね。
Notesクライアントのワークスペース
そんなワークスペースですが、Notesクライアントでしか使えないという弱点があります。
最近では、Notes Browser Plug-inがありますが、あれはWebブラウザ上でNotesクライアントのBasic版を動かしているようなものなので、Notesクライアントで動いていると判断して良いでしょう。

このワークスペースがWebブラウザ上でも使えたら嬉しいですよね。
ということで・・・またまたOpenNTF.orgから探してきました。あるもんなんですね。こちらのXPages HomePageがそうです。

こちらのアプリケーションは2012年12月が最後の更新となっていますが、Notes/Domino 9.0でも動作しました。
また、純粋なXPagesアプリケーションとして作られているので、余計なものをインストールしたりする必要がないのも特徴です。


2.ダウンロードしよう
では、さっそくダウンロードしてみましょう。
プロジェクトページにある「Downloads/Releases」のタブを開いて、「Release 3.0」をクリックします。すると、「XPages Applications Homepage.zip」というファイルがあるので、それをクリックします。
ダウンロードできたら、適当なフォルダに解凍します。下図がzipを解凍した状態です。
この中にはNotesテンプレート、利用手引書等が入っています。
※この辺りは、OpenNTF.orgのプロジェクトはどれも同じですのでわかりやすいですね。
zipファイルの内容


3.使ってみよう
使い方は簡単です。
zipファイルの中にある「Workspace.ntf」をDominoサーバにコピー&署名して、このテンプレートを元にDominoサーバ上にNotesアプリケーション(~.nsf)を作成するだけです。
作成したら、Dominoサーバの管理者ユーザに[Admin]ロールを付けて、「管理者」のアクセス権を付与します。
※ローカルクライアント上でも動作するのですが、ワークスペースにNotesアプリケーションを登録するにはログインする必要があるので、Dominoサーバ上でのテストをお勧めします。

下図はWebブラウザで、管理者ユーザでログインして開いた時の画面です。
Notesアプリケーションをブラウザで開いてみた

このアプリケーションは以下の機能を持ち合わせています。
  1. アプリケーションのロゴとタイトルの変更
  2. DominoサーバのカタログDB(catalog.nsf)との連携
  3. 共通ワークスペースへのアプリケーション登録と名称の変更
  4. 個人ワークスペースの作成とアプリケーション登録

それでは、一つずつ簡単に紹介していきます。
  1. アプリケーションのロゴとタイトルの変更
[Admin]ロールを持ったユーザでログインしたときだけ行うことができます。
画面の右上にある「Profile」というリンクをクリックします。
Profileの編集画面に切り替わるので、「Application Title」や「Application Logo」「Servers」を編集します。
Profileの編集画面
「Application Title」と「Application Logo」の編集は任意ですが、「Servers」は必ず指定する必要があります。
サーバのアイコンをクリックすると、Dominoサーバの一覧が表示されるので、ワークスペースに登録したいNotesアプリケーションがあるサーバを選択します。
設定したら、[Save]ボタンをクリックします。

  1. DominoサーバのカタログDB(catalog.nsf)との連携
本アプリケーションにNotesアプリケーションを登録します。これにより、ワークスペースへアプリケーションアイコンを表示する準備ができます。
こちらも[Admin]ロールを持ったユーザでログインしたときだけ行うことができます。
画面右上にある「Admin Config」をクリックします。
画面が切り替わるので、「Sync with server」というリンクをクリックします。
catalog.nsfとの同期を実行
注)
この機能は日本語版のDominoで実行するとエラーになります。
正常動作させるようにするには、本アプリケーションの「GenWS」というエージェントの「Initialize」の51行目を以下のように修正してください。
×  Set serView = catalogDb.getView("Applications\by Server")
○  Set serView = catalogDb.getView("ByServer")   

カタログDBとの同期が終わると、Notesアプリケーションの一覧が表示されます。
「Sync with server」のリンクの横には取り込んだNotesアプリケーションの数が表示されます。
カタログDBから取り込んだ内容の一覧

  1. 共通ワークスペースへのアプリケーション登録と名称の変更
共通ワークスペースは「Business」「Collaboration」「Administration」「Notes Apps」という名称で用意されています。これらの名称は変更が可能です(後述)。このうち、「Notes Apps」という名称のタブは登録したアプリケーションがNotesクライアント上で開くようになります。
この共通ワークスペースへのNotesアプリケーションの登録は[Admin]ロールを持ったユーザだけが行えます。
共通ワークスペースへ登録する場合、「Admin Config」の画面で行います。
まず、登録したいタブを選択します。
タブの選択

次に画面に表示されているアプリケーションの一覧からタブに登録したいものを選択して、一番左にある□にチェックを入れます。
タブに追加するアプリケーションを選択

最後に画面上部にある[Add]ボタンをクリックします。
成功すると、Titleの前にが表示されて、Visibility列には登録したワークスペースタブの名前が表示されます。
タブに追加された状態

では、本当にワークスペースタブに登録されたのかを確認してみましょう。
画面右上の「Workspace」というリンクをクリックします。
ワークスペースを開いたけど・・・

あれ?表示されていませんね?
実は、先ほどは「Collaboration」という名称のタブに登録したので、現在、選択されている「Business」タブには表示されていないんですね。
でも、よく見ると、「Collaboration」タブのところに(3)という表示されています。
では、「Collaboration」タブをクリックしてみましょう。
先ほど登録したアプリケーションのアイコンが表示されているのがわかります。
Collaborationタブにアイコンが!

ちなみに、ワークスペースタブの名前を変更するには、この画面の何もないところでマウスを右クリックします。すると、メニューが表示されるので、「Rename Workspace Page」を選択します。
右クリックメニュー

すると、名称変更のダイアログが表示されるので、変更後の名称を入力して[Rename]ボタンをクリックします。
ワークスペースタブの名称変更ダイアログ

変更内容は即時に反映されます。
名称が変更された結果


  1. 個人ワークスペースの作成とアプリケーション登録
個人用のワークスペースは3つまで作成できます。共通ワークスペースと合わせて7つのタブを表示することができます。
作成するにはWorkspaceの画面でマウスを右クリックして「Create Workspace Page」メニューを実行します。
新規ワークスペース作成ダイアログ

「New Workspace Page」というダイアログが表示されるので、タブの名称を入力して[Create]ボタンをクリックします。(ここでは、「MyPage1」と入力してみました)
Workspace 画面に戻ると、タブが一つ追加されているのがわかります。
個人用のワークスペースタブを追加してみた

では、今しがた作成した個人用のワークスペースにNotesアプリケーションを登録する方法についてです。
画面右上にある「Configuration」というリンクをクリックします。
すると、「Admin Config」によく似た画面になります。
Configuration画面

違うのはカタログDBとの同期ができない事、追加できるワークスペースが自分で作成したものだけになっていることです。
ちなみに共通ワークスペースに登録してあるNotesアプリケーションはこの一覧には表示されません。
ここから先の操作方法は共通ワークスペースへの登録方法と同じなので割愛いたします。


4.注意事項
このアプリケーションですが、いくつか注意事項があります。不具合とも仕様とも言い難いところなので、深い言及は避けます。
  1. 本アプリケーションの利用者は「編集者」以上のアクセス権が必要です(「作成者」だと個人用のワークスペースが作成できません)。
  2. Notesアプリケーションを検索するためには、本アプリケーションに対して全文索引を作成しておく必要があります。
  3. ワークスペースにアイコンを追加する際、そのNotesアプリケーションのACLにユーザとしてエントリが追加されている必要があります。
  4. ワークスペースにアイコンを追加する際、そのNotesアプリケーションのアクセス権が「編集者」以上である必要があります。

このうち、「3.」「4.」については以下の方法で対処することが可能です。
  • AccessLevel」というスクリプトライブラリを開きます。
  • getAccess」という関数の20行目から38行目までをコメントアウトします。
entry=acl.getEntry(@UserName());
if(entry!=null)
{
    level=entry.getLevel()
    if(level>=4)
    {
        access="Yes"
    }
    else
    {
        access="No";
    }
}
else
{
    //To find the access level for group
    access=checkGroup(server,dbPath);
}
  • getAccess」という関数の19行目の下に以下のコードを挿入します。
//To find the access level for current user    ←これが19行目
level = db.getCurrentAccessLevel();
if ( level>=2 ) {
    access = "Yes";
} else {
    access = "No";
}
  • スクリプトライブラリを保存します。
これでNotesアプリケーションに「読者」以上のアクセス権があれば、ワークスペースに追加できるようになります。


5.まとめ
これで、後は必要なアプリケーションを自分の好きなワークスペースに追加しておけばOKです。
本アプリケーションはWebブラウザでブックマークしておけばいつでも開けます。
NotesアプリケーションをWeb化(XPages化含む)したのは良いけど、ポータルまでは余裕がないなぁとか言う場合に使えるアプリケーションになっています。
利用方法は簡単なのでぜひぜひ使ってみてください。


6.実は作ってみました
このアプリケーション、ワークスペースを再現しているだけあってNotesアプリケーションしか登録ができないんですね。せっかくWebブラウザで開いているので、普通のWebサイトの登録もできたら、簡易ポータル的に使えるのになぁと思い・・・
上記のアプリの動きを参考にしながら、自分で作ってみました。
リスペクト版ワークスペース(笑)

こちらの機能は
  • ログインしていなくても(Anonymous許可)、共通ワークスペースを使える
  • 共通ワークスペースは管理者ユーザが作成
  • ログインすることで、自分用のワークスペースを作成できる(タブは5つまで)
  • Notesアプリケーションだけでなく、Webサイトの登録も可能
等です。

こちらのアプリのデモをご希望の方は、私にご連絡いただくか、弊社宛てにメールをお送りください。折り返し、ご連絡いたします。




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




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