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

テクてく 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月の記事書いたから、今月はいいかな・・・(笑))