fc2ブログ

Notesのプログラムディレクトリを取得する

 NotesのデータディレクトリはNotes.iniから取ればいいと思うのですが、プログラムディレクトリは取得する何かいい方法はあるのでしょうか?

こういうLotusScriptのステートメントとか関数ってなかったっけ?と思ったのですが見つからなかったのでこんなのを作ってみました。レジストリから取得しています。

なので、複数端末を入れているような環境では正しく動かないとは思いますが簡易な方法としてはいいのではないでしょうか。

これも簡単なコードですが、WSHオブジェクトを呼び出してレジストリ値を取得するサンプルとしても流用出来るのではないかと思います。




Sub Click(Source As Button)
' C:\Lotus\Notes\ を返します
Msgbox GetProgramDir
End Sub

Function GetProgramDir() As String
GetProgramDir = ""
Set objWshShell = CreateObject("WScript.Shell")
strValue = objWshShell.RegRead("HKLM\SOFTWARE\Lotus\Notes\Path")

If Right(strValue,1) <> "\" Then
strValue = strValue & "\"
End If

GetProgramDir = strValue
End Function



PDFへ出力する

そういえば、developerWorksのAVPの記事が増えてきたのでこっそりこのエントリもアップデートしています。
 最近急に記事が増えたのは年末に向けて目標設定でもしていたのでしょうか。(笑)


さて、これらの記事が興味深いのは、いわゆる何らかのNotes/Domino運用の課題のソリューションとしてお客様に提供したものの中でも製品の基本機能を組み合わせて実現しているものが多いからではないかな、と思います。

ちなみに僕はこの記事が気になったので今日のエントリはこの話をしてみます。
[AVP]Notes からの PDF 変換、OLE起動の事例

タイトルを見て何らかの方法でNotes文書をPDFファイルに変換するのかな、と思ったのですが、変換自体はAcrobatを使用して行っていたのですが導入さえしていれば、それ以外の専用アプリケーションなどは前提としていないので非常に興味深い方法ではないかと思います。

簡単に言うとデフォルトプリンターをAcrobatになるようにチェックして、ファイル名を指定するためにレジストリに書き込んで、最後はフロントエンドから印刷しているのですがうまくやっているなあ、と思います。

ちなみにデフォルトのプリンタの取得に関するレジストリキーの値が落ちているみたいですが、私のWindows XP 環境で見ている限り、HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device でした。

それだけでは能がないのでここでは、式言語の@RegQueryValue と言うものがあるので、別の方法でこのキーの値を取得する例を示してみます。
strFormula$ = |@RegQueryValue("HKEY_CURRENT_USER";"Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows";"Device")|
dPrinter=Evaluate(StrFormula$)


エラーハンドルが少しあいまいになってしまいますが、無効なキーを指定したときには空文字が返ります。
ただ、むやみにシステムのレジストリ値をアプリケーションが書き換えることに抵抗がある人はいると思うのでこの手の実装をNotesアプリケーションに組み込む人は好みがあると思うのですが、それほど難しいロジックを利用せずに実現出来た、と言う意味では面白いサンプルだな、と思いました。


LotusScriptからWMI を呼び出す

Microsoftのスクリプトセンターを見ているとこの辺のScriptをLotusScriptでも利用できないかなあ・・・と思うことがよくあるのですが、今日はそんなときのためのサンプルを取り上げてみましょう。

基本的にはスクリプトセンターのコードはVBSベースなのでほとんどの場合は以下の二点だけ気を付ければ流用することが出来ます。

・ WScript.Echoは Messageboxに変える (サンプル用に出力している場合がほとんどなので、コメントアウトしたり、Print文に変えても問題ありません)
・ For Each が出てきたらForall に変える

例えば以下の例を挙げてみます

プロセス パフォーマンスの監視(スクリプトセンター)

これをLotusScript用に変えてみます。
全プロセスをメッセージボックスで出力しても面倒なので、ここでは nlnotes.exeの情報だけ出すように変えておきます。
Sub Click(Source As Button)
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process")
Forall objProcess In colProcessList
If (objProcess.Name = "nlnotes.exe") Then
Msgbox "Process: " & objProcess.Name
Msgbox "Process ID: " & objProcess.ProcessID
Msgbox "Thread Count: " & objProcess.ThreadCount
Msgbox "Page File Size: " & objProcess.PageFileUsage
Msgbox "Page Faults: " & objProcess.PageFaults
Msgbox "Working Set Size: " & objProcess.WorkingSetSize
End If
End Forall
End Sub



意外と簡単ですね。
WMIのサンプルはスクリプトセンターから探してもいいですし、WMI Code Creator などを使ってメソッドやプロパティの一覧(ついでにサンプルを出力してくれます)などを取り出しながら作ってもいいと思います。

是非使えそうな機会があったら試してみてください!

スクリプト編集時に行番号を表示する

超小ネタですいません。

Domino Designer で Lotus Script や JavaScript なんかを編集している時に行番号が表示されたらなと思う時があったんですが、Eclipse ベースになってからそれが可能になりました。

8.5.x の Domino Designer のプリファレンスの [一般]-[エディター]-[テキスト・エディター] 内に「行番号の表示」という設定項目があります。デフォルトではオフになっているので、チェックを入れることで行番号が表示されます。

editor.jpg

Designer のプリファレンスは、設定項目が多いので、なかなか把握しきれませんね。

キーボードのショートカットを LotusScript で実行する

現在のビュー上のすべての文書を選択する [Ctrl + A] のようなキーボードのショートカットを LotusScript で実行することは可能でしょうか?

これは、Windows の user32.dll を使用すれば、LotusScript から実行することが可能です。

user32.dll を呼び出した上で、Keybd_event サブルーチン内で以下を定義します。

- 最初のパラメータで送信するキーを定義する
- 3 番目のパラメータでアクションを定義する(0=keyDown、2=keyUp)
- 2 番目と 4 番目のパラメータは使用しないので、0 を入力する

下記のサンプルは、[Ctrl + A] の実行で、ビュー上ですべての文書を選択するのを LotusScript から実行します。[Ctrl + A] キーを押すには、以下の 4 つのキーボードイベントを実行する必要があります。

- [Ctrl] キーを押す
- [A] キーを押す
- [A] キーを放す
- [Ctrl] キーを放す

キーの定義は、[Ctrl] が 17 で、[A] が 65 です。
------------------
(Declarations)
Declare Sub keybd_event Lib "user32.dll" (Byval bVk As Integer, Byval bScan As Integer, Byval dwFlags As Integer, Byval dwExtraInfo As Integer)

Sub Click(Source As Button)
 keybd_event 17,0,0,0 ' Ctrl key down
 keybd_event 65,0,0,0 ' A down
 keybd_event 65,0,2,0 ' A up
 keybd_event 17,0,2,0 ' Ctrl key up
End Sub
------------------

キーの定義は以下のようになります。

Tab: 9
Enter: 13
Shift: 16
Ctrl: 17
Alt: 18
←: 37
↑: 38
→: 39
↓: 40
A ~ Z: 65 ~ 90

NotesLog を使ったエージェントの開始/終了の記録

Domino サーバー上で実行するエージェントが多数あるとします。各エージェントの開始、終了は Domino サーバーのコンソールログに記録されます。それぞれのエージェントの開始時刻、終了時刻を調べる場合は、コンソールログでそれぞれのエージェントの動作を確認する必要があります。

エージェントの動作に関してもっと簡単に確認する方法はないのでしょうか?
それぞれのエージェントで NotesLog (LotusScript)、Log (Java) クラスを使った追加の記述することで可能です。

以下、LotusScript の例で説明します。
エージェントの中で print 文を記述することで、Domino サーバーの定期実行エージェントでは print 文の出力がサーバーコンソールに書かれます。この print 文の出力とは別に、NotesLog クラスで alog4.ntf から作られたデータベースに対して書き込みを行う事が可能です。

エージェントの開始、終了に関して NotesLog#LogAction メソッドで明示的に書き込みを行う事で、エージェントの開始、終了を後で簡単に確認できます。

この例では AgentLog.nsf というデータベースに記録を行っています。複数のエージェントで同じ処理を行う事で、AgentLog.nsf に書かれた内容を見れば、各エージェントの開始、終了に関する情報を確認できます。

%REM
Description: Example of using NotesLog class
%END REM
Option Public
Option Declare

Sub Initialize
'Agent log
1: Dim logDB As New NotesLog("AgentLog testing")
2: Call logDB.Opennoteslog("", "AgentLog.nsf")

3: logDB.Logaction("Agent started")

'エージェント本体の処理を行う

4: logDB.Logaction("Agent finished")
5: Call logDB.Close()
End Sub



以下、各行の動作を説明します。

1: NotesLog クラスを使うには最初に NotesLog クラスのインスタンスを作ります。
New NotesLog の引数には現在のエージェントを識別するための文字列を渡します。この値は書き込み先の AgentLog.nsf で "Agent Name" という列で使われます。

内容は何でも良いですが、エージェント A を実行する際はエージェント A、エージェント B を実行する際はエージェント B を行っている事がわかる内容としてください。

2: OpenNotesLog メソッドでログを書き込む先のデータベースを指定します。
※書き込み先のデータベースはテンプレート alog4.ntf から作られている必要があります。この例では既にデータベースが存在する前提で書かれています。

3&4: 記録したい文字列を LogAction メソッドで書きます。
この例ではエージェントが開始した、終了した旨をログに書いています。この行を書いた時刻は書き込み先のログで自動的に記録されますので、エージェントで現在時刻を書く必要はありません。

5: エージェントの終了時に作成した NotesLog のインスタンスをクローズします。

以上、ご活用ください。