文書クラス

2009年04月30日 00:17

前回のNSDのトピックでは以下のようなVThreadセクションを確認する事を書きました。
VThread セクション
** VThread [ ntvdm: 0a74: 0002]
.Mapped To: PThread [ ntvdm: 0a74: 0cd8]
.. SOBJ: addr=0x07dc3cf8, h=0xf0107056 t=0xca35 (BLK_TRACECONNECTION)
(略)
.. SessionID: fIOCP=N, [ 1: 1926] addr: ???: ???
(略)
.. Database: CN=Dxxxxxxx/OU=xx/OU=xx/O=xx!!mail\Dxx\Mxxxxx.nsf
.... DBH: 53, By: CN=Hirotaka Nagashima/OU=xx/O=xx, WasAccessed=No
...... doc: HDB= 53, NoteID= 0, hNote=0x29ad, flags=0000, class=0001
.... DBH: 56, By: CN=Hirotaka Nagashima/OU=xx/O=xx, WasAccessed=No
...... doc: HDB= 56, NoteID=2298, hNote=0x2a8d, flags=2200, class=0001
...... doc: HDB= 56, NoteID=18618, hNote=0x2ab5, flags=0200, class=0001
...... doc: HDB= 56, NoteID=589682, hNote=0x2b6f, flags=0200, class=0001
(略)

今日はここで、些細な情報ですが、この部分に着目します。
...... doc: HDB= 56, NoteID=18618, hNote=0x2ab5, flags=0200, class=0001
この部分、実は以前にここで取り上げた文書クラスのトピックと関係があります。ここでもNSDと関連があることについて少し言及していますね。この部分は正に文書クラスを現しているので、以下のように数字から文書がどのような種類なのかを特定する事が出来ます。


0x0001 文書
0x0004 フォーム
0x0008 ビュー、フォルダ
0x0040 ACL
0x0200 エージェント
0x0800 複製式


Notes で文書を開いている、と言ってもフォームかビューか文書そのものか一概には言えないのでこのような情報が役に立つのです。見逃してしまいそうなくらいの情報ですがここで開いている文書の詳細情報を確認する事が出来る貴重な情報です。

ディスカッションDBと読者フィールド

2009年04月28日 00:04

読者名フィールドにサーバー名を設定していないために複製間で文書の不一致がおきたことがある方は多いのではないのでしょうか。
以下の文書にもある通り、複製が想定されているデータベースでは読者名フィールドにサーバー名を入れておく必要があります。

複製しているデータベースの読者名フィールドについて

ここまでは複製の一般論なのでよいのですが、気になるのは実はディスカッションテンプレートにある「非公開」アクションは、読者名フィールドを使用した文書のアクセス制御を設定するものの、この点について考慮されていない点でした。
 非公開にしておくような文書は多くの場合時期が来るまで見られては困る文書だったり、ドラフトだったりするので見られないことで大きな問題が起きる事は無いと思うのですが、場合によってはサーバー切り替え時にドラフト文書が消えてしまったり、管理者から見ても文書数が一致しなくて気持ち悪いと思ったりして厄介に思っている方も多いのかもしれません。

このような場合、非公開アクションをちょっと工夫して、LocalDomainServers を加えてあげるだけでドメイン内の複製でも文書が複製されるようになります。
ディスカッションテンプレートをベースに開発されている方では、自前で直している方も多いかも多いかも知れないのですが、具体的な変更方法については以下のように公開させて頂きました。

「非公開」アクションで保存した文書が複製されない (文書番号 #732703)

アクションをちょっと拡張するだけなので、興味がある方は是非取り込んでみてください。

Domino のサービスによる起動/停止

2009年04月27日 00:09

Domino をWindows サーバーで動かしている際にOS起動後に特定ユーザーでログオンなどをしないような運用を考えると、どうしてもサービスでの起動・停止が必要になるのではないかと思います。

この際にどのような計画停止がよいか・・・・と言う話があると思うのですが、よく「終了時に強制終了してしまう」と言うお話があります。

別にDomino側で強制終了をしているわけではないのですが、サービスによる停止ではある程度時間がかかると強制終了してしまいます。

このタイムアウト時間はHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control にある WaitToKillServiceTimeout と言う値で制御されています。

私のテスト環境を見る限り、以下の値が入っています。(単位はmsです)

Windows 2003 : 190000
Windows 2000 : 20000
Windows XP : 20000

つまり、Windows 2000 Serverでのサービス停止は20秒以内にドミノが停止しなければ強制終了してしまうのです。これはちょっと厳しいですよね。Windows 2003では190秒に拡張されているようですが、少し終了に時間がかかるタスクが複数あったりするとこれも厳しいのではないかと思います。

一つはこの設定を変えてタイムアウト時間を延ばす、と言う考え方もあるのですがその場合には全てにサービス停止のタイムアウトが伸びてしまう事になるので場合によっては望ましくない結果になるかもしれないので、計画停止の場合は出来るだけサービス停止による終了の前に関連タスクを停止しておくとよいのではないかと思います。

たとえば以下のようなプログラム文書を作っておくのもいいのではないかと思います。

・ プログラム名 「nserver」
・ コマンドライン 「-c "< quitcommand.txt"」

# quitcommand.txt はプログラムディレクトリに置いて下さい。

quitcommand.txtの内容
tell event q
tell smtp q
tell router q
tell http q
tell sched q
等。。


実際このような運用をされている、と言うお話があったら管理者用コメントでもよいので色々フィードバックをもらえると私も勉強になるのでうれしいです。

開いているデータベースを特定する

2009年04月24日 00:03

NSDでFatal Stackを探したあとはこのスレッドがどんなデータベースを開いているかが気になるかもしれません。

もちろん「Fatal Stackが開いている文書 = 問題の原因」とは限らないので、スタック情報と鑑みてこの手の話は判断しないといけないのですが、問題切り分けの参考になる事は多いのではないかと思います。

まず前回使った以下のFatal Threadを考えましょう。

Fatal Thread の出力
############################################################
### thread 1/25: [ ntvdm: 0a74: 0cd8] FATAL THREAD
### FP=0013b260, PC=7c94eb94, SP=0013b1fc
### stkbase=00140000, total stksize=212992, used stksize=19972
############################################################
[ 1] 0x7c94eb94 ntdll.KiFastSystemCallRet+0 (b10,493e0,0,13b7e4)
[ 2] 0x7c802532 kernel32.WaitForSingleObject+18 (b10,493e0,3,13ba00)
@[ 3] 0x60193f25 nnotes.OSRunExternalScript@8+1269 (12c,1,1,0)
@[ 4] 0x601943ba nnotes.FRTerminateWindowsResources+986 (1,0,1010,1)
@[ 5] 0x6019477f nnotes.OSFaultCleanupExt@24+895 (1284bd0,1010,0,0)
@[ 6] 0x6019480a nnotes.OSFaultCleanup@12+26 (0,1010,0,10ec8d0f)
@[ 7] 0x601a0624 nnotes.OSNTUnhandledExceptionFilter@4+276 (13cd60,2b3,54200a0a,61657268)
@[ 8] 0x60178551 nnotes.Panic@4+481 (60b82d3b,10ec8d10,13cd8c,60008c62)
(略)
NSDでは、「開いているデータベース」、「開いているビュー」、「開いている文書」などは別のセクションに表示されますが、ここではもっと簡単な情報として仮想スレッド毎にこれらの情報をまとめて出力している「VThreadセクション」から情報を拾う事を紹介します。

上で太字で示したプロセスID+Native ThreadID(またはPhysical Thread IDと呼ばれます)の情報をキーに探すと、以下のようなセクションが見つかります。
VThread セクション
** VThread [ ntvdm: 0a74: 0002]
.Mapped To: PThread [ ntvdm: 0a74: 0cd8]
.. SOBJ: addr=0x07dc3cf8, h=0xf0107056 t=0xca35 (BLK_TRACECONNECTION)
(略)
.. SessionID: fIOCP=N, [ 1: 1926] addr: ???: ???
(略)
.. Database: CN=Dxxxxxxx/OU=xx/OU=xx/O=xx!!mail\Dxx\Mxxxxx.nsf
.... DBH: 53, By: CN=Hirotaka Nagashima/OU=xx/O=xx, WasAccessed=No
...... doc: HDB= 53, NoteID= 0, hNote=0x29ad, flags=0000, class=0001
.... DBH: 56, By: CN=Hirotaka Nagashima/OU=xx/O=xx, WasAccessed=No
...... doc: HDB= 56, NoteID=2298, hNote=0x2a8d, flags=2200, class=0001
...... doc: HDB= 56, NoteID=18618, hNote=0x2ab5, flags=0200, class=0001
...... doc: HDB= 56, NoteID=589682, hNote=0x2b6f, flags=0200, class=0001
(略)
.... DBH: 242, By: CN=Hirotaka Nagashima/OU=xx/O=xx, WasAccessed=No
...... doc: HDB= 242, NoteID=222382, hNote=0x348a, flags=2000, class=0004
...... doc: HDB= 242, NoteID=220746, hNote=0x2bd0, flags=2000, class=0200
...... doc: HDB= 242, NoteID=220750, hNote=0x2bf0, flags=0000, class=0004 [Form Name="DelOptionInterim"]
...... doc: HDB= 242, NoteID=220758, hNote=0x2c0f, flags=0000, class=0004 [Form Name="(FollowUpMemoSubform)"]
(略)
.. file: fd: 680, C:\lotus\notes\data\~notes.lck
.. file: fd: 1180, C:\lotus\notes\data\user.dic
.. file: fd: 1540, C:\lotus\notes\panose.dat
(略)

太字にした部分がマッチするのが分かるでしょうか?
Vthread毎にここは表示されますが、ここを使用しているPhysical Threadの情報も表示されるのでここで使用する事が出来るのです。

ここの一覧に表示されたDatabase:やdoc:などの情報から開いているデータベースや文書・ビューの情報が分かるようになります。

前回のVThreadの話がちょっと面白くないと思った人もいるのかもしれないのですが、このセクションがNativeスレッドではなく仮想スレッド単位でレポートされているので、仮想スレッドの話も簡単にしておいた方がよいかな、と思って1クッション入れていました。

前回のVThreadの話がちょっと面白くないと思った人もいるのかもしれないのですが、このセクションがNativeスレッドではなく仮想スレッド単位でレポートされているので、仮想スレッドの話も簡単にしておいた方がよいかな、と思って1クッション入れていました。

分かりにくい点もあると思いますが、とりあえずは開いているビューやら文書やらの情報が探せるようになれば便利なのではないかな、と思います。

ワークスペースからサーバー名とデータベースの一覧を取り出す

2009年04月23日 00:03

 ワークスペースのファイル(desktop6.ndk/desktop8.ndk)から今自分のワークスペースアイコンのサーバー名とデータベース名の一覧を取り出すことが出来ないか?と悩んでいた事があったのですが、以下のような方法を使ってみました。

ワークスペースアイコンのオブジェクト情報のうち、サーバー名やDB名が通常のASCII文字として格納されている事を利用した簡易な方法ですので、漏れがない保証もないですし、やり方の都合上ローカルのデータベース情報などは抜け落ちてしまいます。

単純にバイナリファイルからテキスト情報を取り出したいだけなので、Sysinternals からStrings.exe を利用してみました。

Strings.exe

Notesのプログラムディレクトリに、strings.exe をダウンロードし、データディレクトリ(以下の例ではプログラムディレクトリの直下にあることを想定しています)にあるdesktop6.ndk に対してStrings.exe を以下のように実行します。

strings -a .\data\desktop6.ndk | findstr /B "CN=.*/.*\.nsf" > DBlist.txt 2> error.log


error.logにいくつかエラー情報が出力されますが、これでDBlist.txt に一覧が出力されます。

別に何かの役に立つ事は無いと思うのですが少し裏技っぽいかな、と思ったのでポストしてみます。

# この方法自体はサポートされているわけではないのでその点はご理解の上であくまで参考情報としてご利用頂ければと思います。

リンクの挿入

2009年04月22日 00:04

Notes Design Blog でリンクの挿入についてこんな話が出ていました。

Notes8.5.1 will have an "Insert Link" icon on the toolbar
Update on "Insert Links"

始めの話は8.5.1で「リンクの挿入」のスマートアイコンが追加される、と言う話です。
てっきり今までも自分が表示していないだけであったのではないかと思っていました。。

次の話は面白いですね、Notes URLとかも考慮したダイアログベースのリンク挿入UIを考えているそうです。
こんな感じのダイアログを表示してリンクを作成するようです。

Insert Links

ちょうどブログでリンク挿入を行うとこういう感じのUIになるのですが、ホットスポットリンクと言われても分かりにくい人もいると思うのでこっちのほうがずっと使いやすいんじゃないかと思います。

是非採用してほしいです。


Surely Template - Template のReplica IDを管理する

2009年04月21日 00:03

今日はこんなテンプレートを紹介します。

OpenNTF.org - Surely Template

NSFファイルを入手するには「Release」タブに移動して最新版を入手してください。
ダウンロード時にID登録するように求められるかもしれません。
メールアドレスと名前以外はそれほど詳細な情報は聞かれなかったと思います。。


システムテンプレートのレプリカIDはその性質上どの環境でも同じになりますが、これによって
・ 予期できないテンプレートが複製されるかもしれない
・ 外部からの侵入者に少しでも予測可能な情報を与えたくない

などの事が懸念される場合はレプリカIDを変えましょう、と言う話です。

あくまでこのブログではちょっと珍しいツールがある、と言う観点で紹介していますが、実環境でシステムテンプレートのレプリカIDを変える、と言う事に対しては私は非常に否定的です。(そもそもテンプレートやデータベースのレプリカIDを変える事自体サポートしていません。)
 このような方法で変えても、バージョンアップなどがあれば戻ってしまいますし、複数サーバー・複数バージョンなどでは対応の複雑さが増してしまうのではないかと思います。

能書きはともかく動かしてみましょう。
このツールは基本的にはサーバー上にNSFファイルを配置して使用するものですが動きを知りたいだけであればLocalのデータディレクトリに置くだけで十分なのではないかと思います。

開いてから、「Discover Templates」アクションを実行すると以下のようにLocalのテンプレート一覧を取得してくれます。(画面ショットはクリックすると拡大します)

Surely Template 起動画面

各エントリは以下のように管理されています。
(画面ショットはクリックすると拡大します)
Template Profile


「What Replica ID to use?」はレプリカIDの割り当て方法を指定できて、編集モードにすると以下のオプションから選べます。

・ Default Replica ID
・ Suggested Domain Replica ID
・ Random Replica ID
・ DO NOT CHANGE

ついでにテンプレートACLも変更する事が出来て以下のような設定を行うことが出来ます。
実はこっちの機能の方が重宝するかもしれません。

・ Default No Access
・ Add Anonymous(No Access)
・ Add LocalDomainServers as Manager

ここで「Change Status」アクションを使ってEnabledにされたものに対して「Process Profiles」アクションを使って実行するとテンプレートを色々と変える事が出来ます。
ビューをReplica IDでもソート可能にしておけば、重複したものを見つけることも出来ますし、ローカルでシステムテンプレートをベースに開発などを行うときは便利だな、と思いました。

ちなみにこのツールは、以下のRedbookの159ページにも紹介されています。
Security Considerations in Notes and Domino 7: Making Great Security Easier to Implement

蛇足ですが、レプリカIDの変更をするScriptのメソッドはないのでテンプレートがどのように実行しているのか気になっている方もいるかもしれませんが、普通にAPIを読んで実行しているだけです。

興味があったら是非利用してみてください。

NSD - Virtual Thread ID とPhysical Thread ID (TLS Mapping)

2009年04月20日 00:04

NSD で使用されるスレッド番号を見ていると、OS上で取得できるスレッドIDと一致しない事があって不思議におもうことがあるかもしれません。

これは色々な場面で誤解する元なのですが、NSDではほとんどの情報はOS上のスレッドIDでなく、仮想スレッドID(Virtual Thread ID または VirtualTID)で表記されている事を意識する必要があります。

なので、NSDではまず物理スレッドIDと仮想スレッドIDの関連付けを確認する必要があります。
その情報が確認できるのがTLS Mapping セクションです。以下のように表示されます。

------ TLS Mapping -----

NativeTID VirtualTID PrimalTID
[ nserver:02e8: 1184] [ nserver:02e8: 2] [ nserver:02e8: 2]
[ nserver:02e8: 2436] [ nserver:02e8: 4] [ nserver:02e8: 4]
[ nserver:02e8: 2280] [ nserver:02e8: 5] [ nserver:02e8: 5]
[ nserver:02e8: 2428] [ nserver:02e8: 6] [ nserver:02e8: 6]
[ nserver:02e8: 2176] [ nserver:02e8: 7] [ nserver:02e8: 7]
[ nserver:02e8: 2336] [ nserver:02e8: 8] [ nserver:02e8: 8]
[ nserver:02e8: 2332] [ nserver:02e8: 9] [ nserver:02e8: 9]
[ nserver:02e8: 2328] [ nserver:02e8: 10] [ nserver:02e8: 10]
[ nserver:02e8: 2324] [ nserver:02e8: 11] [ nserver:02e8: 11]
[ nserver:02e8: 2320] [ nserver:02e8: 12] [ nserver:02e8: 12]
[ nserver:02e8: 2316] [ nserver:02e8: 13] [ nserver:02e8: 13]
[ nserver:02e8: 2312] [ nserver:02e8: 14] [ nserver:02e8: 14]
(略)


実はR5当時のNSDではこのTLS Mappingに相当する情報がなかったため、この突合せは非常に難しい作業でした。

見方はほぼ自明だと思うのですが、ここからNative TIDとVirutal TID の関連付けを行います。
右端のPrimal Threadというのが気になる方が多いかと思いますが、これは通常仮想スレッドIDと同じ値になるのとNSDでは他のセクションで使用しないデータなのであまり気にする必要はありません。

これは、キーになっているNative TIDが一番最初に振られたVirtual ThreadIDの事なのですが通常ここは一致します。(理由は込み入っているので割愛させてください。。)

このセクションだけを見ると、大した意味がない情報に思えるかもしれないですが、NSDは仮想スレッドIDで様々な関連付けが行われている点とTLS MappingにNative<->Virtualの変換情報があることを知るだけでNSDを自分で見ることが出来る範囲が広がると思います。

この辺の話も少しずつ話していこうかと思います。

グループの自動取り込み

2009年04月17日 00:02

グループを定義するときに、「グループA は、グループBとグループCのメンバーからグループDを除いたものにしたい」と思うときはないでしょうか?

 単純にグループの組み合わせでグループを構築したいときはグループを入れ子にすればよいのですが、上述の例のように特定のグループを除きたい、と言う時にはいい方法がありませんでした。

このようなグループ管理の方法として、Domino 8.5からはグループの自動取り込みと言う機能が利用できるようになりました。グループ文書のフォームが拡張されただけなのでそれほど難しい設定はいりません。

まず、グループの自動取り込み機能は以下のようにディレクトリプロフィールで指定します。
ドミノディレクトリのアクションから、[アクション]-[ディレクトリプロフィールの編集]を選んで以下の「自動取り込みされるグループの収集間隔」を編集してください。(クリックすると画像が拡大します)

ディレクトリプロフィールの設定
テスト環境では非常に短い間隔でいいと思いますが、実運用では1,2時間に一度も動けば十分かもしれません。


ここを設定したあと新規グループを作ります。
赤枠で囲まれた部分が自動取り込みのための新しいフィールドです。
ここに追加メンバー用のグループなどをそれぞれ指定します。グループ名が一般的だと思いますが除外メンバーなどに個人ユーザーを指定する事も出来ます。

自動取り込みの設定

グループ文書を保存して、グループの自動取り込みが動くと、メンバーフィールドに生成されたメンバー名が表示されるようになります。

8.5新機能としてあまり紹介される事がないものですが、こういうちょっとしたところで使い勝手がよくなるのはいいことだな、と思います。
[グループの自動取り込み]の続きを読む

4月分の注目サポート技術情報が公開されています

2009年04月16日 00:02

ずいぶん連絡が遅れてしまいましたが、4月分の注目サポート技術情報が公開されていますね。

公開はおそらく4月8日くらいだったと思うので、出来るだけこの手の話は早く・・・と思っていたのですがすっかり後手に回ってしまいました。。

Lotus Notes/Domino 注目サポート技術情報 (2009年4月)

IF に関連したTechnoteなども公開されていますが、今回特に目に付く情報では8.0.x系の64bit版ドミノで発生する以下の問題などはマークしておいた方がいいのではないかと思います。

64 bit 版 Lotus Domino サーバー環境で外部から受信したメールの件名に意図しない空白が入力されてしまう(#: 732670)

あとは、DisableUniscribe=1 によってビューの応答が改善する事例として紹介されている以下の文書などでしょうか。

ビューの切り替えに時間がかかる場合がある (# 732472)

環境によって色々必要な情報はあると思うので是非一度ご覧になってみてください。


チームEUCテンプレート

2009年04月15日 00:07

 面白いテンプレートが公開されていました。
鴨志田さんのブログからテンプレートはダウンロードできるので興味ある方は是非使ってみてください。(Lotus Notes/Domino 6以上です) プレゼンテーションもあります。

[Notesとコスト削減]売上増大への直接的な貢献?

何か、件名と文章だけのような情報を放り込むだけであれば、個人ジャーナル(最近のバージョンではずいぶん見栄えもよくなりましたね。)とかディスカッションテンプレートを使えばいいのですが、このテンプレートは商品情報や顧客情報のようなスプレッドシートのような見せ方をしたい情報をサーバー上で共有するのに適したテンプレートにしているようです。ビュー上からの直接編集も上手に使っていていいのではないかと思います。

残念ながらフィールドにちゃんとした名前をつけるだけでなくて、フィールドやビューもいらないものは消したいし、フィールドの属性も適したものに変えたほうがいいとは思うので、なかなか1分で使うのは難しいと思うのですが、例にあるように簡単な出欠管理とか製品情報の管理に使ってみるといいのではないかな、と思いました。
何かのときのために自分のローカルに置いておいてもいいんじゃないかと思います。

OpenNTF Project : Google Calendar との連携をする

2009年04月14日 00:05

 大川さんが最近NotesとGoogle Calendarとの連携を模索していたのは知っていたのですが、あっさりOpenNTF にプロジェクトを立ち上げていてびっくりしました。

オープンソースプロジェクト”GooCalSync”起動中。
OpenNTF.org - GooCalSync


こういうのをやりたかった人はたくさんいると思うのですが、以下のような点を考慮して挫折した人は多いのではないでしょうか。

・ OpenNTFの運営が分からない
・ 時間が無い/よいプロトタイプが無い
・ 英語でProjectを回す自信が無い

大川さんがあっさり日本語でOpenNTFにプロジェクトを立ち上げていたのですが、その行動力には感服しました。

Open Source などでGlobalに活躍しているエンジニアの方ではこのようなOpen Sourceの利用の仕方には異論があると思うのですが、OpenNTFを完全にProjectのプレースホルダーと割り切ってしまったところに潔さを感じてしまいました。

個人的にはGoogle Calendarは使っていないのでこのツール自体の必要性は感じていないのですが、試みとしては本当に興味があるのでぜひとも支えて生きたいな、と思います。

Current Procs - プロセス一覧を確認する

2009年04月13日 00:05

NSD の始めはCurrent Procsや OS Process Table のような名前でシステム上のプロセス一覧がツリー表示されるのが普通です。

以下がWindows NSDの抜粋です。
 プロセスの一覧(Windows)
04d8 01c8 0 11/27 12:36:00 [C:\WINNT\System32\llssrv.exe: 04d8]
* 0508 01c8 0 11/27 12:36:00 [d:\notes\nservice.exe =d:\notes\notes.ini: 0508]
-> 09d8 0508 0 11/27 12:36:25 [d:\notes\nSERVER.EXE =d:\notes\notes.ini: 09d8]
-> 0a08 09d8 0 11/27 12:36:25 [d:\notes\nlogasio.EXE NOTESLOGGER reserved : 0a08]
-> 0ba0 09d8 0 11/27 12:37:43 [d:\notes\nevent.EXE: 0ba0]
-> 0d5c 09d8 0 11/27 12:37:55 [d:\notes\nReplica.EXE : 0d5c]
-> 0d80 09d8 0 11/27 12:37:55 [d:\notes\nRouter.EXE : 0d80]
-> 0d88 09d8 0 11/27 12:37:55 [d:\notes\nUpdate.EXE : 0d88]
-> 0db8 09d8 0 11/27 12:37:55 [d:\notes\nAMgr.EXE : 0db8]
-> 1084 0db8 0 11/27 12:37:56 [d:\notes\namgr.EXE -e 1: 1084]
-> 0e1c 09d8 0 11/27 12:37:55 [d:\notes\nAdminP.EXE : 0e1c]
-> 0e54 09d8 0 11/27 12:37:55 [d:\notes\nCalconn.EXE : 0e54]
-> 0e94 09d8 0 11/27 12:37:55 [d:\notes\nSched.EXE : 0e94]
-> 0eb0 09d8 0 11/27 12:37:55 [d:\notes\nIWSTATG.EXE : 0eb0]
-> 0ee8 09d8 0 11/27 12:37:55 [d:\notes\nIWAGENT.EXE : 0ee8]
-> 10bc 0ee8 0 11/27 12:37:57 [iwcrdet.exe 3816: 10bc]
1138 10bc 0 11/27 12:37:57 [iwcrdmon.exe: 1138]
-> 0f08 09d8 0 11/27 12:37:55 [d:\notes\nIWINFO.EXE : 0f08]
-> 0f24 09d8 0 11/27 12:37:55 [d:\notes\nHTTP.EXE : 0f24]
-> 13d4 09d8 0 11/27 12:38:05 [d:\notes\nCldbdir.EXE: 13d4]
-> 13d8 09d8 0 11/27 12:39:05 [d:\notes\nClrepl.EXE: 13d8]
-> 0a68 09d8 0 11/27 12:40:05 [d:\notes\nClrepl.EXE: 0a68]
-> 0a14 09d8 0 11/27 12:40:15 [d:\notes\nClrepl.EXE: 0a14]
-> 0a84 09d8 0 11/27 12:40:15 [d:\notes\nClrepl.EXE: 0a84]
-> 0a8c 09d8 0 11/27 12:40:15 [d:\notes\nClrepl.EXE: 0a8c]
0c88 09d8 0 11/27 12:46:15 ["d:\notes\nsd.exe" -dumpandkill -termstatus 1: 0c88]

ここからPIDやプロセスの親子関係などが分かります。
Windowsの場合、Notesプロセスは、「->」と言うのが付いているのが分かります。
Notesのプログラムディレクトリから実行されているけれど、現在のディレクトリがデータディレクトリでない場合には、「*」で表示されます。

UNIX版のNSDでは ps コマンドのフォーマットなのでもう少しなじみがある形式かもしれません。
 プロセスの一覧(AIX)
Current Procs:
==============
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
200003 A root 1 0 0 60 20 1800c 744 Apr 23 - 4:12 /etc/init
240001 A root 3170 6994 0 60 20 1622b 164 Apr 23 - 0:00 /usr/sbin/biod 6
240401 A root 3446 1 0 60 20 22171 40 Apr 23 - 0:00 /usr/lib/methods/ssa_daemon -l ssa2
40103 A root 4034 1 0 60 -- 3843c 1968 15d49f4 Apr 23 - 0:00 /usr/lpp/ssp/css/fault_service_Worm_RTG_SP -r 13 -b 1 -s 4 -p 0 -a TB3 -t 36
(略)
340001 A notes1 25482 35730 13 64 22 2ca76 12640 * 07:50:06 - 42:17 /opt/lotus/notes/latest/ibmpow/server
340001 A notes2 32644 14746 1 64 22 207b0 3144 33fa08e8 07:52:21 - 2:27 /opt/lotus/notes/latest/ibmpow/pop3
340001 A notes2 33180 14746 0 64 22 35bb8 2380 * 07:52:21 - 4:48 /opt/lotus/notes/latest/ibmpow/replica
340001 A notes1 33660 25482 1 64 22 3639a 2192 33f3ce0c 07:51:30 - 7:59 /opt/lotus/notes/latest/ibmpow/event
(略)


このあとはNotes/Domino 関連のプロセスだけが表示されます。
 Notes プロセスの一覧(AIX)
------------------- PROCESS TREE ---------------------
Status is:
R -- process is running
D -- process is dead
T/status -- process terminated with exit status
S/signal -- process killed with signal
? -- Unknown status

username status pid program
root R 1 0 init

notes2 ? . 35730 1 ksh /domino/notesadmin/scripts/startup.instance
notes2 R .. 25482 35730 /opt/lotus/notes/latest/ibmpow/server
notes2 R ... 35880 25482 /opt/lotus/notes/latest/ibmpow/clrepl
notes2 R ... 28702 25482 /opt/lotus/notes/latest/ibmpow/cldbdir
notes2 R ... 18246 25482 /opt/lotus/notes/latest/ibmpow/replica
notes2 R ... 41976 25482 /opt/lotus/notes/latest/ibmpow/diiop
notes2 R ... 35524 25482 /opt/lotus/notes/latest/ibmpow/pop3
notes2 R ... 36336 25482 /opt/lotus/notes/latest/ibmpow/http
notes2 R ... 45076 25482 /opt/lotus/notes/latest/ibmpow/calconn
notes2 R ... 37880 25482 /opt/lotus/notes/latest/ibmpow/sched
notes2 R ... 26936 25482 /opt/lotus/notes/latest/ibmpow/adminp
notes2 R ... 42924 25482 /opt/lotus/notes/latest/ibmpow/amgr
notes2 R .... 44478 42924 /opt/lotus/notes/latest/ibmpow/amgr -e 1
notes2 R ... 46340 25482 /opt/lotus/notes/latest/ibmpow/update
notes2 R ... 45810 25482 /opt/lotus/notes/latest/ibmpow/router
notes2 R ... 33660 25482 /opt/lotus/notes/latest/ibmpow/event

Windowsでの出力は以下の通りです。
 Notes プロセスの一覧(Windows)
Ini File : d:\notes\notes.ini
Data Dir : d:\notedata
Prog Dir : d:\notes
Notes Build: Release 6.5.4FP3
Proc List:
d:\notes\nSERVER.EXE (9d8)
d:\notes\nlogasio.EXE (a08)
d:\notes\nevent.EXE (ba0)
d:\notes\nReplica.EXE (d5c)
d:\notes\nRouter.EXE (d80)
d:\notes\nUpdate.EXE (d88)
d:\notes\nAMgr.EXE (db8)
d:\notes\nAdminP.EXE (e1c)
d:\notes\nCalconn.EXE (e54)
d:\notes\nSched.EXE (e94)
d:\notes\nIWSTATG.EXE (eb0)
d:\notes\nIWAGENT.EXE (ee8)
d:\notes\nIWINFO.EXE (f08)
d:\notes\nHTTP.EXE (f24)
d:\notes\nAMgr.EXE (1084)
C:\Candle\IntelliWatch\MONITOR\iwcrdet.exe (10bc)
d:\notes\nCldbdir.EXE (13d4)
d:\notes\nClrepl.EXE (13d8)
d:\notes\nClrepl.EXE (a68)
d:\notes\nClrepl.EXE (a14)
d:\notes\nClrepl.EXE (a84)
d:\notes\nClrepl.EXE (a8c)



このプロセス一覧は特別に教えなくても見てれば分かるものですが、ここからは以下のような点を確認して、NSD取得時の状況を確認します。

・ 以前に起動したNotesプロセスが残ったりしていないか
・ プロセスの親子関係などは正しいか
・ 特定のプロセスが消えたりしていないか
・ Notes以外にどのようなプロセスが稼動しているシステムなのか


たぶんNSDの解説と言うとMemcheckのようなデータの見方を解説することを期待している方も多いと思うのですが、このようなOSのシステム診断情報がNSDにはたくさん含まれているので、是非活用してみてください。

Lotus Domino 8.5 IF3 リリースのお知らせ

2009年04月10日 00:04

8.5 IF3 がリリースされています

ID Valut を利用になっている環境でセキュリティの問題がある事が分かったため、IF3としてFix を提供しています。
以下の情報は近いうちに日本語情報も公開する予定です。

Mandatory fix for Domino 8.5 servers using the ID Vault feature (#1381146)

尚、IF3はIF1、IF2の修正を包含しています。詳細は以下のページを御参照下さい。

Readme for IBM Lotus Domino server release 8.5 Interim Fix 3 (85IF3) (#1381562)

8.5 IF3 はFix Central から入手可能ですので、8.5 で ID Vault の利用を検討されている方は機能の性質上セキュリティ関連の修正になりますので、是非適用を検討してください。

Lotus Notes/Domino 7.0.4 リリースのお知らせ

2009年04月09日 00:02

Lotus Notes/Domino 7.0.4 がリリースされました

IBM Lotus Notes/Domino 7.0.4 および Lotus Enterprise Integrator (LEI) 7.0.4 の発表

PA Onlineからのダウンロードは以下の通りです。

英語版: 4月8日より開始
日本語版: 5月8日より開始


修正された問題のうち、特に報告の多かったものは以下のページより確認できます。

Notes/Domino 7.0.4 Maintenance Release (MR) - Top 20 List

Fix ListもまだFull Listは出ていませんが、近いうちに更新されると思います。

Lotus Notes/Domino Fix List

ダウンロード文書(英語版)
IBM Lotus Domino 7.0.4
IBM Lotus Notes 7.0.4

システム要件
Detailed system requirements - Lotus Notes 7.0.4
Detailed system requirements - Lotus Domino 7.0.4






アドレスに表示された公開グループを展開する

2009年04月08日 00:08

 まだグループ変更が行われたばかりで、「このグループって○○さん入ってたっけ?」と不安になってしまった時や、送別会などでこのグループのうち××さんにだけは送らないでおきたい、となったときに公開グループを展開出来ると便利ですよね。

このようなときのために7.0.2 から「公開グループの展開」と言うアクションがメールテンプレートに追加されています。 すぐに見つけにくいかもしれないのですが、新規メール編集画面で[アクション]-[オプション]-[公開グループの展開] を選択すると、宛先フィールドにある公開グループが展開されて表示されます。 無ければ無いでどうにかなるのですが、これはあると意外と便利ですので是非試してみてください。

これは以前に岩間さんのブログでも紹介されていた内容ですので、興味がある方はこちらもご参照ください。動作の考察が行われていて興味深いです。

Notes/Domino 7.0.2 Mail Templateでのちょっとした改善 -1-

個人のアドレス帳に存在するグループ(個人グループ)についてはどうでしょうか。
逆に個人グループは個人情報保護などの観点から展開しないで送りたい、と言う方もいるかもしれません。そのような方は送信オプションで、「個人グループを展開表示しない」にチェックを入れて送信する事によって可能です。
 常にそのような動作にしたい場合には、以下のNotes.ini パラメータをご利用ください。

$CollapsePersonalGroups=1


個人アドレス帳のグループが意図せず展開される (文書番号 732312)


コンソールコマンドでレプリカを作る

2009年04月07日 00:02

岩間さんのブログなどでも紹介されていて既出ですが、テスト環境とかでは便利な事も多いので。
元ネタはこの記事のようですね。
以下の手順で作成する事が出来ます。

1. Notes.ini で、 CLUSTER_ADMIN_ON=1 を設定します。
  これはクラスタ環境でなくても構いません。
 コンソールから変更するには、サーバーコンソールに以下のコマンドを入力してください。

  set config CLUSTER_ADMIN_ON=1

2. 以下のようなコマンドで作成する事が出来ます。
 
 2.1 ServerAのdbsrc.nsfをServerBにdbdest.nsfとしてデータベースコピーを作成する

    CL copy serverA!!dbsrc.nsf serverB!!dbdest.nsf

 2.2 ServerAのdbsrc.nsfをServerBにdbdest.nsfとしてレプリカを作成する

   CL copy serverA!!dbsrc.nsf serverB!!dbdest.nsf REPLICA

2.3 ServerAのdbsrc.nsfをServerBにdbdest.nsfとして設計のみコピーする
  
   CL copy serverA!!dbsrc.nsf serverB!!dbdest.nsf TEMPLATE

2.4 同一サーバー内でdbsrc.nsfをdbdest.nsfとしてコピーを作成する
 
    CL copy dbsrc.nsf dbdest.nsf

 2.5 同一サーバー内で、test.nsf をサーバーから削除する

CL delete test.nsf

Fatal Stack を見てみる

2009年04月06日 00:10

クラッシュやハングアップをした場合にサポートが最もよく見るのはコールスタック情報です。
残念ながらコールスタック上で表示される関数のインターフェースや仕様などについては公開されている情報はほとんどありませんが、既存情報との照合や動作の概要などを把握したり、有益な情報が得られる事も少なくありません。
 今日はNSDで最も特徴的とも言えるコールスタック情報とFatal Stackについての概要を説明しようと思います。

■ コールスタックとは
NSDでは、全ての Lotus Notes/Domino のプロセス、全てのスレッドでの関数の呼び出し履歴をコールスタック情報として出力します。
その他のセクションではプラットフォーム毎に多少の差異がありますが、どのNSD も何らかの形でコールスタック情報を持っています。
NSD取得時のコールスタックを確認する事によって、情報取得時の各関数の呼び出し順序などの情報を確認する事が出来ます。
NSDでは通常呼び出し順序は下から上になります。(System i だけは例外で上から下の呼び出し順序になります)
以下のようなコールスタックがあったときには、FunctionA()がFunctionB() を呼び出した事を示しています。

-> FunctionC()
-> FunctionB()
-> FunctionA()

つまり、上記のコールスタックは以下のような呼び出しが行われたことを示しています。
FunctionA() {
.....
FunctionB();
.....
}

FunctionB() {
.....
FunctionC();
.....
}

この辺は改めて書くまでも無いかもしれないですね。。。
NSDやNotesに限らず、Javaをはじめとする、C/C++ 等のクラッシュダンプ情報でも同様なので、よく知っている方も多いのではないかと思います。

■ Fatal Threadとは?
サーバーやクライアントがクラッシュした際に例外が発生したスレッドの事を、Fatal Threadと呼びます。 NSD内のFatal Thread を実際に見てみましょう。

WindowsのNSDでは以下の赤字のような「Fatal Thread」と言う文字が入るので比較的簡単に探す事が出来ます。

Fatal Thread の出力
############################################################
### thread 1/25: [ ntvdm: 0a74: 0cd8] FATAL THREAD
### FP=0013b260, PC=7c94eb94, SP=0013b1fc
### stkbase=00140000, total stksize=212992, used stksize=19972
############################################################
[ 1] 0x7c94eb94 ntdll.KiFastSystemCallRet+0 (b10,493e0,0,13b7e4)
[ 2] 0x7c802532 kernel32.WaitForSingleObject+18 (b10,493e0,3,13ba00)
@[ 3] 0x60193f25 nnotes.OSRunExternalScript@8+1269 (12c,1,1,0)
@[ 4] 0x601943ba nnotes.FRTerminateWindowsResources+986 (1,0,1010,1)
@[ 5] 0x6019477f nnotes.OSFaultCleanupExt@24+895 (1284bd0,1010,0,0)
@[ 6] 0x6019480a nnotes.OSFaultCleanup@12+26 (0,1010,0,10ec8d0f)
@[ 7] 0x601a0624 nnotes.OSNTUnhandledExceptionFilter@4+276 (13cd60,2b3,54200a0a,61657268)
@[ 8] 0x60178551 nnotes.Panic@4+481 (60b82d3b,10ec8d10,13cd8c,60008c62)
@[ 9] 0x601785cc nnotes.Halt@4+28 (2b3,10ec8d10,13cdc8,13cda4)
@[10] 0x60008c62 nnotes.HANDLEDereference@4+50 (10ec8d10,0,13db6c,0)
@[11] 0x60008b92 nnotes.InitDbContextExt@12+210 (10ec8d10,13cdc8,3,13cdfc)
@[12] 0x60008cd2 nnotes.InitDbContext@8+18 (10ec8d10,13cdc8,1864e63,e2)
@[13] 0x60015103 nnotes.NSFDbPathGet@12+19 (10ec8d10,13d31c,0,127)
@[14] 0x6002f2e1 nnotes.NSFCreateNotesURL@8+129 (13db3c,13dbd0,13dc90,11c9ee14)
@[15] 0x61d0cfdf nnotesws.DeskViewExporter::GetLinkNotesURL+543 (13dc90,f,c606fa0,13e7b8)
@[16] 0x6206a640 nnotesws.LinkExporter::ExportFormatData+112 (f,13dc8c,f,c606fa0)
@[17] 0x6180203a nnotesws.OLEDataTransfer::GetData+106 (c606fa0,13e7b8,13e7ec,9344914)
@[18] 0x618208d4 nnotesws.OLEDataImporter::ExportFormatData+180 (f,13e824,26c,9344918)
@[19] 0x61e03103 nnotesws.ViewDropTarget::Drop+67 (9344930,26c,2b1,1)
@[20] 0x61800d32 nnotesws.CNEMDropTarget2::OSDropTarget::Drop+114 (62140ed0,c606fa0,0,26c)


Windows 以外ではこのような表示が無いのですが、その場合には以下のようなキーワードを含むコールスタックに着目してください

Windows
Fatal, Panic, Halt, access violationなど

UNIX
“fatal”, “raise.raise”, “signal handler”, “abort”, or “terminate” など

多くの場合、Windows ではPanic()または Halt()、UNIX系ではfatal_error() がFatal Thread では呼ばれているはずなのですが、色々なケースがあるので柔軟に探してください。。


■ 関数名の表示
 実はこの表示はプラットフォーム毎に違うのですが、以下の例を見てみましょう。

@[10] 0x60008c62 nnotes.HANDLEDereference@4+50 (10ec8d10,0,13db6c,0)

これは、nnotes.dll のHANDLEDereference() と言う関数が呼ばれた、と言う意味です。
nlnotes.xxxxx であれば、当然nlnotes.exe の関数になるので必ずしも隠れている拡張子はdll とは限らないのですが、DLLかEXEだと思っていれば間違いないでしょう。

頭についている"@"は Windows NSD固有の機能なのですが、NotesのDLLから呼ばれた関数である事を示しています。nnotes.dllがNotesのプログラムディレクトリにあるので、そこから判断しています。
何気ない一行でも案外色々な意味があったりするのです。


技術情報の検索
上記のようにした、クラッシュでは、Fatal Threadにある関数名からナレッジベースを検索していきます。
 出来るだけ上の関数を取るのが普通ですが、上の例で言えばHalt()から上は通常のException Handlingなので検索には使用しません。なので、上のFatal Threadで太字にした部分などを検索に使用します。(ここではやり方だけを説明しているので、上の関数名による検索で適切な技術文書がヒットするかしないかはこの際重要ではありません。)
 
 技術文書がヒットしない事もよくあると思いますが、クラッシュが複数回発生した場合などは、このようにして発生したクラッシュを分類する事が出来るようになるはずです。

・ 同じタスク・同じコールスタックで発生
・ 異なるタスクだがほぼ同じコールスタックで発生している
・ 必ずしも同じとは言えないがよく似たコールスタックで発生している

自分の端末でクライアントが頻繁にクラッシュするときなどにちょっとIBM_TECHNICAL_SUPPORTディレクトリに出来たNSDを眺めてみてください。

以前にこのブログで紹介したLotus Notes Diagnostics UtilityなどではNSDを見て技術情報を簡易に検索してくれますが、このような方法を使っているはずです。

送信メールダイアログ

2009年04月03日 00:10

Notes Design Blog でこんなトピックがあったのですが、ちょっと興味深いですね。
Send Mail Dialog Today and a Proposal to Change it

編集中のメッセージを終了しようとしたときに、メール送信ダイアログで以下のような選択肢が表示されます。(クリックすると拡大します)

送信ダイアログ

この状況で、メールを送信したいことってあまりないので、「メールをドラフトとして保存しますか?」のようなメッセージにして、

はい: ドラフト保存
いいえ: メッセージ破棄
キャンセル: 編集続行

だけにする、と言う提案です。リンク先には画面ショット例もあります。

これは面白いですね。個人的にも賛成です。


Notes のエラーコード

2009年04月02日 00:03

続きはブロマガを購入して楽しもう!
このコンテンツはブロマガ(有料)です。
購入すると続きをお楽しみいただけます。
ブロマガって何?

NSD 概要

2009年04月01日 00:04

NSD の記事ですが少し繰り上げて今日から書き始める事にします。

たくさんの記事があるのでブログの記事にするには小出しにしていくことになってしまいますが、何とか記事毎に話は完結させるようにするのでご了承下さい。

何から書き始めるか悩んだのですが始めから読み方のような話をしても分かりづらい気がしたので今日は概要について書いてみます。(尚、ここからの記事では 7.0以降のNSDを想定して書いています。それ以前のリリースでもほぼ同じ状況のはずですが、多少異なる点があることはあらかじめご了承下さい。)

NSDは、Notes System Diagnostics の略で、Lotus Notes/Domino の障害解析ツールです。
サーバークラッシュ・ハングではもっとも強力な調査ツールと言えるのではないかと思います。
NSDが使用されるもっとも典型的な問題は、クラッシュ・ハング・サーバースローダウン等の問題ですが、システム情報の収集やプロセスの状態などを確認したり、文字通りNotesの動くシステムの診断ツールと言えるのではないかと思います。

■ 透過的な実行
NSDは出来るだけ機能を透過的に利用できるようにするため、サーバー・クライアントでもほぼ同じように動き、多少プラットフォームごとに出力の差異はありますが、Macintosh を除くほぼ全てのプラットフォームで提供されています。

UNIXプラットフォームではNSDはnsd.sh とmemcheckと言うバイナリから構成され、Windows ではnsd.exeと言う実行ファイルから構成されていますが、出力などは可能な限り近い形式で表示されるようになっています。

■ NSD の構成
そもそもNSDはどのような情報が含まれているのでしょうか。
細かく見ていくと切りが無いのですが、大まかには以下のような情報から構成されます。

ヘッダー情報

バージョン情報
取得時間
ホスト名
使用したコマンドライン引数など

プロセス情報

Process Tree
プロセス一覧など

コールスタック

読み込んでいるDLL
各スレッド毎のコールスタック

Memcheck

ノーツ固有の情報
・ 共有メモリ、プロセスヒープなど
・ メモリハンドルの利用状況
・ 開いているデータベースやビューなど

環境情報

ネットワーク情報
ハードウェア情報(CPU数、搭載メモリなど)
環境変数
Notes.ini
パッチ情報など
※ プラットフォームによって出力には差異があります


NSDはこのように取得時のスナップショットを最大限に取得しますが、やはり不得手なエリア、と言うのはあるので、どんな問題でも行き詰ったらNSDで解決!とは行きません。

たとえばクライアントのUI操作に依存した部分はNSDだけではなかなか分からないですし、式言語やLotusScriptやJavaなどから発生しているエラーやランタイムエラーはやはり言語に応じた機能を使う方が効率的に問題特定が行えるので、TPOに応じた利用が必要な点は言うまでもないのですが、上のようにどのような出力が含まれるのか分かっていればこういう点は考えやすいのではないかなと思います。

次回から少しずつNSD の出力などについて詳細に入っていきたいと思います。

# NSDは長期に渡って取り上げようと思っているので、基本的には間に記事を挟みながらの少しずつの紹介になると思いますので、あらかじめ御了承下さい。。



最新記事