Notesgrip

はじめに

Notes/Dominoは、ある意味カジュアルなDBシステムで、いろんな定型データを管理するのに重宝している。

人(アカウント)、モノ、ソフト、製品など、あらゆる情報をNotesにぶちこんでおくと、Notesのビューを工夫することで、情報の集計や分析などもある程度できる。

しかし、Notesの中だけでできることも限界があり、やはり情報を手元に取り出し、いろんな加工をしてこそ、Notes/Dominoを最大限に利用できるというものだ。

ここで紹介するNotesgripはRubyからNotesクライアントを制御して、Rubyを使ってNotes-DBへのアクセスを実現するものだ。

10年ほど前、Rubyを覚えたてのこと作ったRubydeDominoというライブラリがあるのだが、基本、これの作り直ししたもの。以下の手直しをしている。

基本的には、このような使い方をする。

  require 'notesgrip'
  ns = Notesgrip::NotesSession.new
  db = ns.database("technotes", "names.nsf")
  view = db.view("people")
  view.each_document {|doc|
    if doc['FullName'].text == "Administrator/tech"
      doc['HTTPPassword'].text = ns.HashPassword("password")
      doc.save
    end
  }
  

基本的なしくみ

Notesgripの基本的な仕組みを説明する。

WIN32OLEでNotesが用意するオブジェクトにアクセス

WIN32OLEを使うと、COM Interfaceを持っているアプリケーションをRubyから制御できる。

NotesクライアントもCOM I/Fを持っているので、WIN32OLEを経由して、いろいろできる。

基本は、WIN32OLE.new()を使って、Notesクライアントの一番根本となるオブジェクトを取得する。 その後は、そこから派生するNotesオブジェクトを取得して、そのメソッドを呼び出して、いろんな操作を行う。

Notesの場合、'Notes.NotesSession'というプログラムIDを指定して、WIN32OLE.newを呼び出すと、NotesSessionオブジェクトが手に入る。

  ns =  WIN32OLE.new('Notes.NotesSession')
  

その後は、このオブジェクトからNotesDatabaseを取得して、さらにそこからNotesView、NotesDocument、NotesItemのように芋ずる式に各種オブジェクトを入手できる。

各種オブジェクトにはそのクラスが用意している便利なメソッドが用意されていて、それを呼び出すことでいろんな操作ができる。

例えば、NotesSessionオブジェクトに対して、GetDatabase()というメソッドを作用させると、NotesDatabaseオブジェクトを取得できる。

  ns =  WIN32OLE.new('Notes.NotesSession')
  db = ns.GetDatabase("technotes", "names.nsf")
  

この機能を利用すると、NotesをRubyスクリプトから自由に制御することができ、Notes-DBに保持されているデータを取得できたり、変更したりすることができる。

Notesが用意しているメソッドを中継

Notesgripは、基本的にはNotesが用意しているCOM用の各種クラスをラップして、Rubyからのメソッド呼び出しをWIN32OLEで生のNotesのオブジェクトに中継しているだけ。

例えば、以下は、Notesgrip::NotesSession#HasPassword()というメソッドの定義だが、生のNotesSessionオブジェクトに中継して、戻り値のハッシュ化された文字列をかえしているだけ。 @raw\objectが生のNotesSessionオブジェクトになっている。

  def HashPassword(password)
    @raw_object.HashPassword(password)
  end
  

また、Rubyのmethod_missing()を使って、Notesgripで定義されてないメソッドを生のNotesオブジェクトに中継しているので、Notesが用意しているすべてのメソッドをNotesgripで定義しなくてもいい。 ただ、methods()ですべての使用可能なメソッドの一覧が出てこないのは、結局は全メソッドを定義することになりそう。

Notesオブジェクトを返すメソッドの対応

また、Notesが用意しているクラスのメソッドにはNotesオブジェクトを返すタイプのものもある。 このようなメソッドをすべて抽出して、Notesgripのオブジェクトにラップしてからオブジェクトを返すようにすれば、すべてのNotes関係のオブジェクトをNotesgripのオブジェクトのように扱えるので、 結構便利。

以下は、NotesSessionがNotesDatabaseオブジェクトを返す部分の定義。

  def GetDatabase(server_name, db_filename)
    raw_db = @raw_object.GetDatabase(server_name, db_filename)
    NotesDatabase.new(raw_db)
  end
  alias database GetDatabase
  

 

こんな感じ。このようにすべてのNotesオブジェクトをラップしてやると、以下のメリットがある。

Dominoのクラス構成

Dominoのほとんどの要素はクラスとして定義されていて、その要素を制御するためのメソッドや、各種属性を参照したり変更するためのプロパティが用意されている。

主なDominoのクラスを以下に示す。

ノーツの主なクラス構成

NotesSession

Dominoの実行環境というちょっと抽象的なものを示すクラス。COMでDominoを制御するときは、まず、NotesSessionオブジェクトを生成し、 ここから芋づる式に他の要素を示すオブジェクトを生成していく。

NotesDatabase

Dominoのデータベースを示す。

NotesView

データベース内のビューを示す。ビューとは文書の一覧のこと。「作成者別」や「日付順」、「システム別」などいろんな観点で文書を 並べ替えて表示するための要素。

NotesDocument

データベース内の文書を示す。

NotesDocumentCollection

1つ以上の文書の集合。ビューなどからある条件で検索した結果を示す。NotesDocumentの配列のようなもの。

NotesItem

文書内のフィールドを示す。フィールドとは、各文書内で文字列や値や時刻などを保持するデータ領域のこと。ビューにはフィールドの 値を表示することができる。

インストール

RubyGemsにおいてあるので、gem installで一発。

  gem install notesgrip
  

gemが使えないなら、一式をGitHubにおいてあるので、lib以下をRubyのライブラリパスのどこかにコピーすればいいだろう。

Notesgripのレクチャー

Notesgripを使ったプログラミングのレクチャー。

ライセンス

ライセンスはMITのライセンスに従います。

Copyright (C) 2014 Yac <notesgrip@tech-notes.dyndns.org>

This software is released under the MIT License, see LICENSE.txt.

免責事項

本プログラムは無保証です。作者は、プログラム自身のバグ、あるいは、本プログラムの実行など から発生するいかなる損害に対しても責任を持ちません。

変更履歴

2014/9/7

Initial Release