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

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

2015年2月17日火曜日

ループ処理の計測

こんにちは。

まぁ、とりあえずはボタンを押してってよ、話はそれからだ。
にほんブログ村 IT技術ブログへ
新しい記事じゃなくても、ページを開いたら押してってください。じゃないと、テンション下がるわ~。


さて・・・気を取り直して。
今日はちょっとした実験です。


LotusScriptでのループ処理ですが、すでに当ブログでも紹介しているように色々な記述方法があります。
多すぎるがゆえに、「どれを使えばいいんだ?」ということになりがちです。

ここは、実行速度を計って、どれが良いのかを見てみましょう。
計測するのはFor文、Do文、While文の3つ(他にもありますが、それは貴方が自分で計測して!)です。
ループ回数ですが、10回や100回くらいでは違いを見るのは難しそうと判断して、思い切って10,000,000回(1千万回!)にしてみました(笑)。

さらにループするだけだと、あっという間に終わるかもしれないので、ループ処理1回ごとに乱数を発生させるようにしました。

ソースはこちらです。   
Sub Click(Source As Button)
    Const LOOPCNT = 10000000
   
    Dim startDT1 As String
    Dim endDT1   As String
    Dim startDT2 As String
    Dim endDT2   As String
    Dim startDT3 As String
    Dim endDT3   As String
    Dim i        As Long
    Dim j        As Single
   
    startDT1 = Format( Now, "h:nn:ss" )
    For i = 1 To LOOPCNT
        j = Rnd
    Next
    endDT1   = Format( Now, "h:nn:ss" )
   
    i        = 0
    startDT2 = Format( Now, "h:nn:ss" )
    Do While i <= LOOPCNT
        i = i + 1
        j = Rnd
    Loop
    endDT2   = Format( Now, "h:nn:ss" )
   
    i        = 0
    startDT3 = Format( Now, "h:nn:ss" )
    While i <= LOOPCNT
        i = i + 1
        j = Rnd
    Wend
    endDT3   = Format( Now, "h:nn:ss" )
   
    Msgbox _
    "For  :" & startDT1 & " - " & endDT1 & Chr$(10) & _
    "Do   :" & startDT2 & " - " & endDT2 & Chr$(10) & _
    "While:" & startDT3 & " - " & endDT3, _
    0 + 64, "ループ処理の計測"
End Sub


このコードを実行した結果が下図です。
実行結果

何度か実行してみましたが、ほぼ同じ結果となりました。
つまり、LotusScriptにおいてはForループの方が速いということですね。
※すべての言語で同じ結果になるわけではありません。実際にC++やPHPだとWhileの方が速いという事らしいです。


ループ回数が決まっているのであれば、For文を使うと良いでしょう。
ループの数が不定となる場合だけ、Do文もしくはWhile文を使うと良いでしょう。




では、今日はこの辺で・・・





【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2015年2月10日火曜日

フィールドの暗号化(5)・・・LotusScriptを使って文書のフィールドを暗号化する

皆さん、おはようございます。中々、寒さが収まらないですね。私は暑さ寒さに弱い(笑)ので、早く適度な気候になってほしいものです。

さて、今日もこちらのボタンをクリックしてから先に進んでください。
にほんブログ村 IT技術ブログへ


今日もフィールドの暗号化の話です。
これまでの話は、下記を参照ください。
フィールドの暗号化(1)・・・暗号キーを作成する
フィールドの暗号化(2)・・・暗号キーをマージする
フィールドの暗号化(3)・・・文書のフィールドを手動で暗号化する
フィールドの暗号化(4)・・・特殊フィールドを使って文書のフィールドを暗号化する

今日は、昨日宣言したようにLotusScriptを使って文書のフィールドを暗号化してみます。


Domino Designerのヘルプを読むと、文書の暗号化をLotusScriptで行うにはNotesDocumentクラスEncryptメソッドを使うようです。
そこで、下記のようなLotusScriptを書いてみました。
Sub Click(Source As Button)
    On Error Goto ErrProc
   
    Dim uiws  As New NotesUIWorkspace    '現在のUI
    Dim uidoc As     NotesUIDocument    '現在の文書
    Dim udoc  As     NotesDocument    '現在の文書のバックエンド
    Dim item  As     NotesItem
   
    Set uidoc = uiws.CurrentDocument
    Set udoc  = uidoc.Document
   
    'アイテムを暗号化する
    Call udoc.ReplaceItemValue( "AngouData", "hogehoge" )
    Set item = udoc.GetFirstItem( "AngouData" )
    item.IsEncrypted = True
   
    '暗号キーのセット
    udoc.EncryptionKeys = "test"
   
    '文書を暗号化して保存する
    Call udoc.Encrypt()
    Call udoc.Save( True, True, True )
    Exit Sub
   
ErrProc:
    Msgbox _
    "呼び出し元:【" & Getthreadinfo( 10 ) & "】" & Chr$(10) & Chr$(10) & _
    Getthreadinfo( 1 ) & " " & Cstr(Erl) & "行目" & Chr$(10) & _
    "エラー番号:" & Cstr(Err) & Chr$(10) & _
    "エラー内容:" & Error, _
    0 + 16, "実行エラー"
    Exit Sub
End Sub

これをフォームのアクションボタンとして設置して実行してみました。
ところが・・・
Runtime Error

と、こんなエラーが発生してしまい、文書が保存されませんでした。
新規文書でも、既存文書でも同様のエラーが発生してしまいました。

そこで、Encryptメソッドのヘルプをもう一度よく読んでみると・・・
「DocumentContext プロパティで返される Document オブジェクトに対して、encrypt メソッドを使用することはできません。」

とあります。
どうやら、UI経由で取得した文書はEncryptメソッドでは暗号化できないようです。

仕方がないので、次のようなLotusScriptを作成することにしました。
このプログラムはバックエンドで文書を作成するので、ビューにアクションボタンとして設置しました。
Sub DocEncrypt()
    On Error GoTo ErrProc
   
    Dim session As New NotesSession            '現在のセッション
    Dim db      As     NotesDatabase        '自DB
    Dim doc     As     NotesDocument        '新規作成文書
    Dim item    As     NotesItem
   
    Set db   = session.CurrentDatabase
    Set doc  = db.CreateDocument
   
    '文書を作成する
    Call doc.ReplaceItemValue( "Form", "MainTopic" )
    Call doc.ReplaceItemValue( "Subject", "バックエンドで作成した文書" )
    Call doc.ReplaceItemValue( "Category", "Automatic" )
    Call doc.ReplaceItemValue( "CreatedUser", session.Username )
    Call doc.ReplaceItemValue( "CreatedDateTime", Now )
   
    'アイテムを暗号化する
    Call doc.ReplaceItemValue( "AngouData", "hogehoge" )
    Set item = doc.GetFirstItem( "AngouData" )
    item.IsEncrypted = True
   
    '暗号キーのセット
    doc.EncryptionKeys = "test"
   
    '文書を暗号化して保存する
    Call doc.Encrypt()
    Call doc.Save( True, True, True )
    Exit Sub
   
ErrProc:
    MsgBox _
    "呼び出し元:【" & GetThreadInfo( 10 ) & "】" & Chr$(10) & Chr$(10) & _
    GetThreadInfo( 1 ) & " " & CStr(Erl) & "行目" & Chr$(10) & _
    "エラー番号:" & CStr(Err) & Chr$(10) & _
    "エラー内容:" & Error, _
    0 + 16, "実行エラー"
    Exit Sub
End Sub


こちらを実行した結果が下図です。
バックエンドで暗号化した文書を作成したところ

本当に暗号化されているか確認してみるために、文書を開いてみます。
暗号化した文書を開いてみた

ステータスバーに「文書の暗号を解読します...」と表示されているので、復号化していることが分かります。
どうやら、正しく暗号化できたようです。

UIの文書を使用できないので、使いどころは限られてくるかもしれませんが、こういうやり方もあるという事を覚えておくと良いでしょう。


ということで、文書のフィールドを暗号化する方法については、今回でいったん終了とします。
XPagesで暗号化できるようになるのは、ノーツの次期メンテナンスリリースのようですから、正式にリリースされたら、続きとして紹介できれば良いと思っています(それまでに覚えているかどうかが問題・・・)。

では、今日はこの辺で。






【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2015年2月9日月曜日

フィールドの暗号化(4)・・・特殊フィールドを使って文書のフィールドを暗号化する

皆さん、こんにちは。
今日2月9日は河豚の日だそうですが、私は「肉の日」と思ってます(笑)。
うん、今日の夕飯は肉を食べよう!

そんなことはどうでもいいですので、
にほんブログ村 IT技術ブログへ
をクリックして先に進みましょう。


今日も文書のフィールドを暗号化する方法についての話です。
昨日までの話は、
フィールドの暗号化(1)・・・暗号キーを作成する
フィールドの暗号化(2)・・・暗号キーをマージする
フィールドの暗号化(3)・・・文書のフィールドを手動で暗号化する
を読んでくださいね。

さて、昨日は文書のプロパティを使って、一度保存した文書を暗号化するという事を行いました。
簡単にできて分かり易いのは良いのですが、一度文書を保存しないといけないというのが難点ですね。

今日はノーツDBにちょこっと細工を施すことで、文書の新規作成時から文書のフィールドを暗号化できるようにします。

利用するノーツDBは昨日の記事で作成したものを利用します。

細工を施す場所は、フォームの「MainTopic」です。
Domino Designerでこの「MainTopic」フォームを開きます。

そうしたら、下記のフィールドを任意の場所に追加します。
No.フィールド名フィールドの種類フィールドの種類説明
1SecretEncryptionKeysテキスト編集可能シークレット暗号キーの名前

下図は実際に追加した画面です。
フォームにフィールドを一つ追加

できたら、フォームを保存します。
これで終了です。なんとまぁ簡単ですね。

では、どのように文書を作成すれば良いのかを見ていきましょう。

なにはともあれ、新規に文書を作成します。
「タイトル」「カテゴリ」「本文」には適当にデータを入力します。

「暗号化データ」(AngouData)には、暗号化したいデータを入力します。
まだ、この時点では文書は暗号化されていないので、周りに見ている人がいないか、気にしながら入力してください(笑)


そして、「暗号キー」(SecretEncryptionKeys)フィールドですが、ここは、作成したシークレット暗号キーの名前直接入力します。

直接って・・・
ヘルプを見たのですが、シークレット暗号キーの一覧を取得する方法はどうも用意されていないようです。なんて面倒なんでしょう・・・
と、愚痴はさておき、ここは先日作成したシークレット暗号キーの名前である「test」と入力しましょう。

こんな感じで入力してみました。
新規文書の作成

では、文書を保存してみます。
一瞬ですが、ステータスバーに 「文書を暗号化します...」というメッセージが表示されます(メッセージは履歴として確認することができます(下図))。
文書を保存したときのステータスバー

どうやら文書の暗号化に成功したようです。
では、例によって文書を開きなおしてみましょう。

暗号キーを持っていないユーザが文書を開いた場合の画面です。
文書の復号に失敗

はい。ちゃんと暗号化データが見えないことが確認できました。


これで、「SecretEncryptionKeys」というフィールドにシークレット暗号キーの名前を入力することで、文書のフィールドを暗号化できるという事が分かりました。
これは予約フィールド名になっているので、このような動きをするのです。
文書の暗号化をしたくない場合は、このフィールドに何も入力しなければよいです。

また、存在しない暗号キーを入力して文書を保存しようとすると、下図のようにエラーが表示されますので、変な値を入力してデータが見れなくなってしまう!という心配は不要です。
存在しない暗号キーの名前を入力した場合

ちなみに・・・
昨日の記事で書いた、文書のプロパティで「シークレット暗号キー」を選択するという方法を紹介しましたが、あれも実は同じことをしているのです。
ですので、文書を保存すると、「SecretEncryptionKeys」というフィールドに格納されるんですね。

昨日のブログの最後の画像をよぉく見ると、「SecretEncryptionKeys」というフィールドがあるのが確認できます。


ヘルプを見ると、シークレット暗号キーの名前の管理は自分で行う必要がある感じです。
手動入力させたくないのであれば、フィールドをダイアログリスト等にして選択肢として保存しておくようにと書いてありました。



次回は、このブログらしくLotusScriptで文書の暗号化を行う方法を紹介します。
では、今日はこの辺で・・・







【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2015年2月6日金曜日

フィールドの暗号化(3)・・・文書のフィールドを手動で暗号化する

こんにちは。IBM ConnectED 2015が開催されていたアメリカから帰国して一週間。ようやく体調も日本風に慣れてきた感じがします。

今日も昨日の続きで、文書のフィールドの暗号化についてです。

記事を読み始める前に
にほんブログ村 IT技術ブログへ
をクリックしてくださいね。別ウィンドウで開くように設定してありますから、[戻る]をクリックするとかいう手間はありませんので、ぜひ気軽に押してください。


では、今日の話です。
昨日までの
フィールドの暗号化(1)・・・暗号キーを作成する
フィールドの暗号化(2)・・・暗号キーをマージする
で、暗号キーを作成することはできました。

そこで今日はサンプルDBを作成して、文書のフィールドを暗号化するという事を行ってみます。

まずは、サンプル用にノーツDBを作成しました。
フォーム名は「MainTopic」。
フィールドは下表のとおり。  
No.フィールド名フィールドの種類フィールドの種類説明
1Subjectテキスト編集可能タイトル
2Categoryダイアログリスト編集可能カテゴリ
3AngouDataテキスト編集可能暗号化するデータ
4CreatedUser作成者作成時の計算結果文書を作成したユーザ名
5CreatedDateTime日付/時刻作成時の計算結果文書の作成日時
6Bodyリッチテキスト編集可能本文
配置はこんな感じにしてみました。シンプルですね。



フォームのデザイン


暗号化したデータを格納するのは、「AngouData」というフィールドです。このフィールドは境界線が赤くなるので分かり易いでしょう。


ビューは・・・適当で良いので、勝手に作ってください。


暗号キーを使って文書のフィールドを暗号化するにはいくつかの方法があります。
今日はそのうち、プログラミングでもなんでもない、手動での方法を紹介します。


まずは普通に文書を作成します。
ここで、「AngouData」にはまだデータを入力しないでください。
※今回紹介する方法では、新規作成時には文書の暗号化を行うことができないようなのです。

その他のフィールドは適当に入力してください。
そうしたら、文書を保存します。

保存できたら、開きなおして編集モードにします。
この状態で文書のプロパティを開きます。
右から2番目のタブ(セキュリティ)を開きます。
文書のプロパティ

シークレット暗号キーという箇所があるので、そこの"レ"をクリックして、既に作成した「test」というキーを選択します。
シークレット暗号の選択

そうしたら、文書のプロパティを閉じて、「AngouData」フィールドに適当な値を入力して、文書を保存します。
これで文書のフィールドが暗号化されました。

実際に文書を開きなおしてみましょう。
まずは、文書を作成したユーザー本人が開いた時の画面です。
文書の復号化

暗号キーを持っていますので、当然暗号化されたデータを読むことができています。
ステータスバーにも「文書の暗号を解読します...」と表示されていて、暗号化データを復号化しているのが分かります。

次に、暗号キーを持っていないユーザーがこの文書を表示した場合です。
文書の復号化に失敗

暗号化フィールドが空白になっていて、データが表示されていません。
また、ステータスバーにも「キーがないために暗号化した文書の一部にアクセスできません」と表示されていて、暗号化データの復号に失敗したことが分かります。

ちなみに、この暗号化データは非表示になっているのではなく、きちんと暗号化されています。
ビュー上で文書のプロパティを見るとそれが分かります。
ビュー上で文書のプロパティを開いた

文書のプロパティの中に「AngouData」というアイテムがありません。代わりに「$Seal」や「$SealData」といったアイテムが作成されています。これらが暗号データを表しています。


どうでしょうか?
割と簡単ですよね。これを使いこなすと、重要なデータもノーツDBに安心して格納できるようになります。
クレジットカードの番号を入力しないといけないような場合などに良いでしょう。
(暗号キーはあらかじめ関係者に配布しておく)。


明日(というか月曜日??)は、違った方法で文書のフィールドを暗号化する方法をご紹介します。

では、今日はこの辺で・・・







【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2015年2月5日木曜日

フィールドの暗号化(2)・・・暗号キーをマージする

こんにちは。有言実行をモットーとしていませんが、今日は昨日の続きです。


昨日クリックしたからいいや。ではなく、今日も
にほんブログ村 IT技術ブログへ
をクリックしてください。1日1回でいいので、やってくださいね。一日一善のつもりでやれば、ほら、簡単でしょ(^^


では、早速。
昨日は、ノーツID内にシークレット暗号キーを作成して、それを他のユーザと共有するため、メール送信したところまで説明しました。

1.メールを受け取った人のメールビューです。
 赤枠の文書がシークレット暗号キー付きのメールですので、このメールを開きます。
メールビュー

2.メールを開くと、「メニュー["暗号キーの追加(K)..."]でIDファイルへ挿入してください。」とあるので、
[アクション][暗号キーの追加]メニューをクリックします。
メール文書を開いてみた

暗号キーの追加メニュー
3.「シークレット暗号キーの追加」というダイアログが表示されるので、キー名とコメントを確認して、問題なければ[追加]ボタンをクリックします。
シークレット暗号の追加ダイアログ
4.シークレット暗号キーの追加に成功すると、ノーツクライアントのステータスバーにメッセージが表示されます。
シークレット暗号キーの追加に成功した

5.念のため、ノーツIDにマージされているかを確認するので[ファイル][セキュリティ][ユーザーセキュリティ]メニューを実行します。

6.[IBM Notes データ][文書]タブをクリックして、文書の暗号化を表示します。
 マージしたシークレット暗号キーがあるのが確認できます。
ノーツIDの確認

これで、このユーザも暗号キーを使って暗号化された文書のフィールドを閲覧することができます。

と、ここまでが準備ですね(笑)。
明日からは、文書のフィールドを暗号化する方法について具体的に説明していきます。


ということで、今日はこの辺で・・・







【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2015年2月4日水曜日

フィールドの暗号化(1)・・・暗号キーを作成する

皆さん、こんにちは。暦の上では今日から春(今日は立春)です。
寒さの底をついたであろうという事で、気持ちもあたたかくいきましょう。

ということで、温かい気持ちを持ちながら、
にほんブログ村 IT技術ブログへ
をクリックしてくださいね。
たまに「記事は読んでるんだけど、ボタンは押してないんだよねぇ」と自白してくる方がいます(笑)。
・・・しっかりと押してください。このクリックがないと、記事が更新されないかもしれませんよ(笑)


では、気を取り直して今日の記事です。
折り返し地点まで来ました! でも少し触れましたが、Notesのメンテナンスリリースでは、XPagesアプリでフィールドの暗号化ができるようになります。

ここで、そもそもフィールドの暗号化ってどうやるの?
という疑問が出てきました。まぁ知ってはいたのですが、記事として書いていなかったので、ちょうどいいから記事にしてしまおうというものです。


なお、ここでいう暗号化はメールではなく、自作したノーツDBの指定したフィールドを暗号化することを指します。

まず、フィールドの暗号化を行うには、暗号キーが必要になります。
今日は、この暗号キーの作成手順を紹介します。

1.ノーツクライアントを起動します。
2.[ファイル][セキュリティ][ユーザーセキュリティ]メニューを開きます。
ユーザーセキュリティメニュー
3.ノーツIDのパスワード入力を求められたら入力します。
4.ユーザーセキュリティのダイアログが表示されるので、「IBM Notes データ」をクリックします。
ユーザーセキュリティダイアログ
5.すると、「IBM Notes データベース」と「文書」というサブメニューが表示されるので、「文書」をクリックします。
6.ユーザーセキュリティダイアログの内容が「文書の暗号化」に変わります。
7.[シークレットキーの作成]ボタンをクリックします。
ユーザーセキュリティ - 文書の暗号化
8.「シークレット暗号キーの作成」というダイアログが表示されるので、「シークレットキー」と「コメント」を入力して、[OK]をクリックします。
 ここでは、「test」という名前でキーを作成しておきます。
シークレット暗号キーの作成

※コメントは書いておかないと、後で「何のために作成したキー」なのかを忘れてしまいますので、是非書いておきましょう。

9.作成に成功すると、文書の暗号化の画面内にシークレットキー名が表示されます。
作成されたシークレットキーが表示されている

このシークレット暗号キーが作成されたノーツIDがあれば、文書のフィールドを暗号化できますが、これだと、本人しか暗号/復号できず、面白くもなんともありません。
そこで・・・
10.他のユーザと共有したいシークレットキーを選択した状態で、[シークレットキーの送信]をクリックします。
シークレットキーの送信をクリックする
11.「シークレット暗号キーをメールする」というダイアログが表示されるので、シークレット暗号キーを共有したいユーザを選択して、[送信]ボタンをクリックします。
シークレット暗号キーをメールする
なお、当然のことながら、宛先はノーツIDを持っているユーザーに限ります。
※「宛先」と「cc」があるけど、意味あるのかしら?「cc」は暗号キーを作成したけど、マージしなくてもいいからね。その代り暗号フィールドの値は見えないけど・・・って意地悪だなw

12.メールを送信する際に、さらに他の人に転送することを許可するかどうかのダイアログが表示されるので、キーの取り扱い方法を選択して、[OK]をクリックします。
シークレット暗号キーの制限
13.メールが送信されると元のダイアログに戻るので、[OK]をクリックして、ダイアログを閉じます。


といったところで、長くなりそうなので、今日はこの辺としておきます・・・
続きはまた明日。








【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ