| 
本項では、本プロジェクトで開発したミドルウェア及び制約スプレッドシートについて詳述する。
1. Midichlorian: オープンミドルウェア
本節では、開発したオープンミドルウェアにおける各機能、各開発項目ごとに分け、それぞれについて詳述する。なお、本ミドルウェアをMidichlorian(ミディクロリアンと発音)
[8] と名付けた。以降本節では、Midichlorian という語を“開発したミドルウェア”の意味で使用する。
1.1 XML 表現形式の定義
10.進捗概要の1で述べたように、Midichlorian と接続先のシステム間ではXML 形式のデータによる通信を行う。そこで、開発にあたりスプレッドシート上のデータのXML
表現を定義する必要がある。一般的なスプレッドシート上に記述、配置することのできる情報には以下ようなものが存在する。
・セルの情報
-値
-数式
-書式情報など
・その他
-図形や画像など
-グラフなどのオブジェクト
本プロジェクトでは、上記の情報のうち値、数式のみを対象とし、XML 表現形式の定義を行った。数式に関しては、MathML [7]
を用いて記述する様に定義を行なった。図2 に本プロジェクトで定義を行なったXML 表現の例を示す。
本プロジェクトでXML 表現定義に含めなかった項目については、今後、表現方法を検討し、表現可能にしたい。
1.2 アドイン部
Midichlorian において、スプレッドシートの直接操作を行うモジュールをアドイン部と呼ぶ。本プロジェクトではMidichlorian
のExcel 及び、Calc からの利用を目標とし開発を行う。しかし、スプレッドシートの直接操作を行なうアドイン部はExcel
及び、Calc それぞれに依存せざるをえない。本プロジェクトでは、アドイン部を後に述べるプラグインマネージャと切り離して開発を行うことにより、共通のプラグインマネージャに対し、Excel
とCalc の双方から接続可能にする。したがって、アドイン部はExcel 用とCalc 用の2 つを実装する。
プラグインマネージャは、具体的には以下の機能を提供する。
・シート上の値、式を読み取り、1.1 節で述べたXML 形式への変換を行う(図2)。
・プラグインマネージャに接続し、上記のXML データを渡す。
・プラグインマネージャから処理結果のXML データを受け取り、シートへ反映する。
・上記一連の処理を制御するためのGUI を提供する(図3)。
・Midichlorian 特有の宣言をシート上に記述可能にするための、シート関数を提供する。
以下で、上記項目のうちアドイン部が提供するGUI およびシート関数について詳しく述べる。
図2:
スプレッドシートのXML 表現例
アドイン部が提供するGUI
アドイン部が提供するGUI であるツールバーのスナップショットを図3 に示した。ユーザはこのツールバーを操作することによりMidichlorian
を用いた一連の処理を制御することができる。ツールバーを用いたMidichlorian の操作の流れを下記に記述する。
1. まず最初に、ユーザはツールバーの1 番左側にあるボタンを押すことで、接続先システムにシート上のデータを渡し、もし、あれば最初の結果を受け取る。
2. 次に、左から2 番目の結果を何度か押すことで、他の結果を順に取得することができる。
3. もし現在受け取っている情報を破棄し、接続前の状態に戻す場合には左から3 番目のボタンを押す。この際、現在接続しているシステムからは切断される。
図3:
アドイン部が提供するツールバー
4.
現在取得してる結果を確定し、接続先システムと切断する場合には左から4 番目のボタンを押す。Excel 版のツールバーにあるドロップダウンメニューは、接続先システムの選択に使用される。図3
では“csheet”が選択されており、“csheet”というシステムが現在の接続先システムとして設定されていることを示している。
Calc 版ではツールバー上にドロップダウンメニューを表示するのが困難であったため、接続先の指定にはポップアップメニューを用いた。
アドイン部が提供するシート関数
Midichlorian を用いて他システムと接続を行う際、シート上のどのセル範囲を接続先に送信するか、ユーザが指定できた方が都合のいい場合が存在する。アドイン部は、この接続先に送信するセル範囲の指定を行うためにMidichlorian
関数を提供する。
一方、接続先システムに応じて開発者が独自のシート関数を定義できた方が都合がよい。これを実現するために、アドイン部はEmbed
関数を提供する。
以下で上記2 つの関数について、さらに詳しく述べる。
・接続先に渡す範囲を指定するMidichlorian 関数
他システムと接続の際、常にシート上のすべてのデータを渡すよりも、渡す範囲をユーザが指定できた方が都合が良い。これには、セキュリティ上の理由、ユーザビリティの理由、パフォーマンスの理由が考えられる。これを実現するために、アドイン部はMidichlorian
関数を提供する。ユーザは、接続先に渡したいセルの範囲をMidichlorian 関数の引数として指定することでその範囲だけを接続先に送信することができる。
・任意の式を記述するためのEmbed 関数
後で述べるように、Midichlorian を用いて何らかのシステムとスプレッドシートとの接続を実現したい場合、開発者はプラグインの開発を行えばよい。さて、その際、開発者が独自のシート関数を定義したいと考える場合があるだろう。例えば、HTTP
を用いた接続を行なうプラグインを開発するのであればURL という関数を定義したいと思うだろうし、メールを使った接続を行うプラグインであればMailaddress
という関数を定義したいと考えるかもしれない。しかし、例えばExcel に対し、シート関数を追加するためには、VBA のプログラムを書かねばならず、Calc
に対し、シート関数を追加するためにはUNO コンポーネントを作成する必要がある。
Midichlorian では、アドイン部でEmbed と呼ばれる関数を提供することで、VBA やUNO を用いた開発を行なわなくても任意の関数を記述できるようにしている。ユーザは、Embed
関数の第一引数の本当の関数名、第二引数以降に本当の引数を記述することで、任意の関数を記述できる。たとえば、Embed(”MYFUNC”,1,
A1) と記述することで、Midichlorian ではMYFUNC(1, A1) と解釈し、接続先に渡す。
1.3 プラグインマネージャ
Midichlorian を利用してスプレッドシートと他のシステムを接続するためには、接続先システムに応じたプロトコル、データ形式を用いて接続する必要がある。 Midichlorianではこれをプラグインで行なう。したがって、Midichlorian
を用いて何らかのシステムとスプレッドシートとの接続を実現するためには、プラグインを開発し、Midichlorian に組み込めばよい。プラグインは次のファイルから構成される。
・決められた型を持つ4つのAPI を実装したダイナミックリンクライブラリ
・API の関数名などを記述したプラグイン定義XML ファイル
・スプレッドシートをXML 化したデータを、接続先システムに応じたXML に変換するXSL ファイル
・接続先システムの処理結果を表すXML データをスプレッドシートのXML 表現に変換するXSL ファイル
このプラグインの管理を行い、スプレッドシート側からの要求に応じて適切なプラグインを用いて他システムと接続を行うモジュールがプラグインマネージャである。プラグインマネージャは次のような処理を行う。
・アドイン部から渡されたスプレッドシートのXML 表現をプラグインが持つXSL で変換する。
・プラグイン定義ファイルを元に、XSL で変換されたXML をダイナミックリンクライブラリに渡す。
・ダイナミックリンクライブラリから返された結果をXSL で変換する。
・アドイン部へ処理結果のXML データを渡す。
2.CSheet:
制約スプレッドシート
本節では、Midichlorian を用いてスプレッドシートと制約解消システムを接続することにより、実現した制約スプレッドシートについて述べる。制約スプレッドシートとはスプレッドシート上で制約プログラミングを行うものである。
制約スプレッドシートの説明を容易にするために、本章ではまず制約プログラミングについて述べる。次に、制約スプレッドシート実現のために実装したC++上の制約プログラミングライブラリCream++について述べる。最後に、Cream++
[4] と接続をするためのプラグインについて述べ、成果として得られた制約スプレッドシートについて、問題記述方法の例などを取り上げながら記述する。
なお、本開発で実現した制約スプレッドシートをCSheet(シーシートと発音)と名づけた。本報告書では、「開発した制約スプレッドシート」の意でCSheet
という語を用いる。
2.1 制約プログラミング
制約プログラミングとは、問題を変数と変数間の集合として定義し、後は制約ソルバに解を求めさせるという問題解決手法である。制約プログラミングの特徴をまとめると以下のようになる。
・制約の集合で表すことのできる問題一般を扱うため、汎用性が高い。
・ユーザは解法をプログラムする必要が無いため、問題のモデル化に専念しやすい。
・プランニングやスケジューリングなど、幅広い応用分野を持つ。
・処理にかかる計算量が大きい。
近年、制約プログラミングは注目を集めており、商用の制約ソルバなども登場してきている。また最近では、ERP やSCM 等の分野で実社会の問題にも応用されてきている。
2.2 Cream++: C++上の整数制約プログラミングライブラリ
Cream++はC++の構文で自然な制約プログラミングを行うための整数制約プログラミングライブラリである。Cream++は、田村直之氏(神戸大学)、大西秀志氏(神戸大学)らによって開発されているJava
上の整数制約解消系Cream [3] の強い影響の下、開発を行っている。Cream++には以下のような特徴がある。
・C++の構文で自然に制約を記述可能
Cream++では、演算子のオーバーロード等を活用し、C++の構文で自然に制約問題を記述することができる。Cream++を用いた制約プログラミングでは、変数はC++の変数と同様に定義することができ、変数の算術演算や等式や不等式を用いた関係制約もC++の演算子をそのまま用いることができる。これにより、制約問題記述のために新しい言語習得をする必要はなく、C++の知識があれば容易に制約プログラミングを行なうことができる。また構文エラー等の検出はC++のコンパイラに任せることができる。Cream++を用いて鶴亀算の記述を行なった例を付録A
に掲載した。
・XML インターフェイスを持つ
Cream++はXML インターフェイスを持つため、Web サービス等のXML データを内部で用いるシステムとの親和性も高い。またCream++では他の処理系との連携も考慮し、数式の表現にはMathML
[7] を用いている。これにより、他の数式処理系などで処理した結果をMathML で受け取り、XSLT などで変換を行ない、Cream++で制約問題として解くなどの連携が容易になると考えられる。
・ソースレベルで処理系依存がほとんどない
Cream++では、できるだけANSI C++に準拠し開発を行った。また、OS やコンパイラに依存するAPI も一部を除き使用しておらず、移植性が高い。また、前述のXML
インターフェイス実装のためにはXerces-C++ [12] およびXalan-C++ [11]を用いており、MSXML のように処理系に依存したライブラリ等の使用も極力避けた。現時点で動作が確認されている処理系のリストを付録C
に掲載した。
・小数定数をそのまま利用可能
Cream++は整数制約プログラミングライブラリであるため、変数の領域(ドメイン)は整数に限られるが、定数に限り、小数をそのまま記述することができる。これにより消費税計算など
なおCream++はオープンソースソフトウェアとしてAPI ドキュメントとともに無償で公開されている[4]。
2.3 CSheet
プラグイン
CSheet は、本プロジェクトで開発を行ったMidichlorian を用い、前節で述べたCream++を接続することにより実現した制約スプレッドシートである。
ここで、本プロジェクトにおけるCSheet の開発はCream++との接続をするためのプラグインを開発することに他ならないが、具体的には以下の項目(プラグインの構成要素。1.3
節参照)について開発を行った。
・プラグイン定義ファイルの作成
プラグイン定義ファイルの内容を図4 に示す。このXML では、モジュール名(module)、DLL ファイル名(libfile)、DLL
中で接続に使用するAPI 名(api)及び、XML形式の相互変換に用いる2 つのXSLファイル名(sourcexsl、resultxsl)の指定を行っている。
図4:
プラグイン定義XML
・スプレッドシート上のデータのXML
表現を、XML 形式で表現された制約問題に変換するXSL(source.xsl)スプレッドシートからはシート上のデータがすべてXML
化されて送られてくるため、その中から制約変数として扱うセル、制約式として扱う式を抽出する。まず、シート中に記述された式で参照されているセルをすべて変数として抽出する。次にシート中に記述された式の中でCream++が扱うことのできる式だけを抽出する。これらをまとめ、制約問題を表すXML
になるように変換を行う。
・Cream++が発見した解を表すXML をスプレッドシートを表すXML に変換を行なうXSL(result.xsl)Cream++から返されるXML
では、変数として渡された各セルのアドレスになっている。そこで、変数名をアドレス、変数への値の割り当てをセルの値となるようにXML
を構築するような変換を行う。図5 はCream++が制約問題を解いた結果として返す解の例であるが、この解は変換によってセルA1
に10 が、セルD3 が2 になるようなXML に変換され、スプレッドシートに反映される。
2.4
CSheet の機能
先に述べたようにCSheet を含む制約スプレッドシートとは、セルを変数と見立ててそのセル同士の関係をシート関数として記述することによりスプレッドシート上で制約プログラミングを行うシステムである。本節ではCSheet
の機能について、使用例を挙げながら述べる。
図5:
Cream++が返す解の例
図6
にCSheet で鶴亀算の問題を定義した例を示す。B2 及び、B3 は問題の答えを入れるための変数セルとする。C2 及び、C3
は鶴と亀それぞれの足の数を表すセルであり、(鶴の足の数) = B2 ? 2 及び、(亀の足の数) = B3 ? 4 が入力してある。B4
及び、C4 には頭の数の合計数10 と足の数の合計数24 が定数として入力されている。B5 及び、C5 にはそれぞれ頭の数に関する制約及び、足の数に関する制約が記述してある。C6
のセルには制約ソルバに渡すべきセルの範囲B2:C5 が記述されている。ここまで入力したところで図3 に示したツールバーの接続ボタン(図中左端)を押すことでこの問題の解が求まり,シートに反映される(図7)。
次に、図8 に文房具購入案を算出する例を示す。この例で、D2:D5 の範囲が各商品の購入数であり、求めたい値である。E2:E5
の範囲には各商品ごとにかかる費用を表す式が入力されており、F1:F5 の範囲には購入数の非不条件が入力されている。G2 及び、G4
には各商品の購入に関する制約が記述されており、E6 には購入にかかる費用の合計値(各商品の購入費用の合計£ 消費税)を表す式が入力されている。また、G6
には予算に関する制約が記述されている。この状態で先ほどの例と同様に図3 の接続ボタンを押すと解が求まり、シートに反映される(図9)。
図6:
CSheet の例(鶴亀算
図7:
図6 の問題の解
ここで、E6
に入力された式に小数が含まれているところに注意していただきたい。本来、CSheet で解くことのできる問題は整数制約問題であり、小数を含む問題を扱うことができないが、CSheet
では定数に限り小数を直接記入可能にしてあり、消費税計算など小数を含む経理計算等を扱う際にも自然に記述することができる。次に、先ほど求めた購入案(図9)を実施に移そうと思ったところ、あいにくボールペンが2
本しか手に入らなかったとする。そこで、とりあえず手に入るボールペン2 本は購入し、他の物品をいくつずつ購入すればよいか再計算をしたい。この場合、D2
に定数2 を入力し、再度図3 の接続ボタンを押す。すると、D2 に入力された2 という値はそのままにし、他の商品の購入案を再計算して解が反映される(図10)。
このように、CSheet では値が入力されているセルは定数、入力されていないセルは変数として扱う。このような使用をすることにより、会計案を生成後、確定したところから値を固定し、残りを再計算するなどの利用ができる。
図8:
CSheet の例(文房具購入リスト)
図9:
図8 の解
|