2015年12月2日水曜日

Domino Desginer 以外の開発環境を整えよう!(2)

みなさん、XPages開発していますか?!

私のPCの開発環境を赤裸々にしてしまう記事の第2弾です。

前回は、エディタの話をしましたが、今回はスクリプト環境の話です。

Node.js + Grunt

OSは主にWindowsを使っているんですが、Windowsで困るのが定型処理を行うバッチプログラムを何で書こうか、というところ。

linuxだとbashで書いたりするんだけど、Windowsのシェルでは非力で複雑なことをしようとすると大変なんですよね。

Cygwinを入れてbashというのもいいのですが、使い慣れたJavaScriptでかけるともっといい。

随分前まではWindows Script Host上でJScriptで書いていたのですが、シェル程ではないにしてもやはり非力な感じは否めない。例えばWebサービスをコールしたりする時には非常に苦労します。

そこで Node.js。使ったことなくても名前は聞いたことあると思います。

2015年11月26日木曜日

IBM Champion 2016 に任命されました!

みなさん、XPages開発していますか?!

さてこの度、今年も無事(?)に IBM Champion 2016 に任命されました!

(効果音)どんどんどん ぱふぱふー

これで3年目ということになります。

これに選出される活動ために、社内外問わず様々な方にご協力頂いております。

この場を借りて御礼申し上げます。

さて今年は、全世界で103名の方が選任されたとことです。

https://www.ibm.com/developerworks/community/blogs/ibmchampion/entry/Announcing_the_IBM_Champion_Class_of_2016_for_IBM_Social_Business?lang=en

日本では、2016年度は私も含めて4名で、以下の方が選出されています。

  • チームスタジオジャパン株式会社 加藤様
  • 株式会社エフ 御代様
  • ケートリック株式会社 田付様

去年までは6名だったのですが、4名に減ってしまって残念ですが、先日のNotesコンソーシアムの各種研究会やXPagesDay、Q&Aサイトのように日本のコミュニティも以前に比べて活発になってきたと思います。

しかし、日本でのNotesユーザー規模からすればまだまだと思います。

皆さんにお役に立てる情報を発信しつつ、コミュニティも盛り上げられるよう、今後も頑張ります!

2015年10月29日木曜日

Domino Desginer 以外の開発環境を整えよう!(1)

みなさん!XPages開発していますか?

今回は、ちょっといつもと毛色を変えて、開発環境について書いてみたいと思います。

開発環境って言っても、Notes開発の場合Domino Designerじゃないの・・・? というアナタ!他のツールを使いこなすことで開発効率がグッと上がるかもしれませんよ!

ということで、私がよく利用している開発ツールをご紹介しまーす。

2015年7月17日金曜日

Domino/XPages on Bluemixにデプロイしてみた(2)

みなさん、XPages開発してますか!?

前回から引き続き、BluemixへのXPagesDBのデプロイについて解説します。

2015年7月14日火曜日

Domino/XPages on Bluemixにデプロイしてみた(1)

みなさん、XPages開発してますか!?

先日Bluemixに Webアプリケーションとして[XPages]がデータストレージとして[Domino]が、Labs Catalog に登場しました!パチパチパチ

Labs ということで、まだ試験段階ということなのですが、nsfファイルのデプロイからXPagesの動作まで動くようになったので、レポートしてみたいと思います。

2015年7月10日金曜日

2015年6月12日金曜日

Notes 9.0.1FP3 でUpdate site DBにプラグインをインポートしようとするとエラーがでる件について

Update Site DBにOpenNTFから落としてきたプラグインを入れようとしたら・・・
・・・はい?・・・IBMサイトをググってみるか・・・

見つかった。
http://www-01.ibm.com/support/docview.wss?uid=swg21696682
「Notes 9.0.1 FP3を入れた後に、LS2J"Java~"のエラーが出るよ!」
だってさ。んもー。

で、下記のパッチを当てればいいんだって。

2015年6月10日水曜日

SSJSで他のWebAPIにアクセスする

みなさん!XPages開発してますか?!

 今回は、Notes/DominoのQAサイト「qA9」で質問に上がった、SSJSから他のWeb APIを呼び出す方法について解説します。

 サンプルDBはこちらから ntf ファイルをダウンロードできます。
 動作確認は、Domino Designer 9.0.1 FP3 で行っています。

Apach HTTP Clientのインポート

  Web APIにアクセスするためには、HTTPで通信する必要があります。しかし、SSJSにはHTTP通信するためのクラスやオブジェクトはありません。なので、Javaを利用します。
 Javaに標準で搭載されているHTTP Clientのクラスを使ってもいいのですが、Apache HTTP Clientを利用すると何かと便利なので、そのライブラリをインポートするところからはじめましょう。

 まず、Aapache HTTP Clientのサイトから、ライブラリをダウンロードします。
ここでは、バージョン4.5のzipを落としましょう。

http://hc.apache.org/downloads.cgi

ZIPの中に"lib"フォルダがあるので、ここから下記のファイルを取得します。
  • httpclient-4.5.jar
  • httpcore-4.4.1.jar


これを対象のDBにインポートします。

ここまではOK?

HTTPでコールするためのオブジェクトをSSJSで作成する

 上のインポートでSSJSからApache HTTP Clientを使用することができるようになりました。ただ、これでは少々使いにくいので、簡単にGET/POSTできるようにSSJSで関数を作ってしまいましょう。


var HttpClient = {};

// GETでWebサービスを呼び出します
// HTTPレスポンスのcontent-typeは、text/* である必要があります。
// パラメータ
//   url: 呼び出し先のURLを指定します。URLパラメータが必要であればそれもつけたものを設定します。
// 戻り値
//   オブジェクト: 下記項目を持ったオブジェクトを返します。
//                 status: レスポンスのHTTPステータス番号
//                 body:   レスポンスの内容(テキスト)
HttpClient.httpGet = function httpGet(url){
 var result = {};
 //Apache HTTP Clientのデフォルトの設定でHTTPClientを生成
 var jClient = org.apache.http.impl.client.HttpClients.createDefault();
 //GETメソッドを作成
 var httpGet = new org.apache.http.client.methods.HttpGet(url);
 //GETでコール
 var response = jClient.execute(httpGet);
 //レスポンスのステータスを取得
 var responseStatus = response.getStatusLine().getStatusCode();
 result.status = responseStatus;
 //レスポンスのBodyを取得して、文字列に変換
 result.body = org.apache.http.util.EntityUtils.toString(response.getEntity(), 'UTF-8');
 return result;
};


//POSTでWebサービスを呼び出します
//HTTPレスポンスのcontent-typeは、text/* である必要があります。
//パラメータ
//  url: 呼び出し先のURLを指定します。URLパラメータが必要であればそれもつけたものを設定します。
//  formParam: フォームとして送られるパラメータをオブジェクトで渡します。
//呼び出し例
//var name:com.ibm.xsp.component.xp.XspInputText = getComponent("name");
//var prefix:com.ibm.xsp.component.xp.XspInputText = getComponent("prefix");
//var params = {
// name: name.getValueAsString(),
// prefix: prefix.getValueAsString()
//};
//var ret = HttpClient.httpPostByForm("http://localhost:8080/HttpClient.nsf/api.xsp/restAPI", params);
//requestScope.put('status', ret.status);
//requestScope.put('body', ret.body);

HttpClient.httpPostByForm = function httpPost(url, formParam){
 var result = {};
 var jClient = org.apache.http.impl.client.HttpClients.createDefault();
 //Formの準備
 var formParams = new java.util.ArrayList();
 for(key in formParam){
  var val = formParam[key];
  formParams.add(new org.apache.http.message.BasicNameValuePair(key,val));
 }
 var postEntity = new org.apache.http.client.entity.UrlEncodedFormEntity(formParams, 'UTF-8');
 var httpPost = new org.apache.http.client.methods.HttpPost(url);
 httpPost.setEntity(postEntity);
 var response = jClient.execute(httpPost);  
 var responseStatus = response.getStatusLine().getStatusCode();
 result.status = responseStatus;
 if(responseStatus == 200){
   result.body = org.apache.http.util.EntityUtils.toString(response.getEntity(), 'UTF-8');
 }else{
  result.body='';
 }
 return result;
};

使い方は、サンプルDBやコメントにも書いていますので割愛。

今回は、GETとフォームの値を送信するPOSTの関数を作成しました。
至極簡素な関数で、戻りはテキストしか想定していません。
認証が必要な場合は、Basic認証やダイジェスト認証をHTTPヘッダに埋め込む必要があります。
その場合は、「UsernamePasswordCredentials」クラスや「BasicAuthCache」クラス、「BasicScheme」クラスなどを使用して、HTTPリクエストヘッダに登録することができます。

詳しくは、「apache httpclient basic認証」でぐぐってみてください。

2015年6月5日金曜日

IBM XCITE 2015(1日目だけ) レポート(4)

これで IBM XCITE については最後
Bluemixで提供されるWatsonサービス

dev@XCITEとは別に、展示のほうでBluemixで提供されるWatson APIのブースで話を聞いてきました。

Bluemixではベータ版では有りますが、Watson APIを公開していて、現在は無料で使えるとのこと。
デモは、「IBM Developer Cloud」で公開しているそうです。

ただ、日本語にはまだ対応しておらず、現在ソフトバンクの協力の下、"Watson日本語を勉強中"。
リリース時期は今年中を考えていたけど、もうちょっと時間かかりそうとのことだそうです。

APIの種類と概要は↓こんな感じ。
#私のつたない英語の翻訳と勝手な見解なので、正確には違うかもー。ご指摘があればコメントでお願いします。


  • Personality Insights(パーソナリティ分析)
    テキストの文書から、そのテキストがどのようなものなのかを予め定められてキーワード別に重み付けし、どのような文書なのか、傾向があるかを分析することができる。
  • Natural Language Classifier(自然言語分類)
    短い文書、フレーズに対して独自に事前定義されたキーワードをスコアをつけて返す。
  • Concept Insights(コンセプト分析)
    全文検索のようなもの。ただし指定されたキーワドの意味を理解し、より人間的な検索が行えるところが違う。「ニューヨーク」を「ビッグアップル」とも認識するとか。
    英語版のWikipedhiaのデータでトレーニングされているらしい。
  • Concept Expansion(コンセプト拡張)
    コンセプト分析を口語てきな不明瞭な文書でも解釈して、キーワードをスコアを付けて返す。
  • Language Identification(言語識別)
    テキストが何の言語で書かれているか判断する
  • Machine Translation(機械翻訳)
    テキストを機会ご翻訳する。Language Identificationと合わせれば、変換先の言語だけ指定すれば良さそう。
  • Message Resonance(メッセージ反響?共鳴?)
    予め設定したカテゴリの人々のブログやつぶやきなどを分析しておき、 あるフレーズの各単語が、指定したカテゴリの人たちにどの程度ウケるのかを数値化して表示する。
  • Question and Answer(質問と回答)
    自然言語の質問を解釈し、回答と思われる文書(URLなど)をスコアを付けて返す。
  • Relationship Extraction(関係抽出)
    文書から単語を抽出し、その単語がどんな種類(人、場所、イベント等)のものなのかを推測する。例えば
    IBM->組織、last year->日付
  • Speech to Text(音声認識)
    人間の言葉をテキストに変換する。
  • Text to Speech(読み上げ)
    テキストを音声で読み上げる。(音声データを返す)
  • Tradeoff Analytics(トレードオフ分析)
    さまざまな分野の目標を分析し、それぞれトレード・オフの関係にあることを分析する。
    例えば、スマートフォンを買うという目標と、将来のための資金を確保したい、という目標がトレード・オフの関係にあることを見抜く、とかそういうことらしいがよくわからない。#APIのメソッドも1つしか無いし・・・
  • Visual Recognition(画像認識)
    画像が何なのかを複数のキーワードをスコアをつけて返す。
    F1の写真であれば、car,auto racing,race car,motor sport などなどを返す。
で、 これらのサービスは、基本的にはまずWatsonを教育するところから始めなければならないそうなので、すぐにパワフルな分析ができる、というわけではな いらしいです。またWatsonの調教(?)によっても正確性に影響があるようなので、そのへんのスキルも必要になるかも。
#全てではなく、Concept Insignts はWikipediaのデータでトレーニングされているらしいですし、音声や画像に関しては、分析のもととなるデータの登録とかは必要ない・・・と思う。

で、Watsonとは別の人工知能としてAlchemyAPIも提供されています。こちらは、今年3月にIBMが買収した企業のサービスですね。分析のアプローチが異なるのだとか。

こちらは、インターネット上の文書をソースとして分析するようで、すぐに使えるサービスになっているようです。APIも同じようなものがいくつか有ります。

しかし、独自のデータを分析のソースとして登録したり調整したりできないので、組織特有の分析はできなそうで、この辺りがWatsonとの使い分けになってくるでしょうか。

買収したばかりなので、サービスとしてBluemixとは別のページだし、ちょっと扱いは異なるようです。いずれ統合されるでしょうね。




2015年6月2日火曜日

IBM XCITE 2015(1日目だけ) レポート(3)

イベントから2週間経過して旬も過ぎた感じですが、まだ続けます。

IBM Notes/Domino 最新事例と未来

最後に参加したセッションが、IBM 平塚さんと、鴨志田さんによる、「[クラウド × モバイル × ソーシャル]で革新を!- IBM Notes/Domino 最新事例と未来 -」のセッション。
お二人の軽快な掛け合いトークがGoodでした。

大手の小売業でXPagesとConnectionsをうまく連携して、取引先とのシームレスな連携を図っているという事例が紹介されていました。
Connectionでは、さらに社内だけではなく社外の取引先からもアクセスできるようにして、シームレス化を進めていく方針なのだとか。
コミュニケーションがスムースに取れるというのが重要で、且つその環境が簡単に用意できるというのはConnectionsの魅力ですね。

また国立がん研究センターでの導入事例も。こちらは一般向けに病院を探すという、XPagesを使ったWebでのサービス。
XPagesを利用することで、操作性の向上だけでなく、情報の修正にNotesクライアントしか使えないところを、リッチなWebUIを用意しクライアント無しでできるようにし、ライセンス数を削減するなどの工夫がされていました。
これについては別セッションで詳しく聞けるとのことでしたが、2日目で無理・・・(涙

いずれにしても、Notesの資産を最近のWeb技術を利用して、Notes以外のプラットフォームでスクラッチから作成するより非常に安価に素早く構築できなのだろうな、ということと、XPagesが要約広まりつつあるなという実感と、XPagesがDominoに与えたインパクトは、やはり大きいなと。

また、平塚さんの熱いビジネス論のお話も良かったです。
スタートアップに注力するだけでなく、やり続ける・続ける力が大事なのだと。
確かにスタートアップでは、スタートアップさせることのみを考え、継続させるための方策や、その仕組にあまり意識が行かないですよね。
あと、Give takeも大事だけどGive backも大事!
見える化だけでなく、言える化も!
言える化は受け側の問題がある場合も多いですが、言う側も日本人は謙虚すぎたり間違っているかも・・・と考えてしまいがちですよね。
環境、意識、風土を変える努力が必要。


さらにもうちっと続くんじゃ

2015年5月28日木曜日

IBM XCITE 2015(1日目だけ) レポート(2)

Bulemixの開発デモ

セミナーで講師がBluemixで実際にWatson APIをつかったWebアプリを作ってしまおうというイベント。

Watson APIはいくつかあるんだけど、画像解析のものを利用していました。

具体的には、人が写った写真をアップロードして、その人の性別、年齢を判別し、且つ著名人であればその名前まで返す、というものでした。

展示ブースのWatsonの話を長々と聞いてしまったおかげで、途中からの参加になってしまいましたが、人物分析という高度な機能が手軽に実装できるのはいいなと。
無料枠もあって私もアカウント持っているので、試してみようかな?
IBMさん、XPages on Bluemix早くしてください。


Bluemixを使ったハッカソン

事前に2日間、20歳前後の技術者が数チームに別れて、ハッカソンをやっており、その発表会と表彰が行われました。

お題は、ウェアラブルなセンサーとBluemixを使ったサービスを提供する、というもので、下記のような発表がありました。


  •  登山者の場所、心拍数などと、滑落時の動作を判断して危険であることを自動Tweetする
  •  赤ちゃんの寝返りを検知して親にメールする。スマホじゃなくてもサービスが提供できるのが特色だということでした。
  •  センサーを持った人同士がすれ違うと、スマートウォッチ(Apple Watch)やスマフォにアイコンが表示がされるので、早くタッチしたほうが勝ち、というゲーム
  •  登山やハイキングなどで観光で多くの人が足を長く止めたところを”絶景ポイント"として紹介する

などなど。創意工夫にあふれたものばかりで、非常に刺激を受けました。また、2日間という非常に短い時間でプロトタイプ的な物ができるのも、驚きです。

うーん、社内やコミュニティーでもハッカソンしたくなってきたー。
まずは、Bluemixを始めとしたクラウドサービスはあまり経験ないので、まずはなにか作ってみようかな。

もうちっとだけ続くんじゃ

2015年5月25日月曜日

IBM XCITE 2015(1日目だけ) レポート(1)

5月19日-20日に IBM XCITE 2015が開催されました。
で、鹿児島からはるばる行ってきたのですが、残念ながら19日だけの参加となりました。
XCITEはDominoだけでなくIBM全般のサービスを対象としていることから、Dominoに関することは薄め。
依って今回の記事もそうです。
でも、Dominoもその製品の範囲だけでなく、そこから広がる世界、的なものが見えたので、自分としてはとても有用でした。

今回はその1日目にあったdev@XCITEという開発者向けのイベントに参加しました。

画像は間違えて入ったPartner Dayの基調講演会場
dev@XCITEは同時刻に別の会場でした


キーノートの話

dev@XCITEのキーノートでは、IBMのBluemixのテクニカル・セールス・ディレクターであるJeroenさんによるお話。

「すべての会社はソフトウェア会社である」とのこと。
要はどんな企業でもソフトウェアを使用し、ソフトウェアの質やうまく使いこなすことがビジネスの成功につながっていると。
その中で、開発者は高機能で高品質なものを素早く作成していかなくてはならないと。

特に最近では、アナリティクスが重要で、例えば自社の製品に関するtwitterのつぶやきを集めて、どういった年代、性別の人が不満を持っているのか、というのを分析し、商品仕様やマーケティングに利用すると。
そういったことがBluemixのWatsonを使えばできるよーといった内容。
「Insignt of twitter」というサービスをすでに提供していて使用できるとか。

たしかにそういったものをスクラッチで作るのは、そんな気も起きないほど大変だけど、それがAPIとして提供され、手軽に利用できるのはすごいなと。

このように、これからのシステムはAPIが重要で、それがオープンであること、仕様が簡素であること、再利用がし易いことなどが挙げられていました。

あ、あとBluemixは.netにも対応したのねー。PaaSでMS以外では珍しんじゃない?使ってみよう。


パネルディスカッション

次は、パネルディスカッションとしてITベンチャー企業のCEOなどの4人のパネリストによる議論が聞けました。
主旨はこれからの技術者に必要なこと。
今回これが一番面白かったです。

その中の一人が、厚切りジェイソン氏!
ベンチャーの役員と掛け持ちしているとは聞いていたけど、こんなところに出てくるとは。
写真だと小さくなっちゃった。
厚切りジェイソン氏は右から2番め

でも今回はタレントとしてではなく、ITベンチャーの役員としての意見をギャグを交えながらも真面目に答えてましたよ。
「日本の会社はパッケージをそのまま使いたがらない!カスタマイズが大好き!お金もかかるのに!why Japanese people!?」と言っていたのには頷くしか無い。

で、「それが他社の差別化になると考えているからなのか、それは実際にそうなっているのか」というモデレータの質問には、氏はそこまで差別化にはなっていないのでは、という考え。
また、カスタマイズに注力するよりも、その力を新しいことに向かわせたほうが差別化が進むのでは。

アメリカでは、パッケージに業務を合わせるのが普通で、それでも大きくなる会社は大きくなっているんだから、ということでした。
でも他の二人の日本人ITベンチャーの若い社長らは、自分のものにしたいんだよねーとの意見も。
ちなみに、Jeroen氏からは、フランス人もカスタマイズが大好きとのお話が。へー日本人だけじゃないのねー。

カスタマイズも必要悪として捉える必要があるのかな。

あと、これからのエンジニアに必要なのは?との問いに、Jeroen氏は、
「APIが設計できること」という意見もあった。API大事よー。

後半へ続く。

2015年2月26日木曜日

CSVファイルのアップロードとインポート(2/2)

この記事の解説動画を配信中!

みなさん!XPages開発していますか!?

前回に引き続き、CSVファイルのインポート処理について書いていきます。

前回は、アップロードしたファイルの取得までをやりましたので、今回はCSVファイルの解析と文書保管までを書いていきます。

今回は、郵便局のホームページ で配布している、郵便番号のCSVファイルをインポートしてみます。

サンプルDBのファイルを、GitHubにアップロードしておきましたので、参考にしてください。
GitHub download

CSVファイルの解析

CSVファイルの解析を自前で頑張って書いてもいいんですが、CSVはカラムごとにカンマで区切られている、という他に、ダブルクォーテーションでくくられてたりいなかったり、ダブルクォーテーションの中のカンマはデリミタとして扱わなかったり、とか案外面倒です。

様々なパターンに対応するとなると、テストも含めて実装が大変ですよね。

そこで、オープンソースのJavaのライブラリを利用することにします。

今回は、SuperCSVというものを利用します。

Super CSV

ライブラリの登録

下記ページから、super-csv-distribution-2.2.1-bin.zipをダウンロードします。

download(GitHub)

ZIPファイルを展開したら、その中の"super-csv"フォルダ下にある、super-csv-2.2.1.jar を、NotesDBに取り込みます。

取り込む方法は、Designerで「ソース」→「jar」で右クリック→「新規jar...」をクリックすることで開くダイアログで、上記jarファイルを指定すると登録できます。

CSVの解析

Super CSVで解析するには、下記のサンプルを参考にしてください

var csvReader = new org.supercsv.io.CsvListReader(
 fileReader,
 org.supercsv.prefs.CsvPreference.STANDARD_PREFERENCE);
var line = csvReader.read();
 

まずは、CsvListReaderのオブジェクトをnewで作成します。引数には、前回作成したアップロードされたファイルのReaderである"fileReader"と、CSVのタイプを表す定数を指定します。

CSVのタイプを表す定数は、特殊なものでなければ上記例のもので良いと思います。

そのオブジェクトから、"read()"メソッドで1行づつデータを取り出します。取り出されたデータは、文字列の配列になっているので、CSVの1番目のカラムを取得する場合は、"line[0]"と指定します。

ドキュメントの保存

ここまでできれば、後はループして1行ずつ文書を保存していけばいいだけですね。

"read()"メソッドは、行が進んでこれ以上読み込めない場合には"null"を返しますので、その条件になるまで繰り返し処理をすればいいです。

while(!!line){
    //Documentの作成・保存
    var newDoc:NotesDocument = database.createDocument();
    newDoc.replaceItemValue("form", "PostalCode");
    newDoc.replaceItemValue("postalCode", line[2]);
    newDoc.replaceItemValue("ken", line[6]);
    newDoc.replaceItemValue("shikuchouson", line[7]);
    newDoc.replaceItemValue("chouiki", line[8]);
    newDoc.save();
    line = csvReader.read();
}

できあがり

最後に

このように、ライブラリを使用することで、意外と少ないコード量でCSVのインポートができたのではないかと思います。

もちろん、文書の保存時には値のチェックが必要な場合が多いでしょうから、そういった処理は適宜入れてくださいね。

海老原 賢次(EBIHARA Kenji)

リコーITソリューションズ株式会社(RICOH IT SOLUTIONS CO.,LTD.)

鹿児島ソリューション部(Kagoshima Department)

2015年2月22日日曜日

CSVファイルのアップロードとインポート(1/2)

この記事の解説動画を配信中!

みなさん!XPages開発していますか!?

去年の11月のXPages Dayでは、Excelへのエクスポートの話をさせていただきましたが、 インポートに関する質問をいくつか受けました。

イベントで紹介したツールでは、エクスポートしか対応していないので、 今回は、インポートについて書きたいと思います。

エクセルのインポートはちょっと難しいので、要件としてよくあるCSVファイルのインポートについて説明します。

サンプルプログラム

今回は、郵便局のホームページ で配布している、郵便番号のCSVファイルをインポートしてみます。

サンプルDBのファイルを、GitHubにアップロードしておきましたので、参考にしてください。
GitHub download

CSVファイルのインポートでの要点

CSVファイルのインポートをXPagesで行う時に問題になるのは、下記の2点ですよね。

  1. アップロードされたファイルの取得
  2. CSVファイルから値ごとの分解

これらについて説明します。

ファイルアップロードのコントロール

標準のコントロールにも、ファイルアップロード・コントロールがありますが、これはリッチテキストに添付するために利用しますね。なので、これからファイルを取得するのはちょっと至難の業が必要です。

そこで、このコントロールは使用せずにHTMLのinputタグを利用します。

<input type="file" name="postalCodeCsv" />
<xp:button value="import" id="button1">
    <xp:eventHandler event="onclick" submit="true"
        refreshMode="complete">
        <xp:this.action><![CDATA[#{javascript:
PostalCodeImport.csvImport();}]]></xp:this.action>
    </xp:eventHandler>
</xp:button>

標準のコントロールを使わなくても、ファイルはアップロードされます。

このようにアップロードされたファイルはDomino Server上の一時領域に保存されます。

"name"の属性値は任意の値ですが、SSJSで利用するので、わかり易い名前にします。

また、複数のfileタグを使用する場合は、"name"の値が重複しないようにしましょう。

ボタンは、ファイルのアップロードをインポートの処理を呼び出しています。

処理自体は、SSJSに記載します。

アップロードされたファイルの取得

ボタンを押した時に実行する関数を宣言しましょう。上のコードにあるように”PostalCodeImport.csvImport”という名前で作ります。

その中に、アップロードされたファイルの取得方法はこうなります。

PostalCodeImport = {};
PostalCodeImport.csvImport = function csvImport(){
    // step1 httpリクエストからパラメータを取得する
    var con = facesContext.getExternalContext();
    var request = con.getRequest(); 
    var map = request.getParameterMap(); 
    
    // step2 パラメータの中からアップロードファイルの情報を取得する
    //<input type="file" name="postalCodeCsv" />
    //の "name"に指定した値を指定する
    var fileData = map.get("postalCodeCsv"); 
    var file = fileData.getServerFile();

    // Step3 ファイルを取得し、JavaのFileReaderを生成する。
    var fileReader = new java.io.FileReader(file);

    //下記にCSVの解析と文書の登録が続きます

}

ステップは大きく3つに分かれています。

step1 では、HTTPリクエストの実態を取得しています。これは通常XPagesによってラップされていて、普段操作することはないオブジェクトです。

"request.getParameterMap"でブラウザからリクエストされた全パラメータ(入力データ)が取得できる、Mapオブジェクトを取得します。

step2 では、Step1で取得したパラメータの中から input type="file" タグの値、つまりアップロードファイルの情報”fileData"を取得します。

"fileData"の中には、上で説明した一時領域に保存された、ファイルのパス情報が入っています。それを"getServerFile()"メソッドで取得できます。

step3 では、そのファイルパスから、JavaのFileReaderクラスを利用して内容を取得します。

今回はここまで

次回は、CSVのの解析を説明します!