Lunatic Sol

IT Tips

Evaluate を使いこなそう

2004-06-23 18:25:51 | LotusScript
ひとつ前の Soundex はつまらないと言いましたが、でも Evaluate を使いこなす良いサンプルだったかもしれません。と思い、Evaluate をうまく使いこなして @関数 にしかないファンクションを LotusScript でも汎用的に使えるようにしてみるのも良いかなと。

雛形として、以下のような Function を準備しておくと、単純な引数を受け取る @関数であれば結構汎用的に Evaluate を使えるかと思います。

Function ファンクション名 ( 引数...) As 戻り値の型
    Dim tmp As Variant
    macro$ = 引数と @関数 を組み合わせた文字列の整形
    tmp = Evaluate(macro$)
    ファンクション名 = tmp(0)
End Function

例えば @URLEncode() を使いたい場合は、ファンクション名を URLEncode にして引数、戻り値は全て @URLEncode にあわせます。Function 内部の macro$ の行では @URLEncode("Platform";"文字列") となるように連結式を書いておいてあげれば、あとは呼び出し方で引数を設定してあげればいいですよね。ポイントは " を文字列の中に入れたいときには "" と二つ重ねるという点です。

■ 関連記事
Lunatic Sol:Soundex

Soundex

2004-06-23 17:58:38 | LotusScript
つまんないネタですが、毎回 Evaluate 使って書くの面倒なのでメモがてら残しておきます。

@Soundex を LotusScript で呼び出すだけのファンクションです。呼び出すときは result$ = Soundex("Lotus Notes") みたいにすればいいだけです。

Function Soundex(source As String) As String
    Dim tmp As Variant
    macro$ = "@Soundex(""" & source & """)"
    tmp = Evaluate(macro$)
    Soundex = tmp(0)
End Function

LNDatabase::GetFTIndexFlags って.....

2004-06-17 14:20:00 | C/C++
全文索引のオプションを調べる方法はないか。LotusScript にはないので、Notes C API を調べてもない。唯一見つけたのは Notes C++ API の LNDatabase::GetFTIndexFlags メソッド。こいつはいいーと思い、DBTITLE というサンプルをちょろっといじって使ってみた。

使えねぇ。

常に同じ値 (0x100) を返します、この人。あぁ、ヘルプを見たらこんなことが書いてあった...

Gets the flags used by LNDatabase::CreateFTIndex to create a full text index for a database.
なんだ、普通にこれだけ呼び出したんじゃ全然区別できないんだなぁ。::CreateFTIndex で使用したフラグをとるだけなんすな。いらないな、このメソッド。

ReverseOrder

2004-06-16 13:34:06 | LotusScript
文字列の順序を並べたい時があります。例えば、「あいうえお」を「おえういあ」にしたり、「aabbccddee」を「eeddccbbaa」にしたり。Little Endian と Big Endian のバイトオーダーを変更したいときにも使えます。例えば「0a3c0434」を「34043c0a」にしたりとか。

そんな時に使えるファンクションを書いてみました。並び替えの効率は良くないかもしれませんが、単純に入力文字列を指定した文字単位数ごとに配列に代入し、代入された配列の後ろから再度連結させるだけのものです。

引数の1つめが入力文字列、2つめは1ブロックの単位 (例えば2文字区切りにしたい場合は 2)、3つめは並び替えられた文字列です。簡単なエラー処理を加えているので関数自身は Integer 型のエラーを返します。0 は NOERROR、1 は Unit の長さが1以上以外のエラー、2 は割り切れないエラーです。

Function ReverseOrder(expr As String, unitLen As Integer, result As String) As Integer
    Dim exprLen As Integer
    Dim index As Integer
    Dim tmp() As String
    ReverseOrder = 0 '0 = NOERROR
    result = ""
    
    '### ERROR 1 = Unit の長さは 1 以上のみ
    If unitLen =< 0 Then
        ReverseOrder = 1
        Exit Function
    End If

    '=== 配列化
    exprLen = Len(expr)
    If (exprLen Mod unitLen) = 0 Then
        index = (exprLen / unitLen) - 1
    Redim tmp(index)
    For i = 0 To index
            tmp(i) = Mid(expr, (i * unitLen) + 1, unitLen)
        Next
    Else
        '### ERROR 2 = Unit の長さでインプット文字列が割り切れない
        ReverseOrder = 2
        Exit Function
    End If

    '=== 配列の後ろから並び替え
    For i = index To 0 Step -1
        result = result + tmp(i)
    Next
End Function

インターネットオプションを直接開く

2004-06-11 19:07:00 | LotusScript
へぇ、と思ったのでメモ。

インターネットオプションを開くとき、通常は IE のメニューから [ツール] -> [インターネットオプション] を開きますが、以下の方法で直接起動することができるんですね。

control.exe Inetcpl.cpl

    もしくは

rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl
タブも指定したい場合は最後に ,,4 みたいにつけてあげればいいのです。私は [接続] タブを多用するので、LotusScript の Shell 関数を使って以下のようにしてあげれば簡単に開けちゃいます。@関数の Execute コマンドでも実行できないかなぁ。そうすればアイコンに登録できるのにね。

Sub Click(Source As Button)
    res = Shell("control.exe Inetcpl.cpl,,4",1)
End Sub
■あかねちゃんの Shell de き~っくforVB
http://www.geocities.co.jp/Playtown-Spade/5313/shell.html

@ServerName と同等の処理をノーツ R5 で実現する

2004-06-11 13:39:00 | @Formula
現在の DB のサーバー名ってどうやって取得すればいいんだっけ?と Designer ヘルプを眺めていたら 6 から追加された @ServerName というのがあった。サーバー上の DB の場合は CN=Server/O=Domino のように値を返してくれて、ローカルの場合はユーザー名が返るらしい。これをノーツ R5 で実現するにはどうすればいいのか?

よく考えたら現在の DB のサーバー名って @DBName を使えば取得できるじゃないですか。ただ違うのは @DBName はローカルの場合サーバー名をブランクにするという点。そもそもローカルの場合にユーザー名が出る必要性はあるのかどうか?という疑問はありますが、まぁノーツ R5 でも @ServerName と同等のことはできるよという紹介。
@If(
    @Subset(@DbName;1) = "";
    @UserName;
    @Subset(@DbName;1)
)

CreateFTIndex メソッドのオプション

2004-06-09 22:22:29 | LotusScript
LotusScript で全文索引のオプションをチェックできないかな、とデザイナーヘルプを見ていたら Notes 6 からいくつか FT 関連で追加されているメソッドがあることを発見。そのうちのひとつ CreateFTIndex メソッド (NotesDatabase クラス) では全文索引のオプションをセットすることができる。これは便利ということでいろいろ試してみた。しかし一点不明なことがある。FTINDEX_ATTACHED_BIN_FILES の動きがよくわからない。

Sub Initialize
    Dim s As New NotesSession
    Dim db As NotesDatabase
    Set db = s.CurrentDatabase
    options& = FTINDEX_ATTACHED_BIN_FILES
    Call db.CreateFTIndex(Clng(options&), True)
End Sub

上記のように FTINDEX_ATTACHED_BIN_FILES 単体で処理すると全文索引のオプションが全部外れてしまう。でも、5つのオプションを全部組み合わせてみたら添付ファイルの詳細検索も設定される。うーん、といろいろやってみたらわかった。どうやら FTINDEX_ATTACHED_FILES (1) と組み合わせないと使えないらしい。

でも良く考えたら当然の動作なのかも。だって「簡易検索 (フィルターなし)」と「詳細検索 (添付ファイルフィルターあり)」はどちらかしか選択できないオプションであり、仮に FTINDEX_ATTACHED_BIN_FILES だけで有効になるのだとすると、FTINDEX_ATTACHED_FILES と組み合わせた時にはどっちが有効になるのかわからないもんね。

ただそうであったとしても、ヘルプにはちゃんと書いておいて欲しいなぁと思ったり。ちゅうことで、上記サンプルの options& のところを FTINDEX_ATTACHED_BIN_FILES + FTINDEX_ATTACHED_FILES にしてあげれば添付ファイルフィルターを有効にした FT オプションがセットされます。

2004/06/25 Updated
テストでは options& という Long 型変数は使わずに FTINDEX_ATTACHED_BIN_FILES + FTINDEX_ATTACHED_FILES と定数を合算した 17 を直接明示していました。その環境では何ら問題ない。で、あとで options& という変数を使うと失敗しました。あれれ?と思って CreateFTIndex の引数にて Clng() で強制的に LONG 型に変換してあげたら問題なくオプションが効きました。ということで、Clng() をセットするのを忘れないように。サンプルの赤字部分です。

Win Min が停止できないエラー

2004-06-07 02:15:37 | Computer Tech Info
最近自宅の PC の調子が悪い。厳密には TV チューナーで TV が見れないという数ヶ月前からの問題はあるのだが、それとは別にここ2、3日、ウィルス?の予感がする調子の悪さが起きている。その兆候はシャットダウン時に Win Min が停止できないエラーが必ず発生することである。

Win Min とは?

Win Min?な~に、それ?名前からしてなんか、あやしい。ということで、しばらく行ってなかったウィルススキャンをやってみると…。IE のキャッシュディレクトリに Trojan 関連がひっかかる、ひっかかる (笑)。とりあえず IE キャッシュをクリアするなどしてファイルは削除。恐らくこの Trojan 関連がしかけられたサイトを見て、そいつが中にしかけたに違いないが、一時ファイルをクリアしても本体は残っている。当然 Win Min の問題は解消されない。どこだ、どこなんだ。

Process Explorer を使ってファイル一覧をツリー表示。タスクマネージャーと違ってプロセス階層表示され、開発会社なども表示されるので見極めがしやすい。その中で見つけましたよ。怪しいプロセスを。

IEengine.exe

いかにも IE のものっぽく、且つ C:\\Program Files\\Internet Explorer の下にある。だがしかし、だがしか~し、MS のものではない。こいつに違いない!ということでプロセスを Kill し、ファイルをリネーム。あとこいつを起動しているスタートアップかレジストリがあるはずなので調べたら案の定レジストリの Run キー (詳細は後述) にエントリされていた。ファイルはリネームしたので、こいつはそのままにしてマシンを再起動。やはりこいつだった。シャットダウン時の Win Min の停止エラーは表示されない。

IE のデフォルトホームページと検索サイト

しかしながら問題は完全解決ではなかった。Sleipnir を使っているために気づき遅れたのであるが、IE のホームページが http://your-searcher.com/sp.htm なる不明な英語サイトに変わっていたのである。且つ、http://www.google.co.jp/ などで検索すると IE の左ペインに同じ不明な英語検索サイトが表示され、ポップアップまで表示される始末だ。

ホームページはインターネットオプションで変更したが、IE の検索で表示される WEB サイトはどこなのか?多分レジストリだな、と不明な英語サイト URI で検索したところ IE の SearchAssistant 文字列値にエントリされていた。ということでこれを修正したところ解決!

解決方法&詳細

IEengine.exe はタスクマネージャーでも見つかります。9割方これが本来必要なファイルだとは思えないので、もし IEengine.exe が IE のプログラムディレクトリ直下にあり、且つタイムスタンプが OS シャットダウン時に Win Min 停止エラーが表示されだした日と同じであればこれだと疑えばいいでしょう。タスクマネージャーでまず IEengine.exe を停止してファイルをリネームします。OS を再起動してさらにシャットダウンして問題がなければ問題のものはこれだと思います。

レジストリもクリーンにしておいた方がいいと思いますので、IEengine.exe で検索して
HKEY_USERS\\{S-などで始まるキー}\\Software\\Microsoft\\Windows\\CurrentVersion\\Run
にある IEengine という文字列値を見つけます。ここに指定されているパスが <IE のプログラムディレクトリ>IEengine.exe のはずですので、この文字列値を削除します。

また <IE プログラムディレクトリ> にあやしいファイルが他にも実は保存されていたりします。私の環境の場合 icfkga.exe oxbrtcvh.exe lxwfgvhg.exe の3つがありましたので、これを .bak などにリネームして実行できないようにしておくことで対応しました。

IE のホームページは [ツール] - [インターネットオプション] の [ホームページ] で変更すればいいですが、検索はレジストリをいじらないといけません。
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Internet Explorer\\Search
SearchAssistant という文字列値があり、ここに http://your-searcher.com/sp.htm が設定されています。同じキーにある CustomizeSearch 文字列値と同じ値 (IE6 の場合 http://ie.search.msn.com/{SUB_RFC1766}/srchasst/srchcust.htm のようです) をコピーしてデフォルトに戻します。

以上すべて対応すれば、元通りになるはずです。で、そもそもなぜトロイの木馬に感染してしまったのか、なんですが。ん?そりゃー、♂が単身生活してりゃーそういうサイトも見るわなー。と、完全開き直りモード。(汗)。あー、そーさ。洋モノ見てたさ。あ”ー?悪い?(^^

この記事で紹介された方法でプロセスの停止やレジストリの変更を行い、その結果何らかの問題が万が一発生したとしても当方は一切の責任を負いませんので、あくまで参考としてお読みください。

数学 (累乗やら対数やら)

2004-06-04 14:06:40 | Computer Tech Info
ちょっとした計算や数学の基本が必要な仕事をしているので、関数電卓をよく使う。でも、通常は基本的な範囲なので数学というレベルまではあまり考えたりしない。でも、ちょっと復習する必要があったので勉強してみた。

y = x z
上のような式がある。x を左項に持っていったらどういう方程式がなりたつのか、z を左項にもって言った場合は?x を左項に持っていくのはそんなに悩まなかった。意外と学生時代にやったことってのは最近やっていなくても頭に入っているものである。

x  = z√y    = y (1/z)
Windows の関数電卓で計算したい場合は y -> [x^y] -> (1/z) のようにして使えば計算できる。便利だ。じゃぁ z を左項に持っていってみよう。ん?どうするんだっけ?ここが思い出せなかった。対数 (log) を使う記憶はあったが底をどうすればいいとか正直覚えていなかった。なってネットって便利なんだろう。ちょろっと調べれば答えがある。

z  = log x y    = (log e y) / (log e x)
関数電卓を使う場合は y -> [log] -> x -> [log] のようにすれば計算できる。久しぶりに少しだけ数学らしいことをしたら、なんかおもしろい。