ソフトウェアの更新管理システムについての研究

06kc110 星野 佑介
指導教員 坂本 直志 准教授


目次

  1. 1. はじめに
  2. 2. 基礎知識
  3. 3. 関連事項
  4. 4. 仕様
    1. 4.1. 要求仕様
    2. 4.2. XML分析
      1. 4.2.1. 扱うDOM
      2. 4.2.2. 更新に必要なXML要素
      3. 4.2.3. XMLの設計
      4. 4.2.4. 更新管理ソフトの処理の流れ
    3. 4.3. プログラムの説明
    4. 4.4. XML Schemaの作成
    5. 4.5. 評価
      1. 4.5.1. 評価の手順
      2. 4.5.2. 結果
  5. 5. まとめと課題
  6. 6. 参考文献
  7. 7. 付録

1. はじめに

現在、Windowsを搭載したコンピューターに市販のソフトウェアを導入する際には、 インストーラーと呼ばれる専用の実行ファイルを用いてインストールを行うものが多い。 しかし、個人製作のソフトウェアでは、LZHやZIPといった書庫ファイル形式で配布し、 ユーザーが任意の場所に展開を行うことでインストールを行うという方式を採用しているものが数多く存在する。 また、新しいバージョンのソフトウェアが配布された際には、 その更新処理を各ソフトウェアが持つ独自の更新機能を使って行うものが多く、一元的に管理ができないという欠点がある。

これに対してLinuxでは、ソフトウェアを構成するファイル群を「パッケージ」として捉え、 コンピューター上にインストールされているパッケージと、パッケージの配布元に配置されている「メタデータ」と呼ばれる、 ソフトウェアについての情報を記述したデータを比較し、ソフトウェアの追加、更新、削除といった管理を行う「パッケージ管理システム」というものが存在する。 本研究では、このシステムをWindows上でも実現できないかと考え、 インストール・更新作業を容易にするソフトウェアを制作するにはどのような処理が必要かを検討し、テスト実装と評価を行った。

2. 基礎知識

この章では、更新管理システムにおいてよく使われる用語を説明する。

<?xml version="1.0" encoding="utf-8"?>
<itemlist>
    <item>
        <name>りんご</name>
        <breed>ふじ</breed>
        <price>200</price>
    </item>
</itemlist>

図1.サンプルXML

サンプルXML文書のDOMツリー構造

図2.サンプルXML文書のDOMツリー構造

3. 関連事項

ここでは、現在実用化されている更新管理システムやインストーラーの例を取り上げる。

4. 仕様

前章までの仕組みをもとに、Windows用のユーザーが自由に利用できるソフトウェアパッケージの更新管理ソフトを試作した。

4.1. 要求仕様

本論文では、標準で用意されているAPIが豊富にあり、実装の追加や変更が容易に行えるという観点から、Java言語にて作成することにした。例えば、作成するソフトウェア(以後、更新管理ソフトと呼ぶ)にはインターネット上からXMLファイルを取得する処理が含まれているが、 TCP/IPやHTTPの接続に必要なコードを書く必要がなく、関数の引数に取得するファイルのURIを与えるだけで処理が実現できる専用のAPIが用意されている。開発環境は、Java SE Development Kit 6、Eclipse 3.5、Eclipse用Visual Editorプラグインを用いた。また、GUI部には、SWTを用いることにした。 SWTには、描画処理の多くをOSネイティブのコードを用いることにより実現するので、高速で、メモリの使用量が少なく、また、見た目や操作感をOSネイティブのものに近づけやすいというメリットがある。

さて、更新管理ソフトにおけるバージョンの確認方法は、管理対象のソフトに関する情報を記したメタデータファイルの参照と比較を行うことで、更新があるかどうかを調べるものとした。 このメタデータはXML形式のファイルとする。構造が自由に設計でき、そのままでも可読性があり、手作業で内容の確認や変更が容易に行えるためである。

メタデータファイルはアーカイブ内に含めず、別途用意することにした。これにより、ソフトの配布元は新たにソフトを収録するアーカイブやパッケージを用意したり、あるいは既にあるアーカイブに変更を加える必要はなく、メタデータファイルを新たに追加するだけでこの方法を適用できる。 さらに、ソフト本体の収録されたアーカイブファイルを手動で配布元のサイトからダウンロードし、展開する方法と共存できる。これに加えてユーザーには、手動でダウンロード・展開する方法と、本研究で用いる方法とを好みで選択する自由を与えることができる。

このような仕様により、メタデータの配布者は管理対象のソフト本体の開発者・配布者と同一である必要は無くなり、単にそのソフトに興味があったり、更に普及させたいという思いを持つ第三者であっても、メタデータの配布者になることができる。 そのような配布者は、必要な情報を用意し、それをメタデータとしてインターネット上に公開することで、この仕組みが成り立つという利点がある。

想定する更新処理の全体の流れを示す。

4.2. XML分析

更新管理ソフトが扱うXMLドキュメントに必要な処理の流れと構成を考える。

4.2.1. 扱うDOM

更新管理ソフトでは、XMLのデータ形式を扱うためにDOMを使用する。 ここでこの更新管理ソフトがDOMとして扱うと想定されるXMLドキュメントは、インストールされているソフトの情報を格納したローカルにあるドキュメント、配布するソフトの情報を格納しているサーバー側のドキュメント、さらに更新ソフトの内部で処理を行うための作業用のドキュメントの3つが必要であろう。 なお、ローカル側のドキュメントにはインストールされているソフトの情報だけを持つものとする。また、更新ソフトの内部処理用のドキュメントは、ローカル側とサーバー側のソフトの情報を統合した情報とユーザーインターフェース側で設定した情報を記録する役割を持つ。 さらに、ユーザーインターフェース側で設定した情報を持つDOMオブジェクトは、処理が完了した時点で設定情報をファイルとして書き出すことが出来るようにした。

4.2.2. 更新に必要なXML要素

更新を行うためには、ソフトの情報を取得し、それを蓄積する必要がある。3章の実用化されている管理システムで使われている管理情報をもとに、更新のために必要な項目を選定した。項目は以下のとおりである。

UUIDと、バージョン番号は、ローカル側、サーバー側両方に最低限必要となる属性である。

UUIDは、管理対象となるソフトを特定するための識別子で、ソフトの判別に用いる。2つのソフト間のIDが異なる場合はそれぞれ別のソフトとして扱われる。このため、複数のメタデータ配布者が存在する場合には、何らかの手段を用いて、各配布者間でIDの相違が起こらないように注意する必要がある。 また、2つの異なるソフトが同一のIDを持つことはできないものとする。ソフト名自体を判別に用いる方法も考えられるが、同一のソフト名が存在した場合は、混同が起きてしまうので、管理に支障が起きる。

バージョン番号は、現在インストールされているソフトが最新のものであるか比較を行う際に用いる。書式は、ピリオド(".")でバージョン番号を区切る。 比較は先頭からピリオド毎に区切り、辞書順に行うものとする。ローカル側のバージョン番号よりもサーバー側のバージョン番号が大きい場合、最新バージョンがあると判定する。

ソフト名、コメント、作者名は、そのソフトの詳細をユーザーインターフェイスに表示させるためのものであり、更新処理に直接影響を与えることはないものとする。

作業用ドキュメントでは、ソフトのメタデータに加え、ローカルにソフトがインストールされているか区別する情報やユーザーが設定した情報を保持しなければならないので、

これらの2つを作業中のみ用いる要素として、作業用ドキュメントへのメタデータ取り込み時に追加を行うことにした。

4.2.3. XMLの設計

一つのメタデータファイルの中に複数のソフトの情報を記すことができるものとする。一つのソフトについての情報をひとまとめにする要素が必要となるので、ここではitemという親要素を作成することにした。UUIDは、複数あるitem要素に区別をつける目的と、DOMのノードをたどっていくときに、1つのitem要素ごとに下の階層を探索すると手間がかかるので、item要素の属性とした。

itemの子要素として、各ソフト毎に必要な情報を要素として配置する。

必要な情報 XMLドキュメントで用いる要素
ソフト名 softname
バージョン version
URI uri
コメント desc
作者名 author
インストール状況 status
設定した操作 operation

図7にDOMツリーの構造を示す。

DOMツリー構造

図7.DOMツリー構造

4.2.4. 更新管理ソフトの処理の流れ

次に、更新管理ソフトが行う処理の流れをドキュメントに注目して説明する。

  1. 起動時にローカル側に登録されているソフトの情報を読み込む。このとき、内部に作業用のXMLドキュメントを作成し、読み込んだローカル側のXMLドキュメントをコピーする。
  2. ここで、作業用のXMLドキュメントに対して既にインストールしているかを判別する要素と、ユーザーが選択した操作を保存する要素の2つの作業用要素を追加する。
  3. ユーザーが、新規に取得またはアップデートしたいソフトの情報が記されたXMLファイルのURIを指定すると、そのURIにあるXMLファイルを取得し、解釈を行う。
  4. 取得したXMLドキュメント(サーバー側のドキュメント)に作業用要素を追加する。
  5. サーバー側のドキュメントと作業用ドキュメントの統合を行う。サーバー側のドキュメントに書かれているソフトのUUIDを検索キーとして作業用ドキュメントから検索を行う。 UUIDが一致した場合は、バージョンの比較を行う。サーバー側ドキュメントに記されているソフトのバージョンが新しいと判定された場合は、作業用ドキュメントの該当するソフトの部分を書き換える。 UUIDが一致しない場合は、作業用XMLドキュメントにソフトの情報を追加する。
  6. ドキュメントの統合が完了したら、リストやマップに内容を反映させるため、再度作業用のXMLの解釈を行う。
  7. 解釈が完了したら、GUIのリストボックス部にソフト名のリストを表示させる。
  8. ユーザーがリストボックス内のソフト名を選択すると、選択したソフトの詳細情報を作業用ドキュメントから読みだし、GUIに表示させる。
  9. ユーザーが、ソフトを更新するか、もしくは、既にローカル側に登録されている場合には、削除するかどうかの選択を行う。このときに選んだ選択肢を作業用要素に保存する。
  10. ユーザーが更新管理ソフトに更新を指示すると、XMLドキュメント内に示されたそのソフトのアーカイブファイルが置かれているURIからダウンロードを行う。
  11. 更新処理が完了した時点で、作業用のXMLドキュメントから、インストールしたソフトの情報を取り出し、ローカル側のXMLドキュメントに記録する。

XMLドキュメントに着目した処理の流れを図8に示す。

XMLドキュメントの時系列の処理の流れ

図8.XMLドキュメントの時系列の処理の流れ

4.3. プログラムの説明

前章までの仕様から、図8の「統合処理」までを行うプログラムを作成した。本章では作成したプログラムの説明を行う。

要求仕様(4.1.章)でGUI部にSWTを使用すると述べたが、SWTはOSネイティブの見た目に近づけられる分、動作対象のOSのAPIに依存する部分があり、SWTで構成されたオブジェクトにはJavaの特徴の一つである自動ガベージコレクション(不要になったメモリ領域を自動的に開放する作業のこと)が適用されない。 そのため、SWTを用いる部分で不要なメモリ領域が出た場合は、disposeメソッドを用いて明示的にメモリ領域の解放を指示しなければならない。

作成したプログラムでは、ソフト名リストや各情報を表示するメインウィンドウと、サーバー側のドキュメントのURIを入力するウィンドウの2つのウィンドウを作成した。SWTには、AWTやSwingと同様にレイアウトマネージャがいくつかあるが、各ウィジェットを格子状にレイアウトするGridLayoutを用いた。

4.4. XML Schemaの作成

読み込むXML文書の妥当性検証を行うため、XMLスキーマを作成する。作成したXMLスキーマは7章に示した。

以下に、更新管理ソフトに読み込ませるXMLファイルに必要な条件を挙げる。

ここから、読み込むXML文書の構造を定める。読み込むXML文書のルート要素はsoftwareupdateである。element要素で、name属性に要素名であるsoftwareupdateを指定する。

softwareupdate要素はitem要素という子要素を持つ。XML Schemaではデータ型と呼ばれる概念があり、子要素の形態によりデータ型が異なる。

単純型
子要素及び属性を持たない要素のデータ型、あるいは属性値のデータ型
複雑型
子要素または属性を持つ要素のデータ型

ここでは複雑型となるので、複雑型であることを示すcomplexType要素を指定する。

次のsequence要素は子要素の順序を設定するものである。sequenceは上から記述した順番で子要素を記述しなければならないという決まりを指定する。

次にitemの子要素を指定するが、複雑なためref属性を用いた。ref属性は参照を表すもので、属性値に指定した要素名と同じものをname属性に持つelement要素を参照する。 この場合、element属性で、属性値にitemを指定したものの設定を参照することになる。また、ここでmaxOccurs属性を用いて出現回数を設定する。item要素は何度用いても良いという仕様なので、制限なしを示す"unbounded"を値に指定する。

softwareupdate要素の子要素はitem要素以外ないので、閉じタグを用いて一旦指定を終わらせる。

4.5. 評価

4.5.1. 評価の手順

作成したプログラムを実際に動作させ、正しく処理が出来ていることを確認する。

ここではtest_3.xmlをサーバー側のメタデータファイル、meta_local.xmlをローカル側のメタデータファイルに見立てて、ローカル側のメタデータファイルを読み込んだ後、サーバー側のメタデータファイルを統合する処理を行う。 それぞれのファイルの内容は付録(7章)に示した。

バージョン番号の比較処理を確認するために、サーバー側のファイルには、ローカル側のファイルに記載されている内容とバージョン番号だけ異なるものや、ローカル側のファイルに記載されていないソフトの情報を記載した。相違点をまとめると、

正しく処理されていれば、ローカル側がそのソフトの情報を持っていないか、ローカル側よりもサーバー側のほうが新しい(つまり、サーバー側の方がバージョン番号が大きい)場合に作業用ドキュメントの持っている該当するソフトの内容が、 サーバー側のデータで追加または書き換えられる。

つまり、統合処理後の作業用ドキュメントの内容は、ソフト2の情報がサーバー側の情報で書き換えられており、ソフト4の情報が追加されていれば正しいことになる。

また、統合処理後には作業用要素(status、operation)が全てのitem要素の子要素として追加されているはずである。

以下に具体的な手順を示す。

  1. C:\updt\ディレクトリに、test_3.xmlと、XMLスキーマファイルtestschema.xsdを配置する。
  2. Eclipseのワークスペースフォルダ内のプロジェクトが格納されているフォルダに、meta_local.xmlを配置する。
  3. Eclipseでプロジェクト内のUpdaterクラスを選択し、実行ボタンを押す。
  4. この時ローカル側のファイルが読み込まれ、表示されたウィンドウ上に読み込まれた情報が表示されるので、リストボックスを選択して正しく読み込まれているか確認する。
  5. 次に、メニューバーの「ファイル」を選択し、「Open URI」を選択する。URIを入力するウィンドウが表示されるので、"file:///c:/updt/test_3.xml"を選択し、実行ボタンを押す。 キャンセルボタンを押してウィンドウを閉じる。
  6. リストボックス内の項目を選択し、正しく情報の更新が行われていることを確認する。
  7. また、Eclipseのワークスペースフォルダ内のプロジェクトが格納されているフォルダにtemp.xmlが出力される。このファイルは、統合処理が完了した後の作業用ドキュメントの内容を書き出したものである。 このファイルをテキストエディターで開き、正しく情報の更新が行われていることと、XMLの構造が正しく保たれていることを確認する。

4.5.2. 結果

手順(1)、(2)の通りにファイルを所定の位置に配置し、Eclipse上で作成したソフトを実行した。実行画面を図9に示す。リストボックスにローカル側のファイルに記載されているソフト名の一覧が表示された。 また、ソフト名を選択するとそのソフトの情報が表示されることが確認できた。

次に手順(4)〜(6)を実行した。このときのスクリーンショットを図10に示す。リストボックスに「ソフト4」の項目が追加された。 また、「ソフト2」を選択するとサーバー側のファイルの情報が表示された。「ソフト1」「ソフト3」には変化がなかった。

更新用ソフト起動時のスクリーンショット

図9.更新用ソフト起動時のスクリーンショット

手順(6)時のスクリーンショット

図10.手順(6)時のスクリーンショット

最後に手順(7)を行った。結果を以下に示す。インデントにずれがあるものの、XML構造は正しく、作業用要素であるstatusとoperationが追加されていることが確認できた。 また、ソフト2とソフト4はサーバー側の内容、ソフト1とソフト3はローカル側の内容が保存されていた。

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<softwareupdate>
    <item uuid="8c349fdd-af4b-4eda-8184-93b1aad653b9">
        <softname>ソフト1</softname>
        <version>1.0.0</version>
        <uri>http://www.hogehoge1.com/</uri>
        <desc>説明欄です</desc>
        <author>作者A</author>
    <status>1</status>
<operation>0</operation>
</item>

    <item uuid="247972df-838b-4044-850c-a11c31ea3eac">
        <softname>ソフト2</softname>
        <version>1.1.1</version>
        <uri>http://www.hogehoge2.com/</uri>
        <desc>説明欄です</desc>
        <author>作者B</author>
    <status>2</status>
<operation>0</operation>
</item>
    
    <item uuid="bff3d373-cfe1-4a03-9dee-c778c04d3178">
        <softname>ソフト3</softname>
        <version>1.0.0</version>
        <uri>http://www.hogehoge3.com/</uri>
        <desc>説明欄です</desc>
        <author>作者C</author>
    <status>1</status>
<operation>0</operation>
</item>

<item uuid="9e6ed6e3-fd84-42cd-b847-da90adf1d13f">
        <softname>ソフト4</softname>
        <version>2.0.0</version>
        <uri>http://www.hogehoge4.com/</uri>
        <desc>説明欄です</desc>
        <author>作者</author>
    <status>2</status>
<operation>0</operation>
</item>
</softwareupdate>

以上より、正常に統合処理が出来ていることが確認できた。

5. まとめと課題

本論文では、更新管理ソフトの動作の仕組みや、更新ソフトが持つメタデータの構造を分析し、それを参考にWindows用更新管理ソフトを作成するにあたって必要な要素を考察した。

また、Java言語と、DOM、XML SchemaなどのXML関連技術を用いて更新ソフトを試作し、更新動作時に必要となる、メタデータの比較と書き換えの処理を実現させることができた。 ユーザーはSWTを用いたGUI画面によって、更新処理の操作を行うことができるようになった。

本論文で作成したソフトでは以下のような課題が生じた。

6. 参考文献

  1. [1] Debian JP Project - Debian ポリシーマニュアル
    http://www.debian.or.jp/community/devel/debian-policy-ja/policy.ja.html/
  2. [2] (株)ネットワールド/相浦 裕子、三田村 あずさ: InstallShield公認ガイドブック 〜MSI インストーラ開発〜、アスキー、2008年
  3. [3] Windows Installer XML (WiX) v3.0 Help
    http://wix.sourceforge.net/manual-wix3/main.htm
  4. [4] WiXではじめるWindows Installer作成入門 :CodeZine(コードジン)
    http://codezine.jp/article/corner/15
  5. [5] @IT SEのためのXML Schema入門
    http://www.atmarkit.co.jp/fxml/rensai2/schema01/schema01.html
  6. [6] @IT XML Schemaで順不同の出現を定義する
    http://www.atmarkit.co.jp/fxml/tecs/036xsd/36.html

7. 付録

ソースコード・メタデータ・XML Schemaファイル(updater.zip)