当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。
記事そのもののリンクについてはご自由に行っていただいてよいです。

テクてく Lotus 技術者 Slack に参加しよう!

2016年3月8日火曜日

環境変数を色々試してみた(3)XPagesの場合

こんにちは。
今日は3月8日。雨が止んだのは良いですが、霞がかっていてもやもやしています。晴れるならカラッと晴れてほしいものです。


さて、昨日は1日に2本の記事を書くという暴挙を犯しましたが、それでは物足りない!という方がいたようです。


ということで、ESS Dev Japanの中の人に無茶ぶりを受けてしまったので、書きます(笑)。


XPagesの場合、Webブラウザで動かすのとNotesクライアントStandard版で動かす(いわゆるXPinC)という2種類あります。
それぞれ環境変数はどのようにアクセスできるのかを検証してみましょう。
XPagesそのものは同じものを使いますということでこんな画面を作ってみました。
環境変数のテスト用XPages

1.環境変数の設定方法

まずは、設定方法から見ていきましょう。
動きを分かり易くするために、 [設定]ボタンを設けて、それをクリックすると環境変数が設定されるというものにします。

1-1.設定方法

XPagesの場合、@Environmentや@SetEnvironment関数はありません。代わりにSSJSが利用できますので、NotesSessionクラスのsetEnvironmentVarが利用できます。
構文は次の通りです。
setEnvironmentVar( vname:string, value:any, issystem:boolean );

vnameが環境変数名、valueが設定する値、issystemがユーザー環境変数かシステム環境変数化を指定します。
引数自体はLotusScriptと同じなので分かり易いですね。
例)
var env1 = getComponent( "env1" ).getValue();
var val1 = getComponent( "val1" ).getValue();
session.setEnvironmentVar( env1, val1, true );

上記は画面上のenv1というコントロールとval1というコントロールに書かれた内容を元にして、環境変数を設定するというものです。


1-2.Webブラウザで動かした場合

上で作成した画面を使ってWebブラウザで実行してみました。
環境変数名/設定値に入力した後、[値の設定1][値の設定2]のボタンをクリックするのですが、環境変数に設定する以外のことは何もしていないので、画面に変化はありません。

結果の確認は、Notesクライアントのnotes.iniとDominoサーバのnotes.iniの内容を調べてみます。
Notesクライアントのnotes.iniには予想通り何も設定されていませんでした。
Webブラウザから利用しているので当然でしょう。
次にDominoサーバのnotes.iniを見てみます。
なんとまぁ、ちゃんと設定されているではないですか。関数が用意されているので当たり前と言えば当たり前ですが。
これでXPagesの場合、Dominoサーバに環境変数を設定できるという事が分かりました。

1-3.XPinCで動かした場合

では、次にこのXPagesの画面をXPinCで動かしてみましょう。
Webブラウザと同じ環境変数名にしたのではどのように動いたのかわからないので、別の名前にします。
やはり、ボタンをクリックしただけでは何も変わりません。

先ほどと同じようにnotes.iniを見てみましょう。
今度は、Dominoサーバのnotes.iniから先に見てみます。
おや?追加されていません。
今度は、Notesクライアントのnotes.iniを見てみましょう。
なんと!設定されていました。
NotesクライアントのStandard版でXPagesを動かしたときは、クライアントを判別して、notes.iniに書き込んでくれるようです。

これはプログラムがどこで動いているのかをNotes/Dominoがきちんと把握しているという事ですね。
素晴らしい!


2.環境変数の取得方法

2-1.取得方法

取得方法も@関数ではなく、SSJSで行います。
関数とその構文は以下の通り。
getEnvironmentString( vname:string, issystem:boolean ) : string
getEnvironmentValue( vname:string, issystem:boolean ) : any

vnameは環境変数名、issystemはシステム環境変数か、ユーザー環境変数かを指定します。
2つの違いは値が文字列で返ってくるかany(LotusScriptでいうVariant型)で返ってくるかです。
例)
var env1 = getComponent( "env1" ).getValue();
var ret = session.getEnvironmentString( env1, true );
getComponent( "cfEnvVal1" ).setValue( ret );

上記はenv1というコントロールに入力した環境変数名の値を文字列として取得して、cfEnvVal1というコントロールの値としてセットするというものです。

2-2.Webブラウザで動かした場合

さきほど設定した環境変数を取得するために、[値の取得1][値の取得2]をクリックしてみました。
下図がその結果です。
環境変数の取得

ちゃんとDominoサーバのnotes.iniに設定してある値が取得できていることが分かります。


2-3.XPinCで動かした場合

続いて、XPinCで動かした場合を見てみましょう。
同じように[値の取得1][値の取得2]をクリックします。
結果はこちら。
環境変数の取得(XPinCの場合)

こちらもNotesクライアントのnotes.iniの設定値を正しく取得できています。


これでXPagesでも環境変数のアクセスが容易にできることが分かりました。



2.まとめ

さて、いかがでしたか?
従来のNotes DBとXPagesでは環境変数の取り扱い方が若干異なるという事が分かっていただけたかと思います。

従来のNotes DBをXPages化する際、環境変数を使っているのであれば、そこも考慮しないといけないですね。

特に、Webブラウザで利用している場合、 Dominoサーバに書き込まれてしまうので、環境変数が上書きされてしまい、思った値が取得できないなんてことになったりします。
かといって、ユーザーごとに識別させようとした場合(たとえば、環境変数名にユーザー名を付与するなど)、notes.iniの行数が爆発的に増えてしまい、パフォーマンスに影響が出かねないなどという事も考えられます(実際にパフォーマンスに影響が出るかどうかは不明です)。

XPinCで利用する場合は、従来のNotes DBと同じでユーザのNotesクライアントのnotes.iniに書き込まれるのでそういった心配はなさそうですが。


実際の業務に反映させる場合は、色々とテストしてからにしましょう。


では今日はこの辺で。





Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2016年3月7日月曜日

環境変数を色々試してみた(2)値の取得

こんにちは。
雨が降っていたのに、防水用の靴を履いてこなかったおかげで、くつがびしょびしょです。お気に入りだったのに・・・
防水用のやつを買いに行かないと。


さて、前回の記事(環境変数を色々試してみた(1)値の設定)では、環境変数に値を設定する方法について説明しました。

今回は、環境変数の値を取得する方法について説明します。

1.取得方法(1) @関数の場合

notes.iniに設定した環境変数を取得する方法について記述します。
設定方法は@関数では、3種類ありましたが、取得方法は1つしかありません。
それには、@Environment関数を利用します。構文は下記の通り。
@Environment( variable )
variableは環境変数名を指定します。
""で囲えば直接指定できますし、囲わない場合はプログラム内の変数の値を指定できます。
ここで注意点が一つあります。
指定する環境変数名に「$」はつけないという事です。
@関数では、ユーザー環境変数しか扱えないため、自動で「$」がついているものに対してアクセスするため、不要なのです。
例)
@Environment("AA");
tmp := "BB";
@Environment(tmp);

1行目の場合、notes.iniの
$AA=xx
のxxを取得します。
2-3行目の場合、notes.iniの
$BB=xx
のxxを取得します。
これは設定方法の種類にかかわらず変わりません(@関数で設定しても、LotusScriptで設定しても同じ)。



2.取得方法(2) LotusScriptの場合

続いて、LotusScriptでの環境変数の取得方法について説明します。
設定方法は1つのメソッドしかありませんでしたが、取得方法は2つのメソッドが用意されています。

2-1.文字列で取得する

まずは、NotesSessionクラスのGetEnvironmentStringメソッドです。
構文は以下の通り。
value$ = notesSession.GetEnvironmentString( name$ [, system ] )
name$は環境変数名を指定します。
systemはシステム環境変数を取得するのか、ユーザー環境変数を取得するのかをTrue/Falseで指定します。
Trueがシステム環境変数、Falseがユーザー環境変数です。
戻り値はvalue$に文字列として返されます。
例)
Sub Click(Source As Button)
 Dim session As New NotesSession
 Dim ret     As     String
 
 ret = session.GetEnvironmentString( "EE", False )
 Msgbox ret, 0, "ユーザー環境変数の取得"
End Sub

上記の場合、notes.iniに設定してある$EEというユーザー環境変数の値を取得して、その値をプロンプト表示します。


2-2.Variant型で取得する

もう一つはNotesSessionクラスのGetEnvironmentValueメソッドです。構文は以下の通り。
valueV = notesSession.GetEnvironmentValue( name$ [, system ] )
name$は環境変数名を指定します。
systemはシステム環境変数を取得するのか、ユーザー環境変数を取得するのかをTrue/Falseで指定します。
と、ほとんどGetEnvironmentStringメソッドと同じです。
唯一違うのが戻り値で、Variant型で返ってきます。
例)
Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim ret     As     String
    
    ret = session.GetEnvironmentValue( "FF", True )
    Msgbox ret, 0, "システム環境変数の取得"
End Sub

上記の場合、notes.iniに設定してあるFFというシステム環境変数の値を取得して、その値をプロンプト表示します。

正直なところ、このメソッドの存在価値が私には分かりません。
環境変数には、文字、数値、日付が設定できるとのことですが、notes.iniはテキストファイルなので、文字列という形で格納されている事は変わりません。
わざわざVariantで取得するって・・・
まぁ、数値が格納してある場合は、型変換をしなくて済むというのがいいところでしょうか?(それでも、本当に数値になっているかどうかの確認は必要でしょうから文字列でいいんじゃ?)



3.注意点

さて、設定方法と取得方法についてみてきましたがいかがでしょうか?

3-1.注意点その1

環境変数には「ユーザー環境変数」と「システム環境変数」の2種類があることが分かってもらえたかと思います。
特に、@関数ではユーザー環境変数にしかアクセスできないという事も分かりました。

3-2.注意点その2

もう一つ、大事なことがあります。
システム環境変数の場合、環境変数名の大文字小文字が区別されるという事です。
例えば、
KANKYOUHENSUU

KankyouHensuu
とは違うものとして認識されます。
ユーザー環境変数の場合は、大文字小文字の区別はされません。
$USERVALUE

$UserValue
も同じ環境変数として認識されます。
プログラムでハードコーディングしている場合などは特に気を付ける必要があります。

3-3.注意点その3

さらに、環境変数にはもう一つの考え方があります。
notes.iniに対してアクセスしている事から想像できるように、環境変数はサーバとクライアントでそれぞれ持つことができます。
これは、環境変数に対してアクセスするプログラムがどこで動いているかによります。
Notes DB内で動作する場合は、通常Notesクライアントの環境変数にアクセスしています。
Dominoサーバの環境変数にアクセスするには、スケジュールエージェントなどのサーバ上で動作するプログラムを利用します。



他にも私が気が付いていないような注意事項があるかもしれません。
ご存知の方がいれば、コメントなど残してくれると嬉しいです。


それでは今日はこの辺で・・・



Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

環境変数を色々試してみた(1)値の設定

こんにちは。今日(2016年3月7日)は東京では雨が降ってます。
雨は降ってくれないと困るのはわかっていますが、やはり好きではありません。 傘を差しながらの移動は大変です。
早く、傘に変わる雨除けの道具を発明してほしいものです(合羽は着替えるのが大変なので嫌です・・・(笑))
なお、雨だと花粉の飛散が少ないとか言いますが、関係ありません。少なかろうがなんだろうが辛いものは辛いのです。


閑話休題。


さて、本日の話題はNotesの環境変数です。
Notes/Dominoはnotes.iniというファイルに色々な情報を格納していて、その内容を元に稼働させています(これだけではありませんが)。
そして、利用者もこのファイルに対してアクセスができます。
つまり、値の読書きができるという事です。

今回はその方法と注意点についてまとめてみます。


1.設定方法(1) @関数の場合

notes.iniに値を設定するには、@関数で行う方法とLotusScriptで行う方法があります(このほか、Notes Java/CORVAクラスやJavaScriptクラスでの方法がありますが、割愛します)。
まずは、@関数について説明します。

1-1.ENVIRONMENTキーワード

まず、ENVIRONMENTキーワードを使う方法です。
構文は次の通りです。
ENVIRONMENT variable := textValue;

variableは環境変数名を指定します。この値は""で囲ってはいけません(囲ってもエラーになり、保存できません)。
textValueは環境変数に設定する値を指定します。こちらは""で囲った値が設定されます。プログラム内の変数の値を格納することもできます。この場合、変数名をそのまま記述します。
例)
tmp := "hogehoge";
ENVIRONMENT AA := tmp;


1-2.@Environment関数

次に、@Environment関数で、こちらの構文は次の通りです。
@Environment( variable ; value )

variableは環境変数名を指定します。こちらはENVIRONMENTキーワードと違い、""で囲えばその値を、変数名を指定すればその変数名の値が設定されます。
valueは環境変数に設定すする値を指定します。
例)
@Environment( "BB"; "hogehoge" )

後述しますが、この関数では環境変数に値を設定するだけでなく、取得することもできます。

1-3.@SetEnvironment関数

3つ目は@SetEnvironment関数で、構文は次の通りです。
@SetEnvironment( variableName ; value ) 

variableNameは環境変数名を指定します。
valueは環境変数に設定すする値を指定します。
@Environment関数との違いは、値の取得ができるかできないかです。
例)
env1 := "CC";
tmp := "hogehoge";
@SetEnvironment( env1 ; tmp )


これらのキーワードや@関数での設定方法に共通しているのは、環境変数名の頭に「$」が付くという事です。
これは通常、「ユーザー環境変数」と呼ばれています。
「$」を頭につけることにより、Notesが利用しているものと区別するためというのと、予約語に対して設定してしまうのを避けるという目的があると思われます。
ちなみに、頭に「$」が付かないものは「システム環境変数」と呼ばれています。


2.設定方法(2) LotusScriptの場合

続いて、LotusScriptで設定する方法について説明します。
設定に使うメソッドは1つで、NotesSessionクラスのSetEnvironmentVarを利用します。
構文は次の通りです。
Call notesSession.SetEnvironmentVar( name$, valueV [, issystemvar ] )

name$は環境変数名を指定します。
valueVは環境変数に設定する値を指定します。
issystemvaはユーザー環境変数もしくはシステム環境変数のどちらを使うのかを指定します。

2-1.ユーザー環境変数の設定方法

LotusScriptでは、ユーザー環境変数とシステム環境変数の2種類を取り扱うことができます。
issystemvarにfalseを指定すれば、ユーザー環境変数を利用することになります。
例)
Sub Click(Source As Button)
    Dim session As New NotesSession
    Call session.SetEnvironmentVar( "DD", "hogehoge", False )
End Sub

上記を実行すると、$DDという環境変数にhogehogeが設定されます。
notes.iniの行では
$DD=hogehoge

となります。

2-2.システム環境変数の設定方法

issystemvarにtrueを指定すれば、システム環境変数を利用することになります。
例)
Sub Click(Source As Button)
    Dim session As New NotesSession
    Call session.SetEnvironmentVar( "EE", "hogehoge", True )
End Sub

上記を実行すると、notes.iniに
EE=hogehoge
という行が追加されます。



ちょっと長くなったので、今回はここまでとします。
次回は値の取得方法についてみてみましょう。






Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ