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

Translate

2015年6月24日水曜日

月刊Notes/DominoWebセミナー6月号の資料をアップしました

みなさん、こんにちは。

昨日(2015/06/23)は、月刊Notes/DominoWebセミナー6月号という事で、Webセミナーで話をさせていただきました。
題材は、もう何度も話してきたRESTサービスについてでした。

Notes/Dominoは古いとか独自性があるとか言われていますが、RESTのような標準サービスとの連携もできるんですよ!
ということが伝わっていれば嬉しいです。

また、デモでお見せしたようにOnTime のようなNotes/Dominoのアドオンアプリケーションとの連携もできます。
こういう連携ができるだけでも楽しいですし、工夫次第では業務が効率化できるようになります。

ぜひ、RESTを覚えて活かしてみてください。


なお、チームスタジオ様からも資料を参照できるようになるかと思いますが、私もセッション資料をslideshareに公開しましたので、参照していただければ幸いです。



XPagesでRESTを使ってみよう from Masahiko Miyo




もっと詳しい話を聞かせろ!とか、OnTime OpenAPIのデモをビデオじゃなくて直接見たい!という方は、ご連絡いただければ対応させていただきます。






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

2015年5月21日木曜日

「OnTime OpenAPI 活用ワークショップ」に参加してきました!

皆さん、こんばんは。こんな時間ですが、こんな時間だからこそ、ブログの更新です(笑)。

5/19~5/20にかけて行われたIBM XCITE SXPRING 2015はいかがでしたでしょうか?
私の会社は残念ながら出展できるようなものがありませんでしたので(私自身を売ってますので(笑)…お仕事の依頼、お待ちしてま~す)、IBM Verseの詳細調査と、Notes/Dominoの関連製品の調査という形で参加してきました。
私は、その中でもNotesのスケジュール/カレンダーを強化してくれるというOnTimeが好きなのです(もちろん、他の製品も好きですよ)が、そのOnTimeを「さらに」便利に使えるようにできるというワークショップが開催される!ということで、参加してきました。


主催はアクセル様で、場所は東京は新宿駅付近の東京オフィスでした。
今日は、その内容について簡単にご紹介を・・・と思ったのですが、そもそも、Notes/Dominoユーザの皆さんは、OnTimeはご存知ですよね??

ご存じないという方のために、製品説明を・・・と思ったのですが、
すでに他の方がブログでたくさん紹介してくださっていますので、そちらの方をご覧ください。

OnTime Group Calendarを試してみよう!
全部で37もの記事になっていますが、その分、製品説明がしっかり出来ています。


そんなOnTimeですが、なんとまぁ外部から操作するためのAPI群が用意されているというじゃないですか。
今回は、そのAPIの基礎から使い方について、開発元のIntraVisionから講師が来てくださいました。
講師はなんとIBM ChampionMikkel Flindt Heisterberg氏です。


OnTime のAPIはデモサイトがあり、そこからAPIの動きをトレースすることができるんですね。
このAPIはJSON形式のデータでやり取りをしています。
・・・つまり、REST APIを使っているのですね。
ブラウザから動作確認ができるというのもその証拠の一つでしょう(デモサイトのページを見ると、リクエスト用のURLが出ていますし、レスポンスはHTTP Statusを使っています)。


面白いという便利なのが、OnTimeはユーザの識別をするのにTokenを用いています。そのため、Dominoのセッションが切れたとしても、Tokenが生き残っていれば、そのまま処理を継続することができるというものです。Tokenの有効期間はデフォルトで24時間ですが、強制的に無効にすることもできるなど、セキュリティ面も考慮されています。


このAPIを使いこなすことができれば、Notes/Dominoのカレンダー情報を外部から操作・分析とかできそうですね。
なお、JSONでのやりとりとなれば、私が今までこのブログでもお伝えしてきた「XPages」との連携も簡単に行えそうです!
ということで、次回はXPagesからOnTime APIを呼び出すということに挑戦してみましょう。
出来るかな?どうかな?できたらすごいですよね!




こうやって、自分で自分の首を絞めるのでした・・・
期待しないでお待ちください。

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

2015年5月9日土曜日

よく使うコントロールのセットを作成する

皆さん、こんにちは。新緑の季節です。

この週末、私は「自腹」で購入した「Teamstudio Bootcamp for XPages」をやっています。
ハンズオン中心ですが、各コントロールの詳しい紹介や、なぜXPagesが良いのか?などと言った解説も書いてあり、なんとなく開発していた(ヲイ!)私にもよくわかるようになっています。

基本的には集合教育とのことですが、受講者が一人しかいない。という場合にはテキストのみの販売も行っているそうです(私はこれを利用しました)。
詳細は、XPages 開発の集合教育をご覧ください。

・・・PRしたから、少し安くしてくんないかな(笑)


閑話休題。

本日の話題に入りましょう。

今日もXPagesの話と行きたいところですが・・・Domino Designerの便利な使い方についてです。


XPagesの開発をする場合、必ずと言っていいほど、「コントロール」ビューからコントロールをドラッグしますね。
「コントロール」ビュー

この時、こんな風に思ったことはありませんか?
「"出力スクリプト"はよく使うのに一覧に表示されてないんだよな。」「こんなに表示されても探すのが面倒なんだよな。」

前者の場合、「その他」をドラッグして、「コントロールの作成」ダイアログを表示して、そこから検索及び選択して貼り付けることができます。
「コントロールの作成」「ダイアログ

後者の場合、もう諦めるしかない・・・


となりそうですが。

いえいえ、そんな煩わしいことを考える必要はないのです。
どちらも一発で解決する方法があるんです。


「コントロール」ビューにマウスカーソルを移動して、そこですかさず右クリック!
コンテキストメニューが表示されるので、「パレットのカスタマイズ...」をクリックしましょう。
「コントロール」ビューで右クリック!

すると、パレットの設定ダイアログが表示されます。
表示したいコントロールにチェックをつけて[OK]をクリックすると、あ~ら不思議。
「コントロール」ビューにそのコントロールが表示されるようになるではありませんか。
パレットの設定ダイアログ

※ここでは「出力スクリプト」にチェックをつけて[OK]をクリックします。
「出力スクリプト」を追加した「コントロール」ビュー

表示させることができるということは、当然、表示させないようにすることもできます。
あまり使うことのない、コントロールはここでチェックを外しておけばよいのです。

また、プロファイルを作成して、表示させるコントロールを切り替えることもできます。
オリジナルのパレットプロファイルを選択してみた

Extension Libraryのコントロールは(私にとって)必要最小限に抑えてみました。
また、出力スクリプトはCSJSを書くのに最適でよく使うので、表示させておきました。




ちなみに、勘の鋭い方はお判りでしょうが、先ほどのパレットのカスタマイズは[ファイル][プリファレンス]で表示されるプリファレンスの中にあるもの(Domino Designer - XPages - パレット)をショートカットで表示するメニューだったのです。


このようにプリファレンスには色々便利な機能が隠されています。
是非、ご自分で探してみてください。
探し当てることが出来たら、この記事にコメントとして残してください。
詳細を調べて、次の記事のネタにさせていただきます(^^


では、今日はこの辺で・・・
Bootcamp for XPagesに戻んないと!




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

2015年4月3日金曜日

XPagesで名前ピッカーを使う場合

こんにちは。
4月に入りました。すなわち、2015年も四分の一が過ぎたという事を意味します。
(毎年、この時期におんなじこと言ってるなぁ というのは気のせいではありません・・・)

さて、今日は見切り発車的な情報です。
この記事を読んだどなたかが補足してくれるのを待つという試みです(笑)


XPagesのアプリケーションでユーザーを選択する場合、
Extension Library(9.0からは標準)の「Name Picker」(9.0では「名前ピッカー」)を使うかと思います。
(癖があって、日本のユーザには使いにくいというのはさておいて・・・)

この「名前ピッカー」の設定方法は次の通りですね。




    
        
        
    


「user1」という編集ボックスを作成して、複数値を許可しています。
「名前ピッカー」はその「user1」に割り当てるようにしています。
ユーザの選択肢はドミノディレクトリにしていて、ユーザーとグループの両方が表示されるようにしました。

実行結果は下図のような形になります。
名前ピッカーの実行結果1

ドミノディレクトリに登録されているユーザー名とグループ(ほとんどグループなのは、諸事情によるものです(笑))が表示されています。
ここで左側のリストからユーザー/グループを選択して[追加]ボタンをクリックすると、右側のリストに移ります。
選択したら、[OK]をクリックすれば、「user1」の編集ボックスに代入されます。
簡単ですね。


ところで・・・
私のNotes/Domino環境ですが、
サーバーのnotes.iniには
NAMES=names.nsf,VistaNames.nsf
という行があります。
そうです。二次アドレス帳が設定されています。

ところが、上の画面にはその二次アドレス帳は表示されていません。
これは困りますね。
そんな時は「名前ピッカー」の設定を少し変えます。

こんな感じです。

    
        
            
                
                
            
        
    


「dataProvider」という項目を「dominoNABNamePicker」から「namePickerAggregator」に変更します。
そして、それの子供という形で配下に「dominoNABNamePicker」を作ります。

この実行結果は下図のとおりです。
名前ピッカーの実行結果2


見事にアドレス帳が選択できるようになりました。
選択肢にはnotes.iniの「names=」の行のものが表示されています。

これで先ほどよりは使いやすくなりましたね。

でも・・・
この場合、二次アドレス帳がDominoサーバ上にあることが前提となります。
しかし、必ずしもそうとは限りません。
Dominoには「ディレクトリアシスタント」という便利な機能があります!

これを利用すると、Dominoサーバ上にないアドレス帳の情報も参照することができるというものです。
ノーツクライアントのメールの「宛先」リンクをクリックするとこんな画面になります。
ディレクトリアシスタントを設定した場合

では、XPagesアプリの「名前ピッカー」でも使えるでしょうか?
「名前ピッカー」の設定は変えずに、再度実行してみました。

下図がその結果です。
名前ピッカーの実行結果3

あれ?表示されません。というか、選択すらできなくなってます。
はい。そうなんです。XPagesでは、ディレクトリアシスタントはこのままでは使えないのです。

じゃぁ、どうすればいいのか?



実は、方法があります。
ドミノディレクトリ(いわゆるnames.nsf)にあるサーバー文書を編集します。
編集するのは、二次アドレス帳がある方のサーバー文書です。
「セキュリティ」タブにある「信頼できるサーバー」という項目にXPagesアプリケーションがあるDominoサーバー名を入力します。
サーバー文書の編集

この後、Dominoサーバーを再起動します。
※ディレクトリアシスタントの設定は済んでいるものとします。


これでXPagesアプリを実行すると・・・
こんな感じになります。
名前ピッカーの実行結果4

無事に別のサーバーにある二次アドレス帳の内容が表示されました。
これでユーザー選択の方法が簡単になりますね!
良かった良かった・・・




ここまで書いておいてなんですが、うまくいく場合といかない場合があります。
二次アドレス帳となるノーツDBを変えるだけで挙動が変わってしまうことがあるのです。
設定としては上で書いたもので正しいと思うのですが、ノーツDBに何らかの条件があるのではないかと思っています。
ご存知の方がいれば、コメントとして残していただけると大変うれしいです。

ちなみに失敗すると、XPagesアプリがあるDominoサーバーのサーバーコンソールに
HTTP JVM: com.ibm.xsp.FacesExceptionEx: データベース dnames.nsf を開けません。
というエラーメッセージが出力されます。
さらに、「名前ピッカー」の実行結果は二次アドレス帳を選択しても、一覧に何も表示されないという哀しい結果になります。
名前ピッカーの実行結果5


と、中途半端な形になってしまいましたが、実現できたのは事実!ということで、
XPagesはすごいぜ!
とごまかして終わります・・・

2015年3月24日火曜日

XPagesで文書内の添付ファイル名を取得しよう!

皆さん、こんにちは。
当ブログも今日(2015年3月24日)で丸7年となりました。明日からは8年目に突入です。
「Notes/Dominoに関する事をテキトーに書いていきます。まぁ、いつまで持つかお楽しみということで。」という副題で始めましたので、ここまで続くのは驚異的でしょう(自分で言うな?)。

ということで、お祝いとしてこのボタンをクリックしましょう。
にほんブログ村 IT技術ブログへ
お祝いなんかしてやるもんか!という方は、このままお帰りください(笑)。


さてさて、では7年目最後の記事に移りましょう。

今日は前回の記事(XPagesのファイルアップロードでファイルの種類を限定する )に関連したものです。
前回は、画像ファイルをアップロードするという話でしたが、
画像の添付ファイルが複数アップロードされている場合、それらのファイル名をどのように取得すれば良いのか、また画面にどうやって表示すれば良いのか?を検証してみます。


なお、添付ファイルを複数アップロードする方法についてはXPagesで文書保存時に添付ファイルの数を限定させるには
また、添付ファイルイメージを画面に表示させる方法についてはXPagesで添付したイメージを画面に表示させるを見てください。


まず、添付ファイルがいくつ存在するのかを確認する必要があります。
これは、NotesRichtextItemクラスのgetEmbeddedObjects()を使います。
(文書全体の場合は、NotesDocumentクラスのgetEmbeddedObjects()を使います)。
これは、java.util.Vectorで返ってきます。
ですので、size()メソッドを使って、添付ファイルの数が取得できます。
ソースコードとして書くとこんな感じでしょうか。
var curdoc = document1.getDocument( true );
var ritem  = curdoc.getFirstItem( "AttachedFile" );
if ( ritem != null ) {
    if ( ritem.getType() == 1 ) {
        if ( curdoc.hasEmbedded() ) {
            var att:java.util.Vector = ritem.getEmbeddedObjects();
            return att.size();
        }
    }
}


添付ファイルは「AttachedFile」というリッチテキストフィールドに格納してあります。

次に、ファイル名はNotesEmbeddedObjectクラスのgetSource()メソッドを利用して取得できます。
NotesEmbeddedObjectオブジェクトはgetEmbeddedObjects()の戻り値であるjava.util.Vectorの一つ一つの要素になります。
ですので、
java.util.Vectorを要素数分だけ繰り返し処理をしながら、ファイル名を取得していくという事をします。
LotusScriptの場合、Forallという関数があり、それを使いますが、JavaScriptでは使えませんので、別の方法を利用します。

java.util.Iteratorクラスを利用します。
ソースはこんな感じになります。
var curdoc = document1.getDocument();
var ritem  = curdoc.getFirstItem( "AttachedFile" );
if ( ritem.getType() == 1 ) {
    if ( curdoc.hasEmbedded() ) {
        var att:java.util.Vector = ritem.getEmbeddedObjects();
        if ( att.isEmpty() ) {
            return null;
        } else {
            var atti:java.util.Iterator = att.iterator();
            while ( atti.hasNext() ) {
                var obj:NotesEmbeddedObject = atti.next();
                print( "ファイル名=[" + obj.getSource() + "]" );
            }
        }
    }
}


java.util.IteratorはVectorオブジェクトの要素を一つずつ取り出すのに利用します。
while文でループする際、hasNext()を使って、次の要素が存在している限り繰り返すようにします。
オブジェクトの取得は、nextを使います。
取得したオブジェクトはNotesEmbeddedObjectなので、getSource()でファイル名が出力されます。



これらを応用することで、添付ファイルの分だけ画面上にイメージを表示させることができます。
「繰り返し」コントロールを配置して、「使用するバインドデータ」はJavaScriptで添付ファイルの数を出力するものを書きます(一つ目のソース)。
繰り返しコントロールの索引名に「repeatIndex」と書いておきます(名前は任意)。

「繰り返し」コントロールの中に「イメージ」コントロールを配置します。
「イメージ」コントロールの「イメージソース」は「値の計算...」でサーバーサイドのJavaScriptを記述します。
ソースは2つ目のものを書きますが、若干変更します。

変更後のソースを載せます。
var curdoc = document1.getDocument();
var ritem  = curdoc.getFirstItem( "TitleLogo" );
var attname = new java.util.Vector();
if ( ritem.getType() == 1 ) {
    if ( curdoc.hasEmbedded() ) {
        var att:java.util.Vector = ritem.getEmbeddedObjects();
        return curdoc.getUniversalID() + "/$FILE/" + att[repeatIndex].getSource();
    }
}


「繰り返し」コントロールの中に配置されているので、繰り返し処理を行う必要はなく、「repeatIndex」の箇所にあるオブジェクトを取得すれば良いです。

サンプルDBとして作り、動かしてみたのがこちらの画面です。
複数のイメージを画面上に表示する

実用性はともかく・・・
XPagesではこのようなことも行えます。
ぜひ、活用してみてください。

では、今日はこの辺で。




Web化するならXPages!








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

2015年3月4日水曜日

XPagesのファイルアップロードでファイルの種類を限定する

皆さん、こんにちは。
先日、誕生日を迎えて、四捨五入すると50歳という、もう「アラフィフ」と言っても良くなってしまいました。
全然めでたくありません!

めでたくないので、このボタンをクリックしてください。
にほんブログ村 IT技術ブログへ


今日は久しぶりにXPagesの話題です。
たまには書かないと、「こいつ、ホントにXPagesできるのか?」と疑われてしまいそうなので(笑)


XPagesでは、ファイルを添付するのに便利な「ファイルアップロード」コントロールがあります。
こちらの説明については、以前にも書いていますので、
XPagesで添付ファイルの処理をする(アップロード)
XPagesで文書保存時に添付ファイルの数を限定させるには
そちらを参照願います。

さて、今日はそんなファイルアップロードコントロールのちょっとした応用についてです。
ファイルを添付する際、ファイルの種類を限定したい場合があります。
私にはそんな理由がありました。

それを実現する方法について説明します。

通常のHTMLでは、


と記述することで、アップロードするファイルの種類を限定させることができます。
input type='file'だけを記述したサンプル

ファイルアップロードコントロールをクリックしてみた

では、XPagesのファイルアップロードコントロールではどのように実装すれば良いのでしょうか?
「ファイルアップロードコントロール」のすべてのプロパティを見ると、「accept」という項目があります。
ここに記述してみました。

ところが・・・
動いてくれません。動くのですが、ファイルの種類が限定されません。

今度は、「ファイルアップロードコントロール」のオプションにある「MIMEタイプ」の値を変更してみました。
ところが・・・
やはり動いてくれません。

何でしょう???
IEでもfirefoxでもchormeでも同様の結果です。


私ができたやり方は
すべてのプロパティにある「attrs」で[+]をクリックして、「attr[0]」にacceptを設定したのでした。
attrの設定

ちなみに、複数のファイルの種類を設定したい場合は、
valueに「@List( "image/gif", "image/jpeg", "image/png" )」と配列になるように書いたら動きました。
この時、ちゃんと「◆値の計算」をクリックして、JavaScript式として書くのを忘れないようにしましょう!

実行結果はこちら。
ファイルの種類を増やしてみた

見事に、pngやjpgが増えています。


ということで、attrに値を設定することで色々とできるようですので、試してみてください。



では、今日はこの辺で。



Web化するならXPages!







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

2015年2月17日火曜日

ループ処理の計測

こんにちは。

まぁ、とりあえずはボタンを押してってよ、話はそれからだ。
にほんブログ村 IT技術ブログへ
新しい記事じゃなくても、ページを開いたら押してってください。じゃないと、テンション下がるわ~。


さて・・・気を取り直して。
今日はちょっとした実験です。


LotusScriptでのループ処理ですが、すでに当ブログでも紹介しているように色々な記述方法があります。
多すぎるがゆえに、「どれを使えばいいんだ?」ということになりがちです。

ここは、実行速度を計って、どれが良いのかを見てみましょう。
計測するのはFor文、Do文、While文の3つ(他にもありますが、それは貴方が自分で計測して!)です。
ループ回数ですが、10回や100回くらいでは違いを見るのは難しそうと判断して、思い切って10,000,000回(1千万回!)にしてみました(笑)。

さらにループするだけだと、あっという間に終わるかもしれないので、ループ処理1回ごとに乱数を発生させるようにしました。

ソースはこちらです。   
Sub Click(Source As Button)
    Const LOOPCNT = 10000000
   
    Dim startDT1 As String
    Dim endDT1   As String
    Dim startDT2 As String
    Dim endDT2   As String
    Dim startDT3 As String
    Dim endDT3   As String
    Dim i        As Long
    Dim j        As Single
   
    startDT1 = Format( Now, "h:nn:ss" )
    For i = 1 To LOOPCNT
        j = Rnd
    Next
    endDT1   = Format( Now, "h:nn:ss" )
   
    i        = 0
    startDT2 = Format( Now, "h:nn:ss" )
    Do While i <= LOOPCNT
        i = i + 1
        j = Rnd
    Loop
    endDT2   = Format( Now, "h:nn:ss" )
   
    i        = 0
    startDT3 = Format( Now, "h:nn:ss" )
    While i <= LOOPCNT
        i = i + 1
        j = Rnd
    Wend
    endDT3   = Format( Now, "h:nn:ss" )
   
    Msgbox _
    "For  :" & startDT1 & " - " & endDT1 & Chr$(10) & _
    "Do   :" & startDT2 & " - " & endDT2 & Chr$(10) & _
    "While:" & startDT3 & " - " & endDT3, _
    0 + 64, "ループ処理の計測"
End Sub


このコードを実行した結果が下図です。
実行結果

何度か実行してみましたが、ほぼ同じ結果となりました。
つまり、LotusScriptにおいてはForループの方が速いということですね。
※すべての言語で同じ結果になるわけではありません。実際にC++やPHPだとWhileの方が速いという事らしいです。


ループ回数が決まっているのであれば、For文を使うと良いでしょう。
ループの数が不定となる場合だけ、Do文もしくはWhile文を使うと良いでしょう。




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





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