x pages day発表_20141118 final

42
1 目的 ノーツコンソーシアムは、お客様、取り扱いユーザー、IBM ICSチームか ら成る非営利団体です。情報交換や研究、セミナーを通じて、会員相互の 共通利益を追求します。 活動内容 各研究会(2014年度例) ソーシャル研究会 Xpages研究会 DPP研究会 大阪地区研究会 九州地区研究会etc… イベント開催 情報交換会 テクニカルセミナー ノーツコンソーシアムの概要 ノーツコンソーシアム Facebookペー https://www.facebook.com/notesc ons

Upload: fumiko-yamamoto

Post on 22-Jul-2015

797 views

Category:

Software


0 download

TRANSCRIPT

Page 1: X pages day発表_20141118 final

1

目的 ノーツコンソーシアムはお客様取り扱いユーザーIBM ICSチームから成る非営利団体です情報交換や研究セミナーを通じて会員相互の共通利益を追求します

活動内容 各研究会(2014年度例)

bull ソーシャル研究会

bull Xpages研究会

bull DPP研究会

bull 大阪地区研究会

bull 九州地区研究会etchellip

イベント開催

bull 情報交換会

bull テクニカルセミナー

ノーツコンソーシアムの概要

ノーツコンソーシアム Facebookページhttpswwwfacebookcomnotescons

2

Notes Consortium Home Page

httpwwwnotesconsgrjp

3

Notesconsortium Facebook

httpswwwfacebookcomnotescons

4

ノーツコンソーシアム 活動スケジュール(11月 ndash 12月)

オープンセミナー

クラウド時代の ノーツドミノを考える

12月12日(金) 1500-1700

渋谷IIC リモート

+-------------------------+

| ノーツコンソーシアム |

+-------------------------+

[検索]

【A5】ノーツコソーシアム XPages研究会中間成果発表

20141118

今年のXPages研究会は

いろいろな開発事例の紹介参加者からの開発事例紹介

XPages 開発におけるベストプラクティスの発掘(できれば)開発ルールの策定までやりたい

ベストプラクティス策定までの道のり

いきなりベストプラクティスはさすがに無理なので

bull【Step1】まずは失敗例困ったこと事例を集めて

bull【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

bull【Step3】最後に開発ルール案の提示

今は【Step2】の途中です

今回の発表では

bull 【Step1】まずは失敗例困ったこと事例を集めて

bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します

【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)

-初めてのXPagesではまった落とし穴とその解決方法-

20141118

アクロス株式会社

矢森 隆嗣

9

bull このパートではXPages研究会の中で

【Step1】まずは失敗例困ったこと事例を集めて

で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました

10

本パートのスピーカー

矢森 隆嗣

アクロス株式会社

11

本パートの目次

1XPagesってこんなもの

2初めてのXPages(困惑編)

12

1XPagesってこんなもの

XPagesDayをご参加の皆様

こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします

13

1XPagesってこんなもの

Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術

Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能

JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい

今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス

14

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 2: X pages day発表_20141118 final

2

Notes Consortium Home Page

httpwwwnotesconsgrjp

3

Notesconsortium Facebook

httpswwwfacebookcomnotescons

4

ノーツコンソーシアム 活動スケジュール(11月 ndash 12月)

オープンセミナー

クラウド時代の ノーツドミノを考える

12月12日(金) 1500-1700

渋谷IIC リモート

+-------------------------+

| ノーツコンソーシアム |

+-------------------------+

[検索]

【A5】ノーツコソーシアム XPages研究会中間成果発表

20141118

今年のXPages研究会は

いろいろな開発事例の紹介参加者からの開発事例紹介

XPages 開発におけるベストプラクティスの発掘(できれば)開発ルールの策定までやりたい

ベストプラクティス策定までの道のり

いきなりベストプラクティスはさすがに無理なので

bull【Step1】まずは失敗例困ったこと事例を集めて

bull【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

bull【Step3】最後に開発ルール案の提示

今は【Step2】の途中です

今回の発表では

bull 【Step1】まずは失敗例困ったこと事例を集めて

bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します

【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)

-初めてのXPagesではまった落とし穴とその解決方法-

20141118

アクロス株式会社

矢森 隆嗣

9

bull このパートではXPages研究会の中で

【Step1】まずは失敗例困ったこと事例を集めて

で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました

10

本パートのスピーカー

矢森 隆嗣

アクロス株式会社

11

本パートの目次

1XPagesってこんなもの

2初めてのXPages(困惑編)

12

1XPagesってこんなもの

XPagesDayをご参加の皆様

こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします

13

1XPagesってこんなもの

Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術

Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能

JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい

今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス

14

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 3: X pages day発表_20141118 final

3

Notesconsortium Facebook

httpswwwfacebookcomnotescons

4

ノーツコンソーシアム 活動スケジュール(11月 ndash 12月)

オープンセミナー

クラウド時代の ノーツドミノを考える

12月12日(金) 1500-1700

渋谷IIC リモート

+-------------------------+

| ノーツコンソーシアム |

+-------------------------+

[検索]

【A5】ノーツコソーシアム XPages研究会中間成果発表

20141118

今年のXPages研究会は

いろいろな開発事例の紹介参加者からの開発事例紹介

XPages 開発におけるベストプラクティスの発掘(できれば)開発ルールの策定までやりたい

ベストプラクティス策定までの道のり

いきなりベストプラクティスはさすがに無理なので

bull【Step1】まずは失敗例困ったこと事例を集めて

bull【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

bull【Step3】最後に開発ルール案の提示

今は【Step2】の途中です

今回の発表では

bull 【Step1】まずは失敗例困ったこと事例を集めて

bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します

【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)

-初めてのXPagesではまった落とし穴とその解決方法-

20141118

アクロス株式会社

矢森 隆嗣

9

bull このパートではXPages研究会の中で

【Step1】まずは失敗例困ったこと事例を集めて

で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました

10

本パートのスピーカー

矢森 隆嗣

アクロス株式会社

11

本パートの目次

1XPagesってこんなもの

2初めてのXPages(困惑編)

12

1XPagesってこんなもの

XPagesDayをご参加の皆様

こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします

13

1XPagesってこんなもの

Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術

Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能

JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい

今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス

14

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 4: X pages day発表_20141118 final

4

ノーツコンソーシアム 活動スケジュール(11月 ndash 12月)

オープンセミナー

クラウド時代の ノーツドミノを考える

12月12日(金) 1500-1700

渋谷IIC リモート

+-------------------------+

| ノーツコンソーシアム |

+-------------------------+

[検索]

【A5】ノーツコソーシアム XPages研究会中間成果発表

20141118

今年のXPages研究会は

いろいろな開発事例の紹介参加者からの開発事例紹介

XPages 開発におけるベストプラクティスの発掘(できれば)開発ルールの策定までやりたい

ベストプラクティス策定までの道のり

いきなりベストプラクティスはさすがに無理なので

bull【Step1】まずは失敗例困ったこと事例を集めて

bull【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

bull【Step3】最後に開発ルール案の提示

今は【Step2】の途中です

今回の発表では

bull 【Step1】まずは失敗例困ったこと事例を集めて

bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します

【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)

-初めてのXPagesではまった落とし穴とその解決方法-

20141118

アクロス株式会社

矢森 隆嗣

9

bull このパートではXPages研究会の中で

【Step1】まずは失敗例困ったこと事例を集めて

で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました

10

本パートのスピーカー

矢森 隆嗣

アクロス株式会社

11

本パートの目次

1XPagesってこんなもの

2初めてのXPages(困惑編)

12

1XPagesってこんなもの

XPagesDayをご参加の皆様

こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします

13

1XPagesってこんなもの

Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術

Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能

JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい

今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス

14

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 5: X pages day発表_20141118 final

【A5】ノーツコソーシアム XPages研究会中間成果発表

20141118

今年のXPages研究会は

いろいろな開発事例の紹介参加者からの開発事例紹介

XPages 開発におけるベストプラクティスの発掘(できれば)開発ルールの策定までやりたい

ベストプラクティス策定までの道のり

いきなりベストプラクティスはさすがに無理なので

bull【Step1】まずは失敗例困ったこと事例を集めて

bull【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

bull【Step3】最後に開発ルール案の提示

今は【Step2】の途中です

今回の発表では

bull 【Step1】まずは失敗例困ったこと事例を集めて

bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します

【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)

-初めてのXPagesではまった落とし穴とその解決方法-

20141118

アクロス株式会社

矢森 隆嗣

9

bull このパートではXPages研究会の中で

【Step1】まずは失敗例困ったこと事例を集めて

で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました

10

本パートのスピーカー

矢森 隆嗣

アクロス株式会社

11

本パートの目次

1XPagesってこんなもの

2初めてのXPages(困惑編)

12

1XPagesってこんなもの

XPagesDayをご参加の皆様

こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします

13

1XPagesってこんなもの

Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術

Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能

JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい

今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス

14

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 6: X pages day発表_20141118 final

今年のXPages研究会は

いろいろな開発事例の紹介参加者からの開発事例紹介

XPages 開発におけるベストプラクティスの発掘(できれば)開発ルールの策定までやりたい

ベストプラクティス策定までの道のり

いきなりベストプラクティスはさすがに無理なので

bull【Step1】まずは失敗例困ったこと事例を集めて

bull【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

bull【Step3】最後に開発ルール案の提示

今は【Step2】の途中です

今回の発表では

bull 【Step1】まずは失敗例困ったこと事例を集めて

bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します

【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)

-初めてのXPagesではまった落とし穴とその解決方法-

20141118

アクロス株式会社

矢森 隆嗣

9

bull このパートではXPages研究会の中で

【Step1】まずは失敗例困ったこと事例を集めて

で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました

10

本パートのスピーカー

矢森 隆嗣

アクロス株式会社

11

本パートの目次

1XPagesってこんなもの

2初めてのXPages(困惑編)

12

1XPagesってこんなもの

XPagesDayをご参加の皆様

こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします

13

1XPagesってこんなもの

Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術

Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能

JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい

今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス

14

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 7: X pages day発表_20141118 final

ベストプラクティス策定までの道のり

いきなりベストプラクティスはさすがに無理なので

bull【Step1】まずは失敗例困ったこと事例を集めて

bull【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

bull【Step3】最後に開発ルール案の提示

今は【Step2】の途中です

今回の発表では

bull 【Step1】まずは失敗例困ったこと事例を集めて

bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します

【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)

-初めてのXPagesではまった落とし穴とその解決方法-

20141118

アクロス株式会社

矢森 隆嗣

9

bull このパートではXPages研究会の中で

【Step1】まずは失敗例困ったこと事例を集めて

で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました

10

本パートのスピーカー

矢森 隆嗣

アクロス株式会社

11

本パートの目次

1XPagesってこんなもの

2初めてのXPages(困惑編)

12

1XPagesってこんなもの

XPagesDayをご参加の皆様

こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします

13

1XPagesってこんなもの

Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術

Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能

JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい

今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス

14

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 8: X pages day発表_20141118 final

今回の発表では

bull 【Step1】まずは失敗例困ったこと事例を集めて

bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換

の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します

【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)

-初めてのXPagesではまった落とし穴とその解決方法-

20141118

アクロス株式会社

矢森 隆嗣

9

bull このパートではXPages研究会の中で

【Step1】まずは失敗例困ったこと事例を集めて

で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました

10

本パートのスピーカー

矢森 隆嗣

アクロス株式会社

11

本パートの目次

1XPagesってこんなもの

2初めてのXPages(困惑編)

12

1XPagesってこんなもの

XPagesDayをご参加の皆様

こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします

13

1XPagesってこんなもの

Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術

Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能

JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい

今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス

14

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 9: X pages day発表_20141118 final

【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)

-初めてのXPagesではまった落とし穴とその解決方法-

20141118

アクロス株式会社

矢森 隆嗣

9

bull このパートではXPages研究会の中で

【Step1】まずは失敗例困ったこと事例を集めて

で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました

10

本パートのスピーカー

矢森 隆嗣

アクロス株式会社

11

本パートの目次

1XPagesってこんなもの

2初めてのXPages(困惑編)

12

1XPagesってこんなもの

XPagesDayをご参加の皆様

こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします

13

1XPagesってこんなもの

Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術

Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能

JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい

今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス

14

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 10: X pages day発表_20141118 final

bull このパートではXPages研究会の中で

【Step1】まずは失敗例困ったこと事例を集めて

で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました

10

本パートのスピーカー

矢森 隆嗣

アクロス株式会社

11

本パートの目次

1XPagesってこんなもの

2初めてのXPages(困惑編)

12

1XPagesってこんなもの

XPagesDayをご参加の皆様

こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします

13

1XPagesってこんなもの

Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術

Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能

JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい

今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス

14

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 11: X pages day発表_20141118 final

本パートのスピーカー

矢森 隆嗣

アクロス株式会社

11

本パートの目次

1XPagesってこんなもの

2初めてのXPages(困惑編)

12

1XPagesってこんなもの

XPagesDayをご参加の皆様

こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします

13

1XPagesってこんなもの

Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術

Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能

JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい

今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス

14

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 12: X pages day発表_20141118 final

本パートの目次

1XPagesってこんなもの

2初めてのXPages(困惑編)

12

1XPagesってこんなもの

XPagesDayをご参加の皆様

こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします

13

1XPagesってこんなもの

Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術

Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能

JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい

今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス

14

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 13: X pages day発表_20141118 final

1XPagesってこんなもの

XPagesDayをご参加の皆様

こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします

13

1XPagesってこんなもの

Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術

Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能

JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい

今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス

14

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 14: X pages day発表_20141118 final

1XPagesってこんなもの

Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術

Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能

JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい

今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス

14

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 15: X pages day発表_20141118 final

2初めてのXPages(困惑編)

最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは

これどうすればいいの (_)

うまくいかない~(gt_lt)

の連続で試行錯誤や調査などずいぶん遠回りをしました

15

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 16: X pages day発表_20141118 final

2初めてのXPages(困惑編)

アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ

「やっぱりみんなハマるんだねぇ」

とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します

XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです

16

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 17: X pages day発表_20141118 final

2初めてのXPages(困惑編)

メニュー

1 当然必要ですよねJavaScript

クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは

2 なんかエラーでたデバッグってどうやろう

3 既存のフォームに仕込まれた式が使いたいんだけど

4 競合ってどう処理するの

5 URLでファイルダウンロードリンクを貼りたい

でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

6 ロードバランサーなどで代表アドレスがあると

17

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 18: X pages day発表_20141118 final

2初めてのXPages(困惑編)

1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは

SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない

CSJS

クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も

18

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 19: X pages day発表_20141118 final

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう

CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある

19

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 20: X pages day発表_20141118 final

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限

20

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 21: X pages day発表_20141118 final

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS

処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能

サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)

21

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 22: X pages day発表_20141118 final

2初めてのXPages(困惑編)

2 なんかエラーでたデバッグってどうやろう(つづき)

SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます

SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります

注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)

22

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 23: X pages day発表_20141118 final

2初めてのXPages(困惑編)

3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます

23

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 24: X pages day発表_20141118 final

2初めてのXPages(困惑編)

4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能

24

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 25: X pages day発表_20141118 final

2初めてのXPages(困惑編)

5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど

rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う

httpホスト名DBファイルパス0ドキュメントID$FILEファイル名

XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment

DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名

25

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 26: X pages day発表_20141118 final

2初めてのXPages(困惑編)

6 ロードバランサーなどで代表アドレスがあると

facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる

contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる

26

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 27: X pages day発表_20141118 final

3続いて

27

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 28: X pages day発表_20141118 final

【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)

20141118

コムチュア株式会社

和智一臣

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 29: X pages day発表_20141118 final

引き続き失敗例困ったことの発表

bull コードの散在巨大なライブラリ

bull スコープ変数

bull SSJSCSJSの使い分け

bull クライアントサイドJavaScriptのお作法

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 30: X pages day発表_20141118 final

JSコードの散在JS巨大なライブラリ

bull 目的の実装箇所がなかなか見つからない

bull スクリプトライブラリが巨大化してデザイナの動作が重い

bull イベント処理コードが異様に長い

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 31: X pages day発表_20141118 final

ライブラリ化のルールが必要

bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意

bull 共通ライブラリは放っておくと巨大化

bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化

bull ページ毎に専用ライブラリ(というのもあり)

bull 目的影響範囲が一目瞭然

bull ライブラリの数は増えるけど

bull メンテナンス頻度使い回しの容易さを考慮

bull 共通部品はライブラリに逃がさないで

bull ページ内にガシガシコードを書く方が使い回しが楽

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 32: X pages day発表_20141118 final

スコープ変数

bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた

bull にもかかわらず置き換えたせいでバグ発生

bull applicationsessionviewrequestScopeどう使い分ける

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 33: X pages day発表_20141118 final

スコープ変数のルール化

bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか

bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化

bull 何でもSessionScopeはNGbull 基本はRequestScope

bull それぞれのライフサイクルの理解が必須

bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 34: X pages day発表_20141118 final

《compositeDataの使用》

bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能

rarr同じMap実装なのでスコープ変数と使い方は同じ

rarrカスタムコントロールのローカル変数なので外側からは参照できない

値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)

値の使用compositeDataget(ldquokeyrdquo)

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 35: X pages day発表_20141118 final

CSJSとSSJSとの使い分け

bull インプットチェックはどっちで実装するbull CSJS amp SSJS派

レスポンス重視

クライアントサイドでできるものはクライアントサイドで済ませる

bull SSJSオンリー派

メンテナンス性重視

エラーメッセージ制御が一元化実装結果はシンプル

研究会でも意見が分かれたところ

どちらが良いとは言えないけどどちらかに統一はしましょう

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 36: X pages day発表_20141118 final

JavaScriptのお作法に則る

bull グローバル変数は危険bull グローバル領域=widowオブジェクト

bull 他フレームワークとの競合

bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など

bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する

var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 37: X pages day発表_20141118 final

JavaScriptのお作法に則る

bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される

varを忘れるとfunction fnc1()

v = ldquoglobalrdquo 関数内として定義したつもりが

alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 38: X pages day発表_20141118 final

CSSファイルは定期的に整理

bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス

bull 実際使っているのはどれ

bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので

定期的に(忘れないうちに)整理する

bull CSSセレクタを活用してコード量を減らす

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 39: X pages day発表_20141118 final

《CSSセレクタの活用例》formDataTable

bordersolid 1px 000000

border-collapsecollapse

width640px

formDataTable TD

bordersolid 1px 000000padding2px

formDataTable TDfirst-child

background-colorEEEEEEwidth20

formDataTable TDnth-child(2)

background-colorFFFFFFwidth30

formDataTable TDlast-child

background-colorBBBBBBwidth50

TABLEタグのCSSクラス定義

TDタグ共通のスタイル定義

列毎にTDタグのスタイルを定義(1列目2列目3列目の順)

ltxptable styleClass=formDataTablegt

rarrTABLEタグへのクラス指定のみ

TDタグへのクラス指定が不要

CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 40: X pages day発表_20141118 final

その他

bull recycle忘れには注意

function doForAllDocuments(nViewNotesView)

var nDocNotesDocument

tempDocNotesDocument

try

nDoc = nViewgetFirstDocument()

while(null == nDoc)

doForEachDocument(nDoc)

tempDoc = nViewgetNextDocument(nDoc)

nDocrecycle()

nDoc = tempDoc

finally

ビューの各文書を参照する処理では必須

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 41: X pages day発表_20141118 final

その他

bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照

if(windowaddEventListner)

documentgetElementById(idbutton2)

addEventListner(clickmyObjfnc1false)

else if(windowattachEvent)

documentgetElementById(idbutton2)

attachEvent(onclickmyObjfnc1)

else

documentgetElementById(idbutton2)[onclick]

= myObjfnc1

これまでいちいちこんな面倒臭いことしてたのが

XSPattachClientFunction(idbutton1clickmyObjfnc1)

既に関数が用意されています

たとえば動的なイベント割り当ての場合

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します

Page 42: X pages day発表_20141118 final

今後の予定

2月のフェスタに向けて

bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています

bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します