XPages SSJSで文字列から関数を動的に呼び出す方法
2016年03月14日JSON,Lotus Domino Designer,XPages アプリケーション開発,XPagesNotes/Domino 日本語,XPages,JSON,Notes/Domino,XPages アプリケーション開発
文字列から動的に関数を呼び出したいケースとは?
関数を文字列から動的に関数を呼び出したいケースってどんな時でしょうか? 例えばHTML GET/POSTメソッドのパラメーター値によって呼び出す関数を変えたい場合などが想定されます。
以下の例では、「http://mydomain.com/ApplyFuncXAgent.xsp?func=callMe」というような呼び出しに対してクライアントサイドJavascript(CSjS)でコールする関数を変更するというコードになります。
[code lang="javascript" highlight=""]
var strFunc = location.search.split('func=')[1];
switch(location.search.split('func=')[1]){
case "func1": func1(); break;
case "func2": func2(); break;
case "callMe": callMe(); break;
default: break;
}
[/code]
これを簡略化して文字列から動的に関数を呼び出したい場合、CSJSでは以下のような書き方ができます。
[code lang="javascript" highlight="2"]
var strFunc = location.search.split('func=')[1];
var funcObj = window[strFunc];
if (typeof funcObj === "function") funcObj();
[/code]
windowオブジェクトに登録されている関数オブジェクトを取得し関数としてコールしています。しかしながらXPagesのサーバーサイドJavascript(SSJS)ではwindowオブジェクトがありませんので別の方法で関数を呼び出してやる必要があります。
(1)windowの代わりにthisを使用する方法
[code lang="javascript" highlight=""]
var funcObj = this[strFunc];
[/code]
(2)eval()を利用する方法
[code lang="javascript" highlight=""]
eval(strFunc+"()");
[/code]
(1),(2)どちらでも同じ結果を得ることができます。
パラメーターを渡したい場合はcall()もしくはapply()を使用
SSJSでも文字列から直接関数として呼び出す方法は分かりましたが、次はその関数に引数を与えたい場合にどうするか。この方法はCSJSと同じになります。
例えば、「http://mydomain.com/ApplyFuncXAgent.xsp?func=callMe&args=aa,bb」というようにURLパラメータに[args=aa,bb]を追加して引数も渡す方法を想定します。この場合、以下のコードのようにcall()、もしくはapply()を利用してやることでパラメータを渡すことが可能になります。
[code lang="javascript" highlight="3"]
var argsAry = @Explode(args, ",");
var funcObj = this[func];
return funcObj.call(this, argsAry[0], argsAry[1]);
[/code]
apply()の場合はcall()の時の引数をカンマ区切りで指定するのではなく、第2引数にArrayとして指定してやります。
[code lang="javascript" highlight="3"]
var argsAry = @Explode(args, ",");
var funcObj = this[func];
return funcObj.apply(this, argsAry);
[/code]
XAgentと組み合わせたサンプル
今回自分が必要であったシチュエーションはAJAXによる非同期通信でビューの値をJSON形式で取得するための汎用的なロジックを作りたかったからでした。以下のサンプルコードはXAgentになっており関数名と引数値をURLパラメータで渡すことによって呼び出し関数を変えて目的のJSONの値を返すようになっています。
想定しているURLの呼び出しは「http://mydomain.com/hoge.nsf/ApplyFuncXAgent.xsp?func=testFunc&args=aa,bb」などです。
[code lang="xml" highlight="15,16,18"]
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" rendered="false">
<xp:this.resources>
<xp:script src="/xpCommon.jss" clientSide="false"></xp:script>
</xp:this.resources>
<xp:this.afterRenderResponse><![CDATA[#{javascript:var externalContext = facesContext.getExternalContext();
var writer = facesContext.getResponseWriter();
var response = externalContext.getResponse();
// Set context type etc
response.setContentType("application/json");
response.setHeader("Cache-Control", "no-cache");
// read parameters
var func = context.getUrlParameter("func");
var args = context.getUrlParameter("args");
var retTxt = callFuncByString(func, args);
writer.write(retTxt);
writer.endDocument();}]]></xp:this.afterRenderResponse>
</xp:view>
[/code]
上記XAgentから呼び出されているcallFuncByString()を含んだxpCommon.jssのサンプルコードです
[code lang="javascript" highlight=""]
function callFuncByString(func, args){
try{
var argsAry = @Explode(args, ",");
var funcObj = this[func];
return funcObj.call(this, argsAry[0], argsAry[1]);
}catch(e){
print(e);
}
}
function testFunc(arg1, arg2){
return "[{\"arg1\":\""+arg1+"\", \"arg2\":\""+arg2+"\"}]";
}
[/code]
複数のビューのJSON値を非同期通信で取得する毎にXAgentを用意しなくて済むといのがこの汎用化コードの利点ですが、関数を動的に呼び出すことそのものはデバッグがしづらくなるという欠点もあるため使用には慎重になったほうがいいケースもあると思います。
※セキュリティーの観点からこのXAgentをそのまま使うとSSJSの標準関数を含む幾多の関数を呼び出すことが可能になるので危険です。実際には機能制限をするなどして意図した関数以外を呼び出されないように注意を払ってください。
IBM Connect 2016 XPAGES 最新動向 Part 3 - XPAGESトラブルシューティング
2016年02月09日IBM Connect 2016,ibm connect,Notes/Domino 日本語,XPagesibm connect 2016,XPages アプリケーション開発,Notes/Domino,XPages
前回2回に渡りIBM Championがスピーカーを務めるセッションにフォーカスを当てたレポートブログを紹介してきました。
今回はPaul Withers氏の「"Marty, You're Just Not Thinking Fourth Dimensionally": Troubleshooting XPages」のセッションに参加した内容を振り返りたいと思います。
このセッションではStackoverflowで寄せられた質問などをもとにXPAGESでの間違ったアプローチの紹介やトラブルシューティングの方法などノウハウ情報を満載の内容となっていました。
また、このセッションではXPAGESの基礎知識を持っていることが前提になっており「XPAGESを既に使っている人は挙手してください」と質問すると会場のほぼすべての人が手を挙げていたのも印象的でした。 そして前列に座ったIBM Champion達が突っ込みを入れながらさらに話がディープに進んで行くのもIBM Connectのセッションならではの光景です。
documentidプロパティでは常に式言語(EL)を使うこと
このセッション内の数あるトピックの中でも全てのXPAGES開発者が知っておくべきノウハウであり、知らずにやってしまいがちな落とし穴であると思ったのがこの「documentidプロパティなどでは常に式言語(EL)を使う」ということでしたので、私自身でテストしたサンプルコードを交えてこのトピックを掘り下げて紹介したいと思います。
※ちなみに式言語(EL)とは${...}もしくは#{...}で始まるコードの事で#{javascript:...}ではないことと区別しています。
Stackoverflowのこちらのリンク「Why does this code write out TWO documents?」でPaul氏が自ら回答している内容にも絡んでいるのですが、Paul氏が指摘するには、式言語(EL)を使わなければページロード時にdocumentidのプロパティ計算ロジックが4回も呼ばれてしまうと指摘しています。
まずはこちらに用意したサンプルコードを見てください。
[code lang="xml" highlight="5,10"]
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xe="http://www.ibm.com/xsp/coreex"
xmlns:xc="http://www.ibm.com/xsp/custom">
<xp:this.beforePageLoad><![CDATA[#{javascript:
viewScope.selectedPage = "AllContacts";}]]></xp:this.beforePageLoad>
<xp:this.data>
<xp:dominoDocument var="document1" action="editDocument">
<xp:this.documentId><![CDATA[#{javascript:
var v:NotesView = database.getView(viewScope.selectedPage);
var doc:NotesDocuent = v.getFirstDocument();
if (doc == null){
print ("not found");
return null;
}
else{
print ("doc found");
return doc.getUniversalID();
}}]]></xp:this.documentId>
</xp:dominoDocument>
</xp:this.data>
<xp:panel>
<xe:widgetContainer id="widgetContainerHeader">
<xp:panel>
<!-- フィールドの表示 -->
</xp:panel>
</xe:widgetContainer>
</xp:panel>
</xp:view>
[/code]
Domino文書データソースを定義する箇所でdocumentIdプロパティに対して値の計算をしています。
UNIDを引っ張ってきたいのでViewを取得して文書を取得してそのUNIDを返すというロジックになります。
如何でしょうか? 皆さんもこれに似たロジックを書いた経験はないでしょうか?
このサンプルには1つの致命的な問題と2つの推奨されないコードが含まれています。
1つ目の致命的な問題とはbeforePageLoadにてviewScopeの変数をセットしデータソース内でそのviewScope変数を利用しているという箇所です。
これはデータソースのほうが先にプロセスが走りその後にbeforePageLoadのプロセスが走るため5行目のviewScope.selectedPageが意図したとおりに設定されずサーバーエラーを起こしてしまいます。
そこでひとまず問題を解決するために以下のようにコードを書き換えます。
[code lang="xml" highlight="8"]
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xe="http://www.ibm.com/xsp/coreex"
xmlns:xc="http://www.ibm.com/xsp/custom">
<xp:this.data>
<xp:dominoDocument var="document1" action="editDocument">
<xp:this.documentId><![CDATA[#{javascript:
var v:NotesView = database.getView("AllContacts");
var doc:NotesDocuent = v.getFirstDocument();
if (doc == null){
print ("not found");
return null;
}
else{
print ("doc found");
return doc.getUniversalID();
}}]]></xp:this.documentId>
</xp:dominoDocument>
</xp:this.data>
<xp:panel>
<xe:widgetContainer id="widgetContainerHeader">
<xp:panel>
<!-- フィールドの表示 -->
</xp:panel>
</xe:widgetContainer>
</xp:panel>
</xp:view>
[/code]
beforePageLoadでのviewScopeの利用をやめ、8行目にビューの値をハードコードで渡してやりました。これでとりあえずサーバーエラーは回避され、見かけ上は意図したとおりにブラウザでこのコードを表示されるでしょう。
推奨されないコード その1
しかし、このコードにはまだ推奨されないコードが含まれており、試しにブラウザでこのコードを表示してみるとAdministratorのコンソールに以下のような出力があることが確認できます。
HTTP JVM: doc found HTTP JVM: doc found HTTP JVM: doc found HTTP JVM: doc found
このように、documentIdの値の計算の処理が4回も呼び出されています。これこそが今回Paul氏が指摘する問題の箇所になります。
Paul氏によると4回も呼び出される理由は以下のようになります。
式言語(EL) 【${...}もしくは#{...}】を使わなかった場合、documentIdのようなプロパティを
- Panel内に追加した場合、beforePageLoadの後に2回呼び出される
- XPage内に追加した場合、beforePageLoadの前に2回呼び出される。(このときbeforePageLoadで追加したscope変数は使えない)
- 常にrender response時に2回呼び出される
ということで、上記サンプルの場合4回呼び出されるということになります。
そこで回避策として式言語(EL)を利用することでこの問題は回避されます。

以下に1回のみ呼び出される式言語(EL)を利用したサンプルコードを追加します。
[code lang="xml" highlight="20"]
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xe="http://www.ibm.com/xsp/coreex"
xmlns:xc="http://www.ibm.com/xsp/custom">
<xp:this.beforePageLoad><![CDATA[#{javascript:
javascript:viewScope.selectedPage = "AllContacts";
var v:NotesView = database.getView(viewScope.selectedPage);
var doc:NotesDocuent = v.getFirstDocument();
if (doc == null){
print ("not found");
viewScope.docId = null;
}
else{
print ("doc found");
viewScope.docId = doc.getUniversalID();
}}]]></xp:this.beforePageLoad>
<xp:this.data>
<xp:dominoDocument var="document1" action="editDocument"
documentId="#{viewScope.docId}">
</xp:dominoDocument>
</xp:this.data>
<xp:panel>
<xe:widgetContainer id="widgetContainerHeader">
<xp:panel>
<xc:beforePageLoad></xc:beforePageLoad>
</xp:panel>
</xe:widgetContainer>
</xp:panel>
</xp:view>
[/code]
このコードをadministratorコンソールで確認すると
HTTP JVM: doc found
のように1回しか呼び出されていないことが確認できます。
また、式言語(EL)で「動的に計算」を利用しているため、beforePageLoadで設定されたscope変数が利用できていることにも注目してください。
documentId="#{viewScope.docId}"
の箇所が
documentId="#{javascript:viewScope.docId}"
では意図した動作になりません。
推奨されないコード その2
Domino文書のデータソースを定義する際にignoreRequestParams="true"を明示的に定義してやらないとURLパラメータのdocumentIdで指定された値が常に優先されるため、このようなロジックを書くときはignoreRequestParams="true"を明示的に定義してやるべきです。
こんな事例が沢山
今回はこのブログを書くにあたってPaul氏の指摘を深堀して実証実験を行ってみましたが、実際にPaul氏のセッションではこれに似た内容がいくつもスライドとデモで紹介され、どれもがものすごいスピードで紹介されるためはっきり言ってついていくのがやっとな状態のかなりレベルの高い内容となっていました。
1年を通してStackoverflowでいくつもの質問に対して回答をしているPaul氏ならではのノウハウの詰まったセッションであっただけに、今回のセッションに参加できただけでもIBM Connectに来た甲斐があったと思える、そんなセッションでした。
なお、こちらのセッションのスライドは既に公開されており、こちらより確認できます。
http://www.idonotes.com/IdoNotes/IdoConnect2013.nsf/dx/1279a-marty-youre-just-not-thinking-fourth-dimensionally-troubleshooting-xpages-2016.htm
Chris Millerさんのサイトでその他のセッションを含めLotusphere 2013からのセッションがタイトル別にまとめられています。既に2016年のセッションもいくつか登録されているようなので確認してみてください。
IBM Connect 2016 XPAGES 最新動向 Part 2 - 外部連携
2016年02月08日IBM Connect 2016,Notes/Domino 日本語,XPages,ibm connect 2016XPages アプリケーション開発,Notes/Domino,XPages
前回のIBM Connect 2016レポートブログでIBM Championがスピーカーを務めるセッションが熱いと題し、Single Page ApplicationをXPAGESで作るセッションやモダンなXPAGESアプリケーションを作るためのライブラリ群などの紹介をしました。
XPages,Javaを使って外部システムと連携
今回はIBM ChampionであるJulian Robichaux氏とKathy Brown氏による「AD-1387 Outside The Box: Integrating with Non-Domino Apps using XPages and Java」のセッションに参加した内容を振り返ってみたいと思います。
XPAGESとJavaを使ったDomino以外のアプリケーション連携ということでCSV、XML、JSONのデータを様々な手法で連携する方法を紹介していました。また後半ではIBM Social SDKやOAuthやQUICKBASEを使った連携、RDB連携にも触れまさに外部連携を網羅する内容になっていました。
CSV操作 - OpenCSV
手始めにCSVの扱い方から説明が始まりました。今更CSVの話なんて聞きたところでなにも面白くないだろうと思い、このセッションに参加したことを少し不安に思っていたところ、そこはやっぱりIBM Champion達。XPAGESでCSVに限らずメタデータを扱うときはJava Bean(Modelクラス of MVC)を作りましょう、とCSVは単なる滑り出しのためのトピックであり、実際はどんどんとディープな内容で進んで行きました。
Java Beanのサンプルは以下のようになります。
[code lang="java" highlight=""]
public class EasyBean {
private String name;
private int count;
public EasyBean() {}
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
public int getCount() { return count; }
public void setCount(int count) {
this.count = count;
}
}
[/code]
そして、CSVの読み込み自体はOpenCSVというライブラリを使うという内容でした。ここで注意点は最新版のVersion 3.6はJava 7+となっており、依存関係の問題からJava 6を使っているDomino 9.0.2 FP4ではVersion 2.3を使うことになります。
こちらにOpenCSVを使ったサンプルコードを載せておきます。
[code lang="java" highlight=""]
public static List convertCSV(String csvText) {
try {
CSVReader reader = new CSVReader(new StringReader(csvText));
ColumnPositionMappingStrategy<MovieBean> strat =
new ColumnPositionMappingStrategy<MovieBean>();
strat.setType(MovieBean.class);
String[] columns = new String[] {
"title", "studio", "year", "adjustedRevenue", "unadjustedRevenue"};
strat.setColumnMapping(columns);
CsvToBean csv = new CsvToBean();
List list = csv.parse(strat, reader);
return list;
} catch (Exception e) {
// log this!
return null;
}
}
[/code]
XMLをパースするためのJAXB
こちらのソリューションは既にJava 6+に含まれているためインストールの必要はありません。利用の仕方はJava Beanの記述にアノテーションを利用しどのフィールドがXMLのどのエレメントにマッピングされるかを明示してやります。
サンプルコードは以下のようになります。
[code lang="java" highlight=""]
public static MovieBeanList convertXML(String xml) {
try {
// see @XML annotations on Java beans
JAXBContext jc = JAXBContext.newInstance(MovieBeanList.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
MovieBeanList movies = (MovieBeanList)unmarshaller.unmarshal(
new StringReader(xml));
return movies;
} catch (Exception e) {
// log this!
return null;
}
}
[/code]
JSONのパース
JSONのパースにはXPAGESライブラリにあるcom.ibm.commons.util.io.json.JsonParserを使うことが出来ます。この時点でJavaカスタムオブジェクト(=上記で紹介したようなJava Bean)ではなくJava Maps、ListにJSONデータがパースされるためJava Beanを生成するには別途アンマーシャル(JSONからJava Beanを生成するプロセス)が必要ですが、ここではGSONやFlexJSONなどに触れつつDominoで利用する場合にセキュリティの問題が起こることになるため独自でアンマーシャルを記述する方法を紹介していました。
アンマーシャルのロジック自体はありませんが、JSONをパースする呼び出し部分は以下のようになります。
[code lang="java" highlight=""]
public static List convertJSON(String json) {
try {
Object stuff = JsonParser.fromJson(JsonJavaFactory.instance, json);
List list = buildObjectFromJSON(MovieBean.class, stuff);
return list;
} catch (Exception e) {
// log this!
return null;
}
}
[/code]
JAXBを使ったJSONのアンマーシャルもネットではいくつもサンプルコードが公開されていますので、それと合わせてXPAGES用の独自アンマーシャルコードを作ってみるのがいいと思います。
XAGENT, REST, SocialSDKと内容がてんこ盛り
CSV、XML、JSONのパースとJava Beanによるデータ格納を説明し終えた後は、実際のデータ取得方法としてXAGENTでInputStreamを使い外部システムへのアクセスの説明があり、取得後のObjectをXPAGESへ出力する説明があり、次にRESTでのアクセス方法からSocialSDKを使った連携ではOAuthに触れ、最後にQuickbaseと呼ばれるサービスを使った連携方法まで、まさにこれさえ聞けばXPAGESのシステム連携は基礎はしっかりと抑えられる内容になっていました。
このセッションの内容を全てブログに書き起こすとものすごいボリュームになってしまうため後半の説明は割愛しますが、もし興味があれば「AD-1387 Outside The Box: Integrating with Non-Domino Apps using XPages and Java」のセッション資料がいずれ公開されると思いますので時間をおいて確認してみてください。
IBM Connect 2016 XPages最新動向
2016年02月03日Lotus Domino Designer,Notes/Domino,XPages,IBM ChampionIBM Connect 2016,Notes/Domino 日本語,XPages
IBM Championのセッションがとにかく熱い!
日本からIBM Connect 2016に参加してい我々やIBM Championのチームスタジオ 加藤さんなどからIBM Connect 2016の最新情報などが少しずつ発表されていますが、Notes/Dominoに関するホットな最新情報は残念ながらほとんどありません。
そのため例年では当たり前のようにある、新しい機能を説明するセッションやDeep Diveと題して新しい機能を掘り下げて説明するセッションなどがさほど見当たらず、その代わりにIBM Championがスピーカーを務めるテクニカルセッションが多く用意されているように感じています。
XPAGESは進化を続ける!
Notes/Dominoの新機能がさほどないとしても、それはXPAGESの停滞を意味するものではない、ということをIBM Championのセッションを受けるとヒシヒシと感じることが出来ます。
すでにXPAGESはWEB技術と共に進化を続けることができ、XPages Extension Libraryに代表されるように、その進化は既にIBM Champion達を始めとしたコミュニティの力に委ねられていると言っても言い過ぎではないはずです。
IBM Championがスピーカーを務めるセッションでデモされるXPAGESアプリはDomino標準のXPAGES機能では実現することが出来ないようなモダンな作りになっており、どのセッションも観客の食いつき度合いが全く違います。
今回は、XPAGESのセッションに参加して得ることが出来た最新動向をザックリとですかお伝えしたいと思います。
The XPages of Things: Integrate Bluemix with Your XPages Applications for a World of Possibilities - 1075A
1月31日BP Summitのセッションです。 IBM ChampionのJohn Jardinさんによるセッションでした。
このセッションではBluemix、Node-RED、XPages、Websocketの技術を使いTwitterのつぶやきをつぶさに取得しXPAGESで作られたページに表示するというデモが行われました。
実はこのアプリの中にもモダンなWEB技術が多数盛り込まれていましたが、その技術の説明を次にあるセッションで詳しく解説してくれました。
Optimus XPages: An Explosion of Techniques and Best Practices - 1074A
2月1日のセッションで、このセッションもまたIBM ChampionのJohn Jardinさんによるセッションでした。
このセッションでは「Single Page Application」をXPagesで作成するという開発手法を説明していました。
「Single Page Application」というものはブラウザでページを一度読み込んだあとは、全て部分更新(AJAX)によりビュー表示、文書参照画面、編集画面、そしてその画面遷移をさせてしまう手法で彼のデモアプリにXPAGESは1つしかなく、全てインタラクティブに機能が構成されていました。
その技術を支える主な機能として、OpenNTF Domino API の利用を紹介していました。
OpenNTF Domino APIには以下の特徴があります。
- Domino Object Classesの拡張
- クイックインストールと設定
- JavaでDomino Objectのリサイクルが不要
- マルチスレッドプロセス
- XOTS (これについては別の機会に説明したいと思います)
そして、「Single Page Application」を実装するためにJavaによるMVCモデルを採用しており、全てのドキュメントをModel Java Classで機能させるところから始まります。
個人的な意見としては、このアプローチは決して簡単な開発手法ではなく、フォームという考えようによってはそれ自体がModelと位置付けることが出来るものをわざわざJavaで格納しなおすためにModel Classを用意しています。
これにはなによりSingle Page Applicationの実現に必要であることと、MVCモデルによる開発は慣れるとModel Class1つ作るぐらいはささっと出来てしまえるので、その点でデメリットよりメリットが大きく上回るという判断であると思います。
ViewはXPagesを使いControllerをJavaとSSJSで実装していくというイメージです。
ただ、これだけではモダンなSingle Page Applicationを作ることは出来ないはずで、その肉付けとしてUX部分に様々なWEB技術を取り入れていましたので、以下にその機能の一覧を羅列します。
- Twitter Bootstrap : いまやレスポンシブ対応の定番中の定番になってきていますね。
- Animate.css : モダンなアプリにあるさりげなく表示されたりするアニメーションの実装に一役かっています。
- Toastr : アラートダイアログのようにユーザーの処理をブロックすることのない通知機能
- Font Awesome : Vectorアイコンの集合体で利用がとても簡単ですね。
- Sweet Alert : アニメーションのある綺麗なアラートを実装することが出来ます。
ほかにもホットなセッションが目白押し・・・
BPセッションを含め3日間で5つ以上のIBM Championのセッションを受けましたが、John Jardinさん1人のセッションを紹介した段階で結構なボリュームになってしまいましたので、ほかのIBM Championの濃いセッションはまた別のブログ投稿でお伝えしたいと思います。
明日はクロージングセッションを含むIBM Connnectイベント最後の日です。
最終日はUserBRASTやGURUpalooza、Ask the Developerのようなお祭りのようなセッションが多数用意されているので最終日を楽しみたいと思います。
IBM Connect会場内の雰囲気
会場はエスカレーターを使って2フロアにわかれており、基調講演や展示会場などは
下のフロアになります。
左が基調講演になった会場の入り口、右が展示会場です。
今年のホテルは例年のDolphin Swanホテルと比べ、展示会場へのアクセスがかなり
よくなっており、セッションが終わると沢山の人が展示会場に足を運んでいました。
展示会場ではセッションの休憩にコーヒーやジュースが振る舞われたり、2日間に渡ってセッション終了後に
アルコールが振る舞われたりと、沢山の人が足を運んでいたので、出展している会社にとっては
例年より好印象に思っているんじゃないでしょうか。
下の階のセッションルームに通じる通路です。右側は大きな中庭になっており、たくさんの人が
パラソルの下で休憩をしていました。
セッションルーム前のデジタルサイネージです。
セッションルーム内の風景
Business Partner Summit 基調講演 - 2016/01/31
BP Summit 基調講演 (OGS)
IBM Connect 2016が始まる1日前はビジネスパートナー向けに1日用意されたBP Summitと呼ばれるセッションが一日用意されています。
まず、基調講演では各分野、エリアにてIBMへの貢献が優れていたビジネスパートナーが発表される表彰式があります。
日本エリアからはリコージャパンさんが表彰されました。おめでとうございます。
その後、「X: THE EXPERIENCE WHEN BUSINESS MEETS DESIGN」の著者であるBRIAN SOLISというゲストスピーカーによる講演がありました。
自分はBRIAN SOLISという方を知らなかったのですが、我々がアプリケーションを作るうえでデザインがいかに重要であるかを沢山のジョークを交えて講演してくれました。
デザインといってもWEBデザインなどに留まる話ではなく、新しい製品を作るとき、新しいテクノロジーを形にするときなどにどのように人々の心に訴えかけることが出来るか、というデザインの本質に迫る話でした。
ディズニーの新しいテクノロジーに対するアプローチを例に出し、子供の手首に巻いたリストバンドによりテーマパークの入場やアトラクションのパスだけでなく、ホテルのキーやショップでの支払いにもなるというアプローチを紹介していました。 子供がミッキーマウスのデザインがなされた半球体のセンサーにリストバンスをかざすだけで今までには出来なかった上記の沢山のことが出来るようになります。
「人は言われたこと、書いたことは忘れるが、感じたことは忘れない」
BRIAN SOLISさんが説明していたのが印象的でした。
参加者の普段見落としがちな視点を沢山のユーモアを交えて紹介していてとてもいい基調講演だったとおもいます。
IBM Connect 2016 - Day1 基調講演
2016年02月02日IBM Verse,IBM Connect 2016,Notes/Domino 日本語
基調講演 (Open General Session)
今年の基調講演はなぜかPart1とPart2に分かれて行われました。
8時AMからの基調講演が始まる前のスクリーンにはIBM Championの紹介が行われており、日本からもチャンピオンの顔写真とともにでかでかとスクリーンに紹介がされていました。
基調講演 Part 1ではゲストスピーカーのHost of National Geographic’s Brain GamesのJason Silvaさんがテクノロジーの進化を人類の進化になぞって独自の視点で語っていました。
IBM Connectの基調講演はそれ自体が映画のような見ごたえのあるエンターテイメントになっていて、参加するといつも、なにか新しいことにチャレンジする精神を呼び起こされます。
Part2ではIBMプロダクトのデモが全般にわたって行われ、IBM Verseの新機能がまず紹介されました。
例年通り、General ManagerのJeff氏による紹介で始まりました。
IBM Connect 2015から断片的に紹介されていたカードスタイルのUIがより具体的に紹介されました。
IBM Verseの進化としてメール本文にもAnalyticsの技術が使わるデモが紹介されました。
IBM Verseのカレンダーも一新されてます。今まではiNotesのWebカレンダーと変わらない見た目で間に合わせで作ったようなUIになっていましたがようやくIBM Verseっぽい進化を遂げてくれたみたいです。
目玉になる新機能の部分がハイライトで強調されています
Extensibility: 開発者によってIBM Verseに手を加えることが出来るようになります。
Homepage; カードスタイルで一新されます。
Calendar; Verse用UIが大幅に強化されるようです。
Verse Offline: アクションメニューからオフライン設定に切り替えて使用するデモが紹介されました。
モバイルアプリの機能が強化され、Connections CloudやMeetingとの連携がよりシームレスに行われるようになっていました。
モバイルアプリにもAnalyticsの機能が組み込まれるデモがありました。
タブレットでConnections Cloudのファイル共有やアクティビティーストリームを使いPCユーザーとも円滑に業務を進めていくデモが紹介されました。

Personal Assistant: Analyticsの機能によりまるで個人のアシスタントがそばにいるような感覚でツールを使えるようになる、という意味であると理解しました。
IBM Connections Cloud とSalesforceの連携を行っているデモがありました。前日のBP SummitでAppFusionsの開発者によるデモが行われましたが、おそらくこのデモではAppFusionsのAPI連携の機能が裏で動いていると考えて間違いないと思います。 その時のデモでは、Connections Cloud 上にSalesforceのIssue 一覧を表示させ、Salesforceに遷移後にFieldを変更するとその変更内容がConnections CloudのアクティビティーストリームにEmbedded Experienceと共に更新される、というデモでした。
カードタイプUIによるConnections Cloudのコンテンツを表示する一例がデモされました。例えばこの画面右側に表示されているものがConnections Cloudのアクティビティーストリームに相当するようです。
その他、コンテンツマネージメントシステムとConnections Cloudのファイル共有、アクティビティーストリームがシームレスに行われるデモなどが行われました。
TOSCANA Projecと呼ばれる新しいプロジェクト
デモの後半ではToscana Projectと呼ばれる新しいプロジェクトの紹介がありました。 以前にもIBMではProject Vulcanというコードネームで進められるプロジェクトがIBM Connect(Lotusphere)で紹介されたことがありました。その後、Project VulcanはIBM Verseへと製品名を変えProject Vulcanのコンセプトや機能はIBM Verseへと引き継がれた、という流れになりました。
Toscana Projectというコードネームの製品はメッセージングのソリューションであるようです。(LINEのような?) 今回のデモではアウトドアアイテムを製造、販売する会社を例にとって紹介が行われました。
メッセージをやり取りするなかでConnections Cloud Fileを使ったり、Docsを使ったりして業務を進めていくデモが行われました。
ケートリック 関東オフィスが移転致しました。
2016年2月2日(火)より、弊社関東オフィスが以下の住所に移転致しました。
〒141-0021 東京都品川区上大崎2-15-19 MG目黒駅前 512
ビジネスの拡大にむけて
XPAGES開発パートナーである(株)ライブネスと同じオフィスになり、よりビジネスの連携と開発スピードを強化していくことになると期待しています。
最寄り駅は目黒駅になります。お近くにお越しの際は是非お立ち寄りください。


IBM Connect 2016の濃い一週間が始まります。
2016年01月31日IBM Connect 2016,ibm connectNotes/Domino 日本語
今年も開催地はフロリダ オーランド、でもホテルが違う
毎年この時期に開催されるIBMビジネスカンファレンス「IBM Connect 2016」に今年も参加するためトータル17時間のフライトを経てアメリカ、フロリダ州 オーランドへやってきました。
自分は参加者として訪れるのは去年に続き2年目になります。 2006年から2013年までの7年間はIBM ConnectがLotusphereと呼ばれていたころから、実はカンファレンスの運営側の人間としてIBMベンダーとして働いていましたので合わせると9回目の参加ということになります。
そしてずっとIBM Connectが行われてきた会場が今年からDolphin Swan HotelからHilton Orlandoへと変更になりました。
敷地の大きさは今までのDolphin Swanよりも小さく感じますが、ホテルのランクとしてはHilton Orlandoのほうが少し上なのかな、と思います。(なんとなくですが・・・)
ビジネスパートナー向けセッションが1日、IBM Connectが3日
1月31日のイベントが正式に始まる前の日を使ってビジネスパートナー向けのセッションが1日用意されています。
そしてIBM Connect 2016自体は2月1日の基調講演(Open General Session)を皮切りに怒涛の如く3日間セッションが行われます。
注目のセッション
毎年、基調講演ではIBMの今年一年の方向性を示し様々な新しい発表が行われるため、今年はどのようなものが発表されるか楽しみです。
また、今年のセッションは開発者向けのセッションが多数用意されているように思います。
個人的にはIBM Verse APIやIBM Connections Cloud APIのなにか新しい情報が公開されるのではないかと期待しています。また近年勢いのあるnode.jsとDomino開発者を対象にしたセッションが行われたり、他のシステム、プラットフォームとの連携を加速させるセッションも多数用意されているため、新しいスキルやアイデアを習得する機会になることを期待しています。
参加予定のセッション
以下、自分が組んでみたセッションアジェンダです。
日曜日(BP Summit)
Coffee/Refreshments for IBM Business Partner Summit
09:00 午前 - 10:00 午前 - Hilton Orlando, Florida Foyer
IBM Connect Business Partner Opening General Session
10:00 午前 - 11:30 午前 - Hilton Orlando, Florida 4
Lou Sassano (IBM), Katrina Troughton (IBM)
The Path Ahead: The Enterprise Social Software & Digital Experience Roadmap
01:00 午後 - 02:00 午後 - Hilton Orlando, Florida 4
Carol Sormilic (IBM), GARY DOLSEN (IBM)
Making Money in the Cloud!
02:15 午後 - 03:15 午後 - Hilton Orlando, Florida 5
Ted Brufke (IBM), Glenn H. Newlove (IBM)
The XPages of Things: Integrate Bluemix with Your XPages Applications for a World of Possibilities
03:45 午後 - 04:45 午後 - Hilton Orlando, Lake Mizell AB
John Jardin (Ukuvuma Solutions)
Getting Technically Cozy with IBM Connections Cloud APIs and App Dev
05:00 午後 - 06:00 午後 - Hilton Orlando, Lake Highland AB
Patrick Li (AppFusions), David Simpson (AppFusions)
Solution EXPO Grand Opening Reception
06:00 午後 - 07:30 午後 - Hilton Orlando, Solution EXPO
Welcome Reception
07:00 午後 - 08:30 午後 - Hilton Orlando, The Promenade
月曜日
Opening General Session Part I: Turn Moments into Momentum
08:00 午前 - 09:00 午前 - Hilton Orlando, Orlando Ballroom
Jeff Schick (IBM), Clive Lightfoot (RURAL AFRICAN VENTURES INVESTMENTS LTD), James Weru (http://www.trutrade.net/), Vinith Misra (IBM), Peter Cardon (Marshall School of Business), Brianna Mayer (University of Southern California), Jamie Winger (University of Arizona)
Opening General Session Part II: The Engaged Enterprise Comes to Life
10:00 午前 - 11:15 午前 - Hilton Orlando, Orlando Ballroom
Rob Enright (IBM), Sarah Gibbons (IBM), GARY DOLSEN (IBM), Jeff Schick (IBM), Chris Crummey (IBM), Christine Kraemer (Deutsche Lufthansa AG), John Henderson (Texas Children's Hospital)
What the App? : A Modernization Strategy for Your Business Applications
11:30 午前 - 12:30 午後 - Hilton Orlando, Orange G
John Head (PSC Group, LLC), Mat Newman (IBM)
IBM Verse AppDev and Extensibility
02:00 午後 - 03:00 午後 - Hilton Orlando, Florida 6-7
Yun Zhi Lin (IBM)
Optimus XPages: An Explosion of Techniques and Best Practices
03:30 午後 - 04:30 午後 - Hilton Orlando, Orange F
John Jardin (Ukuvuma Solutions)
Outside The Box: Integrating with Non-Domino Apps Using XPages and Java
04:45 午後 - 05:45 午後 - Hilton Orlando, Lake Eola A
Julian Robichaux (panagenda), Kathy Brown (PSC Group LLC)
火曜日
Design Thinking for Application Development
08:00 午前 - 09:00 午前 - Hilton Orlando, Florida 6-7
Joseph A. Russo (IBM)
IBM Domino App.Next - Broadening Your Horizons with Bluemix
09:15 午前 - 10:15 午前 - Hilton Orlando, Orange F
Pete Janzen (IBM), Martin Donnelly (IBM)
node.js for Domino Developers
10:30 午前 - 11:00 午前 - Hilton Orlando, Solution EXPO Theater
Matt White (LDC Via)
Deploying, Securing, Customizing and Extending the IBM Connections Mobile App
01:15 午後 - 02:15 午後 - Hilton Orlando, Lake Mizell AB
Rusty Godwin (IBM), Jack O'Donnell (IBM)
Carnival Sailing Safer Seas with Domino
02:30 午後 - 03:30 午後 - Hilton Orlando, Florida 5
Hunter Medney (IBM), Walter Carvalho (Carnival Corp)
Extending the XPages Extension Library
04:00 午後 - 05:00 午後 - Hilton Orlando, Orange G
Padraic Edwards (IBM), Brian Gleeson (IBM)
Break Out of the Box - Integrate Existing Domino Data with Modern Websites
05:00 午後 - 05:30 午後 - Hilton Orlando, Solution EXPO Theater
Karl-Henry Martinsson (Deep South Insurance)
Deep Dive: Building Apps with IBM Connections Cloud APIs
05:15 午後 - 06:15 午後 - Hilton Orlando, Orange G
Patrick Li (AppFusions), David Simpson (AppFusions)
水曜日
#UserBLAST 2016
08:00 午前 - 09:00 午前 - Hilton Orlando, Lake Eola B
Mat Newman (IBM)
Building Responsive Applications Using XPages
09:15 午前 - 10:15 午前 - Hilton Orlando, Orange F
Brian Gleeson (IBM)
Real-time Video Chat XPage Application Using Websocket and WebRTC Technologies
10:45 午前 - 11:45 午前 - Hilton Orlando, Orange G
Csaba Kiss (Los Alamos National Laboratory)
GURUpalooza!
12:45 午後 - 01:45 午後 - Hilton Orlando, Florida 4
Amanda Bauman (IBM), Mat Newman (IBM)
ASK the Developers and Product Managers
02:00 午後 - 03:00 午後 - Hilton Orlando, Florida 4
Heidi Ambler (IBM), Brian Chaput (IBM), Carol Sormilic (IBM), John Woods (IBM)
Closing General Session: Discover your Inner Artist
03:30 午後 - 04:30 午後 - Hilton Orlando, Orlando Ballroom
Liz Urheim (IBM)
時差ボケとの闘い・・・
今年も例外なく、初日の夜は早くに起きてしまいました。 そこでこのブログを朝から書き始めたのですが、書き終わるころにはすっかり夜も明けていました。


イベント開催の間は時差ボケと戦いながらセッションを受け、慣れるころには帰国というタフな日々が続きますが、現地レポートとして時間をみつけてこちらのブログを投稿していきたいと思います。
IBM Champion 2016に任命されました
2015年11月27日ニュースNotes/Domino,xpagesday,XPages,IBM Champion
2015年11月24日にIBMよりメールが届き、自分がIBM Champion 2016に任命されたことを知りました。
今年でIBM Championとなるのは2年目となり、前年初めてIBM Championになった時の感動が思い起こされました。と同時にこれからもっとコミュニティの発展に寄与していけるようにと、改めて気が引き締まる思いです。
なお、日本から選出されたIBM Championは以下の4名です。
海老原 賢次 様 (リコーITソリューションズ株式会社)
加藤 満 様 (チームスタジオジャパン株式会社)
田付 和慶 (ケートリック株式会社)
御代 政彦 様 (株式会社エフ)
おめでとうございます! すでに皆さんがブログ等で言っていますが日本から選出された方が今年は6人から4人へ減ってしまいました。 IBM Championの選出基準がよりグローバルな視点へとシフトしたと聞いていますのでその影響は大きくあったのだと感じています。
自分は2015年、IBM Championとして初めての年を過ごしましたが、XPAGESDAYをはじめ、より積極的にスピーカーとしてセッションをさせて頂く機会がありました。
- IBM XCITE 2015 Spring (05/20/2015 Day2 OGS)
- XPagaesDay 2014 (11/18/2014 web session)
- Tek Tek Lotus, Feb 2015 (02/25/2015 IBM ConnectEd 2015 feedback session)
- Teamstudio Notes/Domino Web Seminar, April 2015 (04/22/2015 web session)
- Notes Shikoku Festa 2015 (10/23/2015 XPages and IBM Verse session)
振り返ると5回のセッションを行いましたが、やはり一番大きく緊張したのはIBM XCITE 2015 Springの基調講演の数十分間でした。ただおかげ様で何か一回り大きくなる機会を頂いたのだと感じています。
2年目のIBM Championとしての抱負・・・
例年通り、IBM側でIBM Champion を選出するにあたり以下の様なことを基準にしているとあります。
- IBM Collaboration Solutionsを広める
- 知識と専門技術の共有
- コニュニティへの貢献と成長の支援
- IBM ポートフォリオ全体に範囲を拡大
- ネガティブ、ポジティブ両方のフィードバックを建設的かつ専門的な方法で提供する
1年前、IBM Championとして日本発の情報を世界に発信することで、「日本のエンジニアもまだまだ世界に負けてませんよ!」という印象を世界に持ってもらいたい、ということを抱負として書かせていただきました。そこで行ったのが PlanetLotus.org へブログを登録し英語で情報発信を少しずつ行うということでした。 こちらの分はまだまだ不十分だったと反省点も残りますが、近いうちに英語でNotes/Dominoの技術を説明した動画配信なんてのも行いたいと考えています。
最近ではXPages on bluemixでドローンを操作するというセッションをXPagesDay2015で行ったので、それちらを英語で配信してもいいかもしれません。
2年目、引き続き”てくてくLotus”や”ノーツコンソーシアム”などをはじめコミュニティーへ貢献していきたいと考えております。 またNotes/Dominoを取り巻く環境もBluemixやXPagesの進化で様々なテクノロジーとの連携が強まり、より複雑さを増している気がします。沢山のエンジニアがNotes/Dominoを使い新しいものを生み出していけるよう、自分は新旧どちらのNotesエンジニアの視点にも立ち、少しずつ情報を発信し続けたいと思っています。
以上、2年目もどうぞよろしくお願い致します!






















