ttp://public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/2010jan29_nd.pdf


結構勉強になります。

Domino の "2GB 神話" を取り扱ってます。

話を簡単にするために、説明を端折ると誤解を生む典型ですよね。


2GB = 各タスクのプライベートメモリ+Domino 共通で利用する UBM (BufferPool) (1GB) で、2GB.

Windows/32 の場合、4GB = Windows カーネル最大アロケータブル領域(2G) + ユーザーアロケータブル領域 (2GB)

ユーザーアドレススペース(アロケータブル領域)は、最大 2GB なので、こんな感じでしょうか。



アメリカの保守って、そんなに頭固いのか。
伝統を重んじるのが保守の一面だとすれば、オバマの姿勢を保守が問題視するっておかしいっしょ。

共和党が民主党を批判する材料にしたいとしか思えない。
ってーか、陛下を引き合いに出すなよ。カウボーイ共。

LS2J の特徴とか:

 ・Java Agent でゴリゴリ書かなくてすむ。

    API の一ライブラリを使いたい場合に便利。

 ・C API 経由で API 呼び出ししているそうで。

    (Declarelations) に uselsx "*javacon" で、外部 LSX を呼び出します。

    外部参照させるための AIX の設定に癖があるんだなぁ、これが。

 ・Public 属性しかアクセスできない。

    自身の private が触れない…。(そういう時は大概設計がまずいんですけどね)

    普通に考えれば、外部 API 呼び出しで private なんか触らないし。

 ・呼び出し方に癖がありまくり。

    JNI Signature とかなんなんですか。

    Java が native code 呼び出すために必要なのはわかるんですけど、LotusScript と相まって大変なことになってます。

    とっつきにくさは、初めて外部 C API を VB から触ったときの、byval &h0 とかに似てますかね。

    (最初はおまじないとしか覚えられなかった…)


使い方とか:

 ・JavaSession - NotesSession と考えて使えば問題なし。コンストラクタの引数として山のように引数出ますけど、コマンドライン経由でしか使わないらしいので、通常は new JavaSession() で。

 ・JavaClass - JDK のパッケージ、ライブラリを引数に指定して、ライブラリを Script で扱えるようにするクラス。JavaSession.GetClass(<ライブラリ名>) で指定。ライブラリの階層に、通常のドット表記とスラッシュ表記の2つが指定できる。クロスプラットフォーム (Mac を含む場合) での階層指定はスラッシュ表記じゃないと NG.

 ・JavaObject - なぜか lsx の type-ahead に出てこない憎いヤツ。JavaClass でパッケージ内のクラスメソッドが利用可能になるので、メソッドから返されるオブジェクトを格納する場合に利用する。オブジェクトなら何でも突っ込めるみたい。


サンプルとか。

正規表現を使って、ASCII 以外を弾いてる (= DBCS を含むかどうか) を検出します。

Private Function hasDBCS(item As Variant) As Boolean
Dim jSession As JAVASESSION
Dim jClass As JAVACLASS
Dim jPattern As JavaObject 'なぜか lsx リストに出てこない
Dim jMatcher As JavaObject

Dim concatFullName As String

Set jSession = New JAVASESSION()
Set jClass = jSession.GetClass("java/util/regex/Pattern")
Set jPattern = jClass.compile(REGEXP_ALLHALF_CHAR)

concatFullName = Implode(item, STRING_CONCAT_TOKEN)
Set jMatcher = jPattern.matcher(concatFullName)
hasDBCS = jMatcher.find()
End Function


ヘルプだと JavaClass に必ずコンストラクタがあること前提の書き方だったので、まったく理解できず。

util にコンストラクタって発想ないし。

JNI まで引っ張り出してきて、手がつけられなくなり始めたので、中島さんブログ参考にしました。


ヘルプにポリモーフィズムメソッドなんかがある場合、JavaMethod 使えって書いてあったけど、どうなんだろ。

市県民税で5万吹っ飛んだ…。

一体市と県は俺に何をしてくれているんだろう…。


備忘録アジェンダ:

 1.DAOS に関する FAQ

 2.WPS の認証画面なしでのログインを行う際の挙動について

 3.長島さんのところの Lazzy Tool とか。

 4.マイグレーション資料関係


1.DAOS に関する FAQ

 8.5 の目玉(だよな)。もともと DB 中に格納されていた添付ファイル (文書の中に格納してないからね。誤解なきよう) を、ファイルシステムに持たせようって仕組み。平たく言うと、BLOB データを FS に任せることで、バックアップ計画立てやすくしましょうと。

 責任を FS に押し付けると、DB メンテナンスもしやすくなります。ポインタにだけ気を配ればいいので。

 ボトルネックはトランザクションロギング (TRL) を有効にしないといけないところ。

 耐障害性は向上するものの、ディスク I/O がとんでもない。RDBMS と同じになったと言われればそれまでですけど。

 http://www.ibm.com/developerworks/jp/lotus/ldd_tech/20090703daos.html

 いい加減、技術者の人は、$FILE は FO のためのポインタフィールドだって気づいて欲しいです。

 個人的には TRL 構成を組むのは、H/W, S/W の構成点数増やすので好きではないです。

 この機能が代替不可能なら考えますけど、ボトルネック増やすようなことはしたくないので。


2.WPS の認証画面なしでのログインを行う際の挙動について

 (7/14 の記事参照)

 WPS チームから、Domino が Get で同一リクエスト送信してるんじゃないの?と疑われたので、HTTP response header 解析しました。

 結果を先に言うと、Domino は一度だけしかリダイレクト (302) してません。あとは WPS 側で、ログインしていた際の session cookie 消すために、Referer を誤魔化しつつ、Location で 302 リダイレクトして、ユーザーのログイン処理を肩代わりしています。

 いくらなんでも Domino はそんなにアホじゃないぞ。

 ヘッダ載せようと思ったけど、マスクしきれないので割愛。

 流れとしては、

  1.(Domino) 302 : Location=http://wpsserver01.co.jp/wps/portal/cxml/04_SD9ePMtCP1l800l_KydQvyHFUBADPmuQy?userid=test%20user01&password=ABC

  2.(UA) Get http://wpsserver01.co.jp/wps/portal/cxml/04_SD9ePMtCP1l800l_KydQvyHFUBADPmuQy?userid=test%20user01&password=ABC

  3.(WPS) Set-Cookie で以前まで持っていた LtpaToken を削除。さらに Location で再度同じ URL にリダイレクト。(Cookie 消して、一度未ログイン状態にし、userid, password を持つ URL でリダイレクトすることで、ログイン処理を自動化している)

 こんな流れです。WPS が Referer 消さずにリダイレクトするので、疑われたらしい。


3.長島さんのところの Laza(Lazzy) Tool とか。

 【Lotus Notes/Domino問題判別手法解説】

 http://www.ibm.com/developerworks/jp/lotus/ldd_tech/20090710_nd.html

昔は Laza とか使ってたけど、今は Open/Public でこんな記事出てます。

昔載せた解析記事が無意味になって俺涙目。

(実際はツールだけじゃ解析しきれないんですけどね)


4.マイグレーション資料関係

 仕事で使いそうな資料もろもろ。鉄板ばかりなので、書評載せません。あしからず。

 【Lotus Notes/Domino 4.6/5/6/6.5/7/8/8.5機能比較資料】

  http://www.ibm.com/developerworks/jp/lotus/ldd_tech/20080801_ndc.html

 【Lotus Notes/Domino 8.5 機能評価ガイド】

  http://www.ibm.com/developerworks/jp/lotus/ldd_tech/20090227nd.html

 【IBM Lotus Domino 8.5.1の主な新機能】

  http://www.ibm.com/developerworks/jp/lotus/ldd_tech/nd851.html

 【Lotus Notes/Domino 8.5へのアップグレード】

  http://www.ibm.com/developerworks/jp/lotus/ldd_tech/20090401nd.html

 【Lotus Notes/Domino 8.5 基本説明資料】

  http://www.ibm.com/developerworks/jp/lotus/ldd_tech/20090612_nd.html

 【Lotus Notes 7 メールの新機能】

  http://www.ibm.com/developerworks/jp/lotus/library/notes7-mail-features/

最近は中の人も資料を出してくれるようになって助かります。

後はお客さん視点でモノが書けるといいんですけどね。私もできないですけど。

備忘録:

 1.パケットキャプチャソフト

 2.Domino ディレクトリを LDAP として利用する場合の WPS 認証画面なしログインについて


1.パケットキャプチャソフト

 IE しかブラウザがないと思ってる Domino 技術者へ。

せめて Fiddler 使おうぜ。

君が何回も更新ボタン押したところで結果は変わらないから。


2.Domino ディレクトリを LDAP として利用する場合の WPS 認証画面なしログインについて

WebSphere Portal 上で、パスワード変更後に直接ログイン (認証画面なしでログイン) する場合。

http://www-06.ibm.com/jp/domino04/lotus/support/faqs/faqs.nsf/all/730995


以上の設定を行えばよい。

ただし。

Domino ディレクトリを LDAP として利用する場合、userid=<userID> 部には、ユーザー ID の基本名部分を引数として渡すこと。


i.g.) http://wpsserver01.co.jp/wps/portal/cxml/04_SD9ePMtCP1l800l_KydQvyHFUBADPmuQy?userid=test%20user01&password=ABC


組織単位などをつけると Error : 404 コンテンツは利用不能です。エラーが返る。

ってかやった。おのれ。

メモ。

 1.byte 型のデータがアイテムに反映されない。

 2.クラスは相変わらず "オブジェクト指向"

 3.プロフィールの新規作成とアクセス権


1.byte 型のデータがアイテムに反映されない。

プリミティブな Byte 型を持つ値を、NotesDocument.ReplaceItemValue() で書き込んでも、

実際のアイテムに反映されない。


Sub Click(Source As Button)
Dim uiws As New NotesUIWorkspace()
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument

Dim b As Byte

Set uidoc = uiws.CurrentDocument
Set doc = uidoc.Document

b = &hff

Call doc.ReplaceItemValue("field1", b)
End Sub


Integer に変更すると書き込める不思議。



2.クラスは相変わらず "オブジェクト指向"

(オブジェクト指向の特徴・特性のうち、いくつかを含有するものをオブジェクト指向性と呼ぶそうな。完全に準拠できているのであれば、オブジェクト指向型になるという…)


このコード。相変わらずコンパイルエラーになります。

Class Parent
Sub new()
End Sub

Sub method1()
End Sub
End Class

Class Child As Parent
Sub new(a As Integer)
End Sub
Sub method1(a As Integer)
End Sub
End Class


コンストラクタについては、オーバーライドできない。

親→子の順番でコンストラクタが呼ばれてます。


3.プロフィールの新規作成とアクセス権

Web アプリで、パブリックアクセスによって要件を実現する際に気をつけること。

プロフィール文書を読み込む際に、

プロフィールが存在しない場合は強制的に作成することになるため、

作成者の権限が必要になる。


@GetProfileField なんかを使うと、張りきって domcfg がしゃしゃり出てくるので注意。

回避策として、WebQueryOpen 時に、代理権限を付与したエージェントが、

プロフィール文書のアイテムをロードすることで解決。

(作成者フィールドなんかで回避できたのかも知れないなぁ)

メモ代わりです。

プロモーション:

  現在作業中の DB の設計を反映するための情報とその一連の処理。

  プロモート先、プロモート後の CIAO! 内でのバージョン識別方法などを設定。

  ローカルで自身の設計のみを変更後、プロモーション機能を利用して、

  1バージョンとして修正モジュール群を登録したり、

  サーバー上で管理した単体テスト完了後 DB を本番環境下のテストサーバーに配置することができる。

  プロモーションの定義は複数行えるので、状況に合わせて細かくプロモートできる。


バージョン作成の注意点:

  Source および Destination に 個人ビュー、個人エージェントなどが存在すると、 "操作を実行する権限がありません" エラーが発生する。

超お久しぶりです。

なんで平日のこんな時間に書いてるんだろう…。


思い立ったときに書かないと、書く機会を逃すからですね。


ってことで、 LEI を使ってて気づいたことなど。

 ・@ThisValue, @ThisName は正確に動かない。(Notes connection 文書の [Enforce design and field flags] にチェックをつけていると)

 ・Notes Connection の Enforce design and field flags は、表示用の計算結果も計算している。

 ・Collapse/Expand Connection は Notes 側には不要。

 ・Order meta connection も Notes 側には不要。

 ・Polling Activity の Dependent Activities の仕様が変更されている。

 ・Polling Activity から Polling Acitivty を起動すると、成功回数のカウントが正常に行われない。

 ・Meter meta connection 文書の読み方は慣れるまで癖がある。

 ・DB2/400 (DB2 for iSeries) の CCSID には要注意。

 ・DB2/400 のファイル (テーブル) に ALLOW NULL が指定されている場合、 WRKDBM で表示されるデータは NOT NULL 制約をつけたテーブルにコピーするまで、データは表示されない (データは存在するので WRKDBM コマンドを発行した段階でエラーになることはない)

 ・Order meta connection 文書に対して、メタデータの指定は不要。 (ダミー値を入れておいて、 Activity 側で指定すれば柔軟に運用できる)

 ・Dependent Activity は、必ずその Activity を呼び出す Activity が終了するまで実行されない。

 ・Polling Activity の Reset trigger statement には "Execute XXX" で、 Source Connection に指定した Notes database のエージェントを呼び出すことができる

 ・Polling Activity の Execute statement にある "execute after activities" は [Execute Synchronously] にチェックをつけないと意図した動作にならない。

 ・Polling Activity の "execute before activities" は [Execute Synchronously] にチェックをつけても、意図した動作にならない。 (Reset trigger statement と Execute Activities が同時にキックされる)

 ・6.x では未確認だけど、 LotusScript で open ステートメントをバイナリモードで開いて、データを読み込み、そのデータを BLOB データとして書き出そうとすると、バグにより、バイナリデータが write した瞬間に2倍に膨れ上がる。


と、このくらいでしょうか。

ヘルプとにらめっこしてると、英語の微妙な言い回しにやられることが多いです…。

久しぶりに恩師に電話したら "blog 更新されてねぇよ、ボケ" と言われたので、

岩間先生からしずかーーーに "blog の更新楽しみにしています" とプレッシャーを掛けられたので、 (ウソです。ごめんなさい)

思い立ったように記事を書いていたのですが…。


間違って記事を消してしまいました… (泣


えっと、アレです。言いわけです。

相当負け犬の遠吠えです。


さわりだけ書いておきます。


@Transform - LotusScript の Forall 関数をエミュレートする@関数。

なぜこの関数を使うの? -

    ・背景としては@関数でリスト添字演算 (配列演算) が可能になったから。

    ・Web アプリケーションを作成する際に、 LotusScript で値を入れると、フォームロード時のフィールドロード (Default Value や 計算結果フィールドのロード時の式演算) より後にしかデータを入れられないため、 LotusScript の値を利用できないため。

    ・LotusScript で、文書内のデータによって、 HTML を出力する場合、出力されたデータを POST で受け取ってもデータをきちんと受け取れないため

    ・JavaScript で DHTML を出力するとなると、ブラウザ毎の動作確認が必要になるため


どういうときに便利なの? -

 たとえば、Web のアンケートフォーム。

マスタとして UI の形式 (ラジオボタン、チェックボックス etc.)、質問内容、選択肢を登録しておいて、 Web 上でフレキシブルに表示したい時などに便利。

 この関数を使わずに、@関数で HTML を生成することは難しい。 (ラジオボタンフィールド、チェックボックスフィールドなどを用意しても可能だが、質問が50個あったら?表示非表示の制御はどれだけ修正する必要があるんだろう?)


と、このくらいです。