(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-08-05
(45)【発行日】2022-08-16
(54)【発明の名称】ライセンス検証装置
(51)【国際特許分類】
G06F 21/10 20130101AFI20220808BHJP
G06F 21/44 20130101ALI20220808BHJP
【FI】
G06F21/10
G06F21/44
(21)【出願番号】P 2020536852
(86)(22)【出願日】2018-01-04
(86)【国際出願番号】 KR2018000162
(87)【国際公開番号】W WO2019135425
(87)【国際公開日】2019-07-11
【審査請求日】2020-12-25
(73)【特許権者】
【識別番号】516014409
【氏名又は名称】ライン プラス コーポレーション
【氏名又は名称原語表記】LINE Plus Corporation
【住所又は居所原語表記】11th Fl.,42,Hwangsaeul-ro 360beon-gil,Bundang-gu,Seongnam-si,Gyeonggi-do.13591
(74)【代理人】
【識別番号】100107766
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【氏名又は名称】伊東 忠彦
(74)【代理人】
【識別番号】100135079
【氏名又は名称】宮崎 修
(72)【発明者】
【氏名】キム,テウ
(72)【発明者】
【氏名】チョン,ミョンジュ
(72)【発明者】
【氏名】ジョン,サンフン
【審査官】田名網 忠雄
(56)【参考文献】
【文献】米国特許出願公開第2007/0294179(US,A1)
【文献】米国特許出願公開第2014/0115720(US,A1)
【文献】中国特許出願公開第103473346(CN,A)
【文献】韓国登録特許第1214893(KR,B1)
【文献】米国特許出願公開第2017/0372072(US,A1)
【文献】特開2013-065168(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 21/10-21/16
G06F 21/44
G06Q 99/00
(57)【特許請求の範囲】
【請求項1】
ライセンス検証装置であって、
ソフトウェアをダウンロードする段階、
前記ダウンロードされたソフトウェアから
メソッドの呼び出しの仕様に関する情報であるメソッド呼び出し情報を抽出する段階、
前記抽出されたメソッド呼び出し情報を利用して予め設定されたコード形態のパターンを生成する段階、
前記生成されたパターンを前記ダウンロードされたソフトウェアの識別子と連携させてデータベースに格納する段階
を実行する手段を含むことを特徴とする、ライセンス検証装置。
【請求項2】
前記メソッド呼び出し情報は、特定のメソッドを呼び出すために要求される情報として、Javaコードにおけるクラス経路名、クラス名、およびメソッド名を含むことを特徴とする、請求項1に記載のライセンス検証装置。
【請求項3】
前記予め設定されたコード形態は、アンドロイドアプリケーションのためのパッケージファイルであるAPKファイルで使用されるsmaliコード形態を含み、
前記パターンは、前記smaliコード形態でメソッドを
呼び出すための仕様に関する前記メソッド呼び出し情報を含む形態で生成されることを特徴とする、
請求項1又は2に記載のライセンス検証装置。
【請求項4】
前記実行する手段は、
検査の対象となるパッケージファイルの入力を受ける段階、
前記パッケージファイルの実行ファイルを抽出する段階、
前記抽出した実行ファイルを前記予め設定されたコード形態に変換する段階、
前記予め設定されたコード形態に変換された実行ファイルからメソッド呼び出し情報を抽出する段階、および
前記抽出されたメソッド呼び出し情報と前記データベースに格納されたパターンとを比較する段階
をさらに実行することを特徴とする、請求項1~3のうちの何れか1項に記載のライセンス検証装置。
【請求項5】
前記比較する段階は、
前記予め設定されたコード形態に変換された実行ファイルから抽出されたメソッド呼び出し情報を含むパターンを前記データベースから検索することを特徴とする、請求項4に記載のライセンス検証装置。
【請求項6】
前記実行する手段は、
前記予め設定されたコード形態に変換された実行ファイルから抽出されたメソッド呼び出し情報を含むパターンが前記データベースに存在する場合、前記パターンと連携されて前記データベースに格納されたオープンソースソフトウェアの識別子、および前記オープンソースソフトウェアで使用するライセンスの識別子を提供する段階
をさらに実行することを特徴とする、請求項4に記載のライセンス検証装置。
【請求項7】
前記予め設定されたコード形態のパターンを生成する段階は、
1つのオープンソースソフトウェアに対して2つ以上のパターンを生成し、
前記比較する段階は、
前記予め設定されたコード形態に変換された実行ファイルから抽出される2つ以上のメソッド呼び出し情報と前記2つ以上のパターンとをそれぞれ比較することを特徴とする、
請求項4に記載のライセンス検証装置。
【発明の詳細な説明】
【技術分野】
【0001】
以下の説明は、オープンソースソフトウェアのライセンスを検証する方法およびシステムに関し、より詳細には、オープンソースソフトウェアのライセンスを検査することができるライセンス検証方法、前記ライセンス検証方法を実行するコンピュータ装置、コンピュータと結合して前記ライセンス検証方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録されたコンピュータプログラムとその記録媒体に関する。
【背景技術】
【0002】
オープンソースソフトウェアは、ソフトウェア開発において自由に利用することのできるソフトウェアであるが、商用目的として利用する場合にはライセンス規約を守らなければならない。オープンソースソフトウェアを作った団体の性格に応じて準拠すべきライセンスは異なる可能性がある。代表的な例として、BSD(Berkeley Software Distribution)、GPL(General Public License)、アパッチ(Apache)などがあるが、使用、複製、改変、改変後の再配布が自由に許容されているライセンスがある反面、修正したソースコードを公開しなければならないライセンスもある。
【0003】
また、オープンソースソフトウェアの使用の増加にともない、オープンソースのセキュリティの脆弱性を悪用したサイバー攻撃も年々増加傾向にある。オープンソースの不十分なセキュリティ管理により、既に発見されているセキュリティの脆弱性さえもパッチされずに放置された場合には、これによる被害が発生してしまうことが懸念される。弱点を含んだオープンソースがソフトウェアに含まれて配布されることもあるため、使用したオープンソースの管理が必要となっている。
【0004】
従来技術では、オープンソースライセンス検査システムに開発者のソースコードが入力されると、開発者のコードとオープンソースソフトウェアのコードとを比較してオープンソースソフトウェアを判別している。この場合、開発会社の立場では、オープンソースライセンスの検査のためにシステムにソースコードを送信しなければならず、このようなソースコードの流出は開発会社の観点ではセキュリティ上の危険要素になり得るため、不便と拒否感が発生するという問題を抱えている。
【発明の概要】
【発明が解決しようとする課題】
【0005】
オープンソースソフトウェアのライセンスを検査することができるライセンス検証方法、ライセンス検証方法を実行するコンピュータ装置、コンピュータと結合してライセンス検証方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録されたコンピュータプログラムとその記録媒体を提供する。
【0006】
アンドロイド環境におけるsmaliコードのような予め設定されたコード形態を活用することで、開発者のソースコードでなく、ビルドされた状態のバイナリーコードを利用してオープンソースソフトウェアのライセンスを検証することができるライセンス検証方法、ライセンス検証方法を実行するコンピュータ装置、コンピュータと結合してライセンス検証方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録されたコンピュータプログラムとその記録媒体を提供する。
【0007】
パッケージファイルの構造による形態比較により、文字列が難読化されたコードに対してもオープンソースソフトウェアのライセンスを検証することができるライセンス検証方法、ライセンス検証方法を実行するコンピュータ装置、コンピュータと結合してライセンス検証方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録されたコンピュータプログラムとその記録媒体を提供する。
【課題を解決するための手段】
【0008】
ライセンス検証方法であって、オープンソースソフトウェアをダウンロードする段階、前記ダウンロードされたオープンソースソフトウェアからメソッド呼び出し情報を抽出する段階、前記抽出されたメソッド呼び出し情報を利用して予め設定されたコード形態のパターンを生成する段階、および前記生成されたパターンを前記ダウンロードされたオープンソースソフトウェアの識別子と連携させてデータベースに格納する段階を含むことを特徴とする、ライセンス検証方法を提供する。
【0009】
一側面によると、前記ライセンス検証方法は、検査の対象となるパッケージファイルの入力を受ける段階、前記パッケージファイルの実行ファイルを抽出する段階、前記抽出した実行ファイルを前記予め設定されたコード形態に変換する段階、前記予め設定されたコード形態に変換された実行ファイルからメソッド呼び出し情報を抽出する段階、および前記抽出されたメソッド呼び出し情報と前記データベースに格納されたパターンとを比較する段階をさらに含むことを特徴としてよい。
【0010】
ライセンス検証方法であって、オープンソースソフトウェアをダウンロードする段階、前記ダウンロードされたオープンソースソフトウェアのディレクトリ構造に対応する第1ツリー構造のデータを生成する段階、および前記第1ツリー構造のデータを該当のオープンソースソフトウェアの識別子と連携させてデータベースに格納する段階を含むことを特徴とする、ライセンス検証方法を提供する。
【0011】
一側面によると、前記ライセンス検証方法は、検査の対象となるパッケージファイルの入力を受ける段階、前記入力されたパッケージファイルのディレクトリ構造に対応する第2ツリー構造のデータを生成する段階、および前記第2ツリー構造のデータと前記データベースに格納された前記第1ツリー構造のデータとを比較する段階をさらに含むことを特徴としてよい。
【0012】
コンピュータと結合して前記ライセンス検証方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録された、コンピュータプログラムを提供する。
【0013】
前記ライセンス検証方法をコンピュータに実行させるためのプログラムが記録されていることを特徴とする、コンピュータ読み取り可能な記録媒体を提供する。
【0014】
コンピュータ装置であって、コンピュータ読み取り可能な命令を実行するように実現される少なくとも1つのプロセッサを含み、前記少なくとも1つのプロセッサは、オープンソースソフトウェアをダウンロードし、前記ダウンロードされたオープンソースソフトウェアからメソッド呼び出し情報を抽出し、前記抽出されたメソッド呼び出し情報を利用して予め設定されたコード形態のパターンを生成し、前記生成されたパターンを前記ダウンロードされたオープンソースソフトウェアの識別子と連携させてデータベースに格納することを特徴とする、コンピュータ装置を提供する。
【0015】
コンピュータ装置であって、コンピュータ読み取り可能な命令を実行するように実現される少なくとも1つのプロセッサを含み、前記少なくとも1つのプロセッサは、オープンソースソフトウェアをダウンロードし、前記ダウンロードされたオープンソースソフトウェアのディレクトリ構造に対応する第1ツリー構造のデータを生成し、前記第1ツリー構造のデータを該当のオープンソースソフトウェアの識別子と連携させてデータベースに格納することを特徴とする、コンピュータ装置を提供する。
【発明の効果】
【0016】
オープンソースソフトウェアのライセンスを検査することができるライセンス検証方法、ライセンス検証方法を実行するコンピュータ装置、コンピュータと結合してライセンス検証方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録されたコンピュータプログラムとその記録媒体を提供することができる。
【0017】
アンドロイド環境におけるsmaliコードのような予め設定されたコード形態を活用することで、開発者のソースコードでなく、ビルドされた状態のバイナリーコードを利用してオープンソースソフトウェアのライセンスを検証することができる。
【0018】
パッケージファイルの構造による形態比較により、文字列が難読化されたコードに対してもオープンソースソフトウェアのライセンスを検証することができる。
【図面の簡単な説明】
【0019】
【
図1】本発明の一実施形態における、ネットワーク環境の例を示した図である。
【
図2】本発明の一実施形態における、コンピュータ装置の例を示したブロック図である。
【
図3】本発明の一実施形態における、オープンソースソフトウェアのパターンを収集する方法の例を示したフローチャートである。
【
図4】本発明の一実施形態における、パターンを利用したオープンソースソフトウェアの使用の可否を検査する方法の例を示したフローチャートである。
【
図5】本発明の一実施形態における、オープンソースソフトウェアのソースコードからsmaliコード形態のパターンを生成する例を示した図である。
【
図6】本発明の一実施形態における、dexファイルをsmaliコードに変換する例を示した図である。
【
図7】本発明の一実施形態における、dexファイルをsmaliコードに変換する例を示した図である。
【
図8】本発明の一実施形態における、JavaコードとJavaコードに対応するsmaliコードの例を示した図である。
【
図9】本発明の一実施形態における、パッケージファイルの構造をオープンソースソフトウェアのパターンとして収集する方法の例を示したフローチャートである。
【
図10】本発明の一実施形態における、パッケージファイルの構造による形態比較によってオープンソースソフトウェアの使用の可否を検査する方法の例を示したフローチャートである。
【
図11】本発明の一実施形態における、パッケージファイルのディレクトリ構造の例を示した図である。
【
図12】本発明の一実施形態における、ディレクトリ構造に対応するツリー構造の例を示した図である。
【
図13】本発明の一実施形態における、整列されたツリー構造の例を示した図である。
【
図14】本発明の一実施形態における、直列化されて格納されたデータの例を示した図である。
【
図15】本発明の一実施形態における、ツリー構造の比較例を示した図である。
【
図16】本発明の一実施形態における、ツリー構造の比較例を示した図である。
【発明を実施するための形態】
【0020】
以下、実施形態について、添付の図面を参照しながら詳しく説明する。
【0021】
本発明の実施形態に係るライセンス検証システムは、以下で説明されるサーバのようなコンピュータ装置によって実現されてよい。このとき、コンピュータ装置においては、本発明の一実施形態に係るコンピュータプログラムがインストールされて実行されてよく、コンピュータ装置は、実行されるコンピュータプログラムの制御にしたがって本発明の実施形態に係るライセンス検証方法を実行してよい。上述したコンピュータプログラムは、コンピュータ装置と結合してライセンス検証方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録されてよい。
【0022】
図1は、本発明の一実施形態における、ネットワーク環境の例を示した図である。
図1のネットワーク環境は、複数の電子機器110、120、130、140、複数のサーバ150、160、およびネットワーク170を含む例を示している。このような
図1は、発明の説明のための一例に過ぎず、電子機器の数やサーバの数が
図1のように限定されることはない。
【0023】
複数の電子機器110、120、130、140は、コンピュータ装置によって実現される固定端末や移動端末であってよい。複数の電子機器110、120、130、140の例としては、スマートフォン、携帯電話、ナビゲーション、PC(personal computer)、ノート型PC、デジタル放送用端末、PDA(Personal Digital Assistant)、PMP(Portable Multimedia Player)、タブレットなどがある。一例として、
図1では、電子機器1(110)の例としてスマートフォンを示しているが、本発明の実施形態において、電子機器1(110)は、実質的に無線または有線通信方式を利用し、ネットワーク170を介して他の電子機器120、130、140および/またはサーバ150、160と通信することのできる多様な物理的なコンピュータ装置のうちの1つを意味してよい。
【0024】
通信方式が限定されることはなく、ネットワーク170が含むことのできる通信網(一例として、移動通信網、有線インターネット、無線インターネット、放送網)を利用する通信方式だけではなく、機器間の近距離無線通信が含まれてもよい。例えば、ネットワーク170は、PAN(personal area network)、LAN(local area network)、CAN(campus area network)、MAN(metropolitan area network)、WAN(wide area network)、BBN(broadband network)、インターネットなどのネットワークのうちの1つ以上の任意のネットワークを含んでよい。さらに、ネットワーク170は、バスネットワーク、スターネットワーク、リングネットワーク、メッシュネットワーク、スター-バスネットワーク、ツリーまたは階層的ネットワークなどを含むネットワークトポロジのうちの任意の1つ以上を含んでもよいが、これらに限定されることはない。
【0025】
サーバ150、160それぞれは、複数の電子機器110、120、130、140とネットワーク170を介して通信して命令、コード、ファイル、コンテンツ、サービスなどを提供する1つ以上のコンピュータ装置によって実現されてよい。例えば、サーバ150は、ネットワーク170を介して接続した複数の電子機器110、120、130、140に第1サービスを提供するシステムであってよく、サーバ160も、ネットワーク170を介して接続した複数の電子機器110、120、130、140に第2サービスを提供するシステムであってよい。より具体的な例として、サーバ150は、第1サービスとして複数の電子機器110、120、130、140にアプリケーションをインストールさせて実行させるためのファイルを複数の電子機器110、120、130、140に配布してよい。また、サーバ160は、上述したアプリケーションを通じ、該当のアプリケーションが目的とするサービスを第2サービスとして複数の電子機器110、120、130、140に提供してよい。
【0026】
このとき、サーバ150には、本発明の実施形態に係るライセンス検証システムが実現されてよい。ライセンス検証システムは、開発者がサーバ150に登録するアプリケーションをインストールおよび実行させるためのファイルに対してオープンソースソフトウェアの使用を感知してよく、感知されたオープンソースソフトウェアのライセンス情報を管理者に提供してよい。実施形態によって、ライセンス検証システムは、サーバ150と区分される別のコンピュータ装置によって実現され、サーバ150とネットワーク170を介して連携してもよい。
【0027】
図2は、本発明の一実施形態における、コンピュータ装置の例を示したブロック図である。上述した複数の電子機器110、120、130、140それぞれやサーバ150、160、さらに発明の実施形態に係るライセンス検証システムは、
図2を参照しながら示したコンピュータ装置200によって実現されてよく、一実施形態に係るライセンス検証方法は、このようなコンピュータ装置200によって実現されるライセンス検証システムによって実行されてよい。ライセンス検証システムがサーバ150に実現される場合、サーバ150を実現するコンピュータ装置200により、本発明の実施形態に係るライセンス検証方法が実行されてよい。例えば、コンピュータ装置200においては、一実施形態に係るコンピュータプログラムがインストールされて実行されてよく、コンピュータ装置200は、実行されるコンピュータプログラムの制御にしたがって本発明の実施形態に係るライセンス検証方法を実行してよい。実施形態によって、ライセンス検証システムは、複数のコンピュータ装置の結合によって実現されてもよい。
【0028】
このようなコンピュータ装置200は、
図2に示すように、メモリ210、プロセッサ210、通信インタフェース230、および入力/出力インタフェース240を含んでよい。メモリ210は、コンピュータ読み取り可能な記録媒体であって、RAM(random access memory)、ROM(read only memory)、およびディスクドライブのような永続的大容量記録装置を含んでよい。ここで、ROMやディスクドライブのような永続的大容量記録装置は、メモリ210とは区分される別の永続的記録装置としてコンピュータ装置200に含まれてもよい。また、メモリ210には、オペレーティングシステムと、少なくとも1つのプログラムコードが記録されてよい。このようなソフトウェア構成要素は、メモリ210とは別のコンピュータ読み取り可能な記録媒体からメモリ210ロードされてよい。このような別のコンピュータ読み取り可能な記録媒体は、フロッピードライブ、ディスク、テープ、DVD/CD-ROMドライブ、メモリカードなどのコンピュータ読み取り可能な記録媒体を含んでよい。他の実施形態において、ソフトウェア構成要素は、コンピュータ読み取り可能な記録媒体ではない通信インタフェース230を通じてメモリ210にロードされてもよい。例えば、ソフトウェア構成要素は、ネットワーク170を介して受信されるファイルによってインストールされるコンピュータプログラムに基づいてコンピュータ装置200のメモリ210にロードされてよい。
【0029】
プロセッサ220は、基本的な算術、ロジック、および入出力演算を実行することにより、コンピュータプログラムの命令を処理するように構成されてよい。命令は、メモリ210または通信インタフェース230によって、プロセッサ220に提供されてよい。例えば、プロセッサ220は、メモリ210のような記録装置に記録されたプログラムコードにしたがって受信される命令を実行するように構成されてよい。
【0030】
通信インタフェース230は、ネットワーク170を介してコンピュータ装置200が他の装置(一例として、上述した記録装置)と互いに通信するための機能を提供してよい。一例として、コンピュータ装置200のプロセッサ220がメモリ210のような記録装置に記録されたプログラムコードにしたがって生成した要求や命令、データ、ファイルなどが、通信インタフェース230の制御にしたがってネットワーク170を介して他の装置に伝達されてよい。これとは逆に、他の装置からの信号や命令、データ、ファイルなどが、ネットワーク170を経てコンピュータ装置200の通信インタフェース230を通じてコンピュータ装置200に受信されてよい。通信インタフェース230を通じて受信された信号や命令、データなどは、プロセッサ220やメモリ210に伝達されてよく、ファイルなどは、コンピュータ装置200がさらに含むことのできる記録媒体(上述した永続的記録装置)に記録されてよい。
【0031】
入力/出力インタフェース240は、入力/出力装置250とのインタフェースのための手段であってよい。例えば、入力装置は、マイク、キーボード、またはマウスなどの装置を、出力装置は、ディスプレイやスピーカのような装置を含んでよい。他の例として、入力/出力インタフェース240は、タッチスクリーンのように入力と出力のための機能が1つに統合された装置とのインタフェースのための手段であってもよい。入力/出力装置250は、コンピュータ装置200と1つの装置で構成されてもよい。
【0032】
また、他の実施形態において、コンピュータ装置200は、
図2の構成要素よりも少ないか多くの構成要素を含んでもよい。しかし、大部分の従来技術的構成要素を明確に図に示す必要はない。例えば、コンピュータ装置200は、上述した入力/出力装置250のうちの少なくとも一部を含むように実現されてもよいし、トランシーバやデータベースなどのような他の構成要素をさらに含んでもよい。
【0033】
図3は、本発明の一実施形態における、オープンソースソフトウェアのパターンを収集する方法の例を示したフローチャートである。本実施形態に係る方法は、一実施形態に係るライセンス検証方法に含まれてよく、上述したコンピュータ装置200によって実行されてよい。例えば、コンピュータ装置200のプロセッサ220は、メモリ210が含むオペレーティングシステムのコードと、少なくとも1つのプログラムのコードとによる制御命令(instruction)を実行するように実現されてよい。ここで、プロセッサ220は、コンピュータ装置200に記録されたコードが提供する制御命令にしたがってコンピュータ装置200が
図3の方法に含まれる段階310~340を実行するようにコンピュータ装置200を制御してよい。
【0034】
段階310で、コンピュータ装置200は、オープンソースソフトウェアをダウンロードしてよい。例えば、コンピュータ装置200は、オープンソースソフトウェアのソースコードを共有する複数のサイトのうちの少なくとも1つのサイトから複数のオープンソースソフトウェアをダウンロードしてよく、ダウンロードされた複数のオープンソースソフトウェアそれぞれに対しての次の段階320~340を実行してよい。
【0035】
段階320で、コンピュータ装置200は、ダウンロードされたオープンソースソフトウェアからメソッド呼び出し情報を抽出してよい。一例として、メソッド呼び出し情報は、特定のメソッドを呼び出すために要求される情報として、Javaコードでは、クラス経路名、クラス名、メソッド名、メソッド因子の数、各因子のタイプを含んでよい。このとき、コンピュータ装置200は、少なくともクラス経路名、クラス名、およびメソッド名をメソッド呼び出し情報として抽出してよい。実施形態によって、メソッド因子の数および各因子のタイプのうちの少なくとも1つが、メソッド呼び出し情報としてさらに抽出されてもよい。
【0036】
段階330で、コンピュータ装置200は、抽出されたメソッド呼び出し情報を利用して予め設定されたコード形態のパターンを生成してよい。例えば、コンピュータ装置200は、抽出されたメソッド呼び出し情報を利用し、アンドロイドアプリケーションのためのパッケージファイルであるAPK(Android application package)ファイルで使用されるsmaliコード形態のパターンを生成してよい。以下でさらに詳しく説明するように、smaliコード形態のパターンは、クラス経路名、クラス名、およびメソッド名を含んでよい。
【0037】
段階340で、コンピュータ装置200は、生成されたパターンを該当のオープンソースソフトウェアの識別子と連携させてデータベースに格納してよい。一例として、オープンソースソフトウェアの識別子は、該当のオープンソースソフトウェアの名称であってよい。また、ダウンロードされた複数のオープンソースソフトウェアそれぞれに対して少なくとも1つのパターンが生成されてよく、生成されたパターンは、複数のオープンソースソフトウェアそれぞれの識別子と連携されてデータベースに格納されてよい。
【0038】
図4は、本発明の一実施形態における、パターンを利用したオープンソースソフトウェアの使用の可否を検査する方法の例を示したフローチャートである。本実施形態に係る方法も、一実施形態に係るライセンス検証方法に含まれてよい。例えば、
図3の実施形態に係る方法により、多様なオープンソースソフトウェアそれぞれに対するパターンが生成されてデータベース化された後、
図4の実施形態に係る方法により、特定のアプリケーションに対してオープンソースソフトウェアの検査が実行されてよい。本実施形態に係る方法も、上述したコンピュータ装置200によって実行されてよい。例えば、コンピュータ装置200のプロセッサ220は、メモリ210が含むオペレーティングシステムのコードと、少なくとも1つのプログラムのコードとによる制御命令(instruction)を実行するように実現されてよい。ここで、プロセッサ220は、コンピュータ装置200に記録されたコードが提供する制御命令にしたがってコンピュータ装置200が
図4の方法に含まれる段階410~440を実行するようにコンピュータ装置200を制御してよい。
【0039】
段階410で、コンピュータ装置200は、検査の対象となるパッケージファイルの入力を受けてよい。例えば、アンドロイドアプリケーションが検査の対象となる場合、コンピュータ装置200は、該当のアンドロイドアプリケーションのインストールおよび実行のためのAPKファイルの入力を受けてよい。
【0040】
段階420で、コンピュータ装置200は、パッケージファイルの実行ファイルを抽出してよい。上述したアンドロイドアプリケーションの例において、コンピュータ装置200は、入力されたAPKファイルの圧縮を解除し、「classes.dex」のようなdex(dalvik executable)ファイルを実行ファイルとして抽出してよい。圧縮の解除後、dexファイルは、圧縮が解除されたディレクトリのルート経路に存在するようになる。
【0041】
段階430で、コンピュータ装置200は、抽出した実行ファイルを予め設定されたコード形態に変換してよい。例えば、
図3で説明したsmaliコード形態を利用する場合、コンピュータ装置200は、baksmaliライブラリを利用して実行ファイルをsmaliコードに変換してよい。段階420で、APKファイルの圧縮を解除するためのツールであるapktoolでbaksmaliライブラリが内蔵されている場合には、APKファイルの圧縮とdexファイルのsmaliコードへの変換とが同時になされてもよい。
【0042】
段階440で、コンピュータ装置200は、予め設定されたコード形態に変換された実行ファイルからメソッド呼び出し情報を抽出してよい。このとき、抽出されるメソッド呼び出し情報は、実行ファイルが既に予め設定されたコード形態に変換されているため、
図3の段階330で生成されたパターンと同一または類似の形態を有してよく、少なくともクラス経路名、クラス名、およびメソッド名を含んでよい。実施形態によって、メソッド因子の数および各因子のタイプのうちの少なくとも1つが、段階440で抽出されたメソッド呼び出し情報にさらに含まれてもよい。
【0043】
段階450で、コンピュータ装置200は、抽出されたメソッド呼び出し情報とデータベースに格納されたパターンとを比較してよい。このとき、抽出されたメソッド呼び出し情報と一致(あるいは、抽出されたメソッド呼び出し情報を含む)するパターンがデータベースに存在する場合、該当のパターンと対応してデータベースに格納されたオープンソースソフトウェアの識別子により、段階410で入力されたパッケージファイルが該当のオープンソースソフトウェアを使用していることが分かる。
【0044】
この後、コンピュータ装置200は、検索されたオープンソースソフトウェアの識別子と該当のオープンソースソフトウェアにマッチングされたライセンス情報を提供してよい。この場合、管理者は、検索の対象となるパッケージファイルがどのようなオープンソースソフトウェアを使用しており、どのようなライセンスが適用されているかを把握することができるようになる。
【0045】
図5は、本発明の一実施形態における、オープンソースソフトウェアのソースコードからsmaliコード形態のパターンを生成する例を示した図である。
図5は、オープンソースソフトウェアの例として、該当のオープンソースソフトウェアのためのJavaコードファイル「Square.java」510と、「Square.java」510に含まれたJavaコード520の例を示している。このようなJavaコード520によると、第1点線枠521に示された「com.sample.math」のパッケージ経路に第2点線枠522に示された「Square」クラスが定義されており、「Square」クラスには第3点線枠523に示された「getWidth()」メソッドが含まれていることが分かる。
【0046】
コンピュータ装置200は、段階320で、このようなJavaコード520からメソッド呼び出し情報として、パッケージ経路名「com.sample.math」、クラス名「Square」、メソッド名「getWidth()」をそれぞれ抽出してよい。
【0047】
この場合、コンピュータ装置200は、段階330で、抽出された情報を利用し、
図5に示すように、対応するsmaliコード形態の情報530を生成してよい。smaliコード形態の情報530で、「invoke-virtual」命令語は、smaliコード形態でvirtualメソッドを呼び出す命令語であり、このとき、呼び出されるメソッドは、staticメソッド、privateメソッド、finalメソッド、constructorメソッドであってはならない。「v0」はクラスのインスタンスを、クラス経路名「com.sample.math」の前の「L」はクラスがオブジェクト型であることを意味してよく、メソッド名「getWidth()」の後ろの「V」はリターンタイプがvoidであることを意味してよい。この他に、上位クラスのvirtualメソッドを呼び出す「invoke-super」命令語、directメソッドBを呼び出す「invoke-direct」命令語、staticメソッドを呼び出す「invoke-static」命令語、interfaceメソッドを呼び出す「invoke-interface」命令語などが使用されてよい。このとき、「invoke-super」命令語によって呼び出されるメソッドは、staticメソッド、privateメソッド、finalメソッド、constructorメソッドであってはならない。さらに、「invoke-direct」命令語によって呼び出されるメソッドはstaticメソッドであってはならず、「invoke-direct」命令語は、privateメソッド、constructorメソッドのようにオーバーライド(override)することのできないメソッドを呼び出すときに使用されてよい。
【0048】
この場合、特定のパッケージファイルの実行ファイルで「com.sample.math」クラス経路によって「Square」クラスの「getWidth()」を呼び出す場合、Javaコードファイル「Square.java」510を含むオープンソースソフトウェアを使用することが分かるようになる。
【0049】
一般的に、クラスの経路であるパッケージ名には会社名やソフトウェア名のような固有名称が含まれているため重複の危険が低く、2つの以上のクラスとメソッドに対してパターンを生成して検査する場合、誤検出の確率はゼロに近い。
【0050】
このとき、コンピュータ装置200は、一例として、第4点線枠540に示した「Lcom/sample/math/Square;->getWidth()V」をパターンとしてデータベースに格納してよい。
【0051】
図6および
図7は、本発明の一実施形態における、dexファイルをsmaliコードに変換する例を示した図である。
図6の第1枠610は、dexファイル「classes.dex」のコードの一部を示しており、
図7の第2枠710は、dexファイル「classes.dex」を、baksmaliライブラリを利用して変換したsmaliファイル「class.smali」のコードの一部を示している。例えば、コンピュータ装置200は、「$ java‐jar baksmali.jar-o<output directory>classes.dex」のような命令により、dexファイル「classes.dex」をsmaliファイル「class.smali」に変換してよい。
【0052】
このとき、コンピュータ装置200は、変換されたsmaliファイル「class.smali」で「invoke-virtual」命令語によってメソッドを呼び出すコードを識別してよく、このようなコードからメソッド呼び出し情報を抽出してよい。
【0053】
図8は、本発明の一実施形態における、JavaコードとJavaコードに対応するsmaliコードの例を示した図である。
図8において、第1枠810は、アンドロイドの「Toast」を利用して「Toast Hello」という簡単なメッセージを画面に出力するJavaコードの例を示しており、第2枠820は、第1枠810のJavaコードをsmaliコードの形態に変換した例を示している。実質的には、Javaコードをdexファイルのコード形態に変換した後、
図6のように、dexファイルを再びsmaliファイルの形態に変換する過程が要求される。
【0054】
このとき、点線枠830に示すようなクラス「Toast」のメソッド「show()」を呼び出すコードを詳察すると、「v1」はクラス「Toast」のインスタンスを、「android/widget/Toast」はクラス経路とクラスを、「show()」はメソッドを、「V」はリターンタイプのボイド(void)を、それぞれ示している。このように、コンピュータ装置200は、smaliコード形態に変換された実行コードからメソッド呼び出し情報を抽出することができるようになり、好ましくは、
図3でデータベースに格納されるパターンとの比較のために、「Landroid/widget/Toast;->show()V」のような形態でメソッド呼び出し情報を抽出してよい。
【0055】
コンピュータ装置200は、抽出されたメソッド呼び出し情報とデータベースから読み取ったパターンとを比較して一致又は不一致を判断してよく、一致する場合には、該当のパターンと連携されてデータベースに格納されたオープンソースソフトウェアの識別子により、検査の対象となるパッケージファイルが該当のオープンソースソフトウェアを使用していると判断することができるようになる。パッケージ名(クラス経路名)、クラス名、メソッド名はそれぞれ会社名、機能名を意味するため重複の危険は少ないが、重複の危険がある場合には、2つの以上のパターンを比較することで誤検出の確率を減らすことができる。
【0056】
また、コンピュータ装置200は、パッケージファイルが該当のオープンソースソフトウェアを使用していると決定される場合、該当するオープンソースソフトウェアの識別子(一例として、オープンソースソフトウェア名)に該当するオープンソースソフトウェアで使用するライセンスの識別子(一例として、ライセンス名)を提供してよい。
【0057】
以下、パッケージファイルの構造による形態比較によってライセンスを検証する実施形態について説明する。
【0058】
図9は、本発明の一実施形態における、パッケージファイルの構造をオープンソースソフトウェアのパターンとして収集する方法の例を示したフローチャートである。本実施形態に係る方法は、一実施形態に係るライセンス検証方法に含まれてよく、上述したコンピュータ装置200によって実行されてよい。例えば、コンピュータ装置200のプロセッサ220は、メモリ210が含むオペレーティングシステムのコードと、少なくとも1つのプログラムのコードとによる制御命令を実行するように実現されてよい。ここで、プロセッサ220は、コンピュータ装置200に格納されたコードが提供する制御命令にしたがってコンピュータ装置200が
図9の方法に含まれる段階910~940を実行するようにコンピュータ装置200を制御してよい。
【0059】
段階910で、コンピュータ装置200は、オープンソースソフトウェアをダウンロードしてよい。例えば、コンピュータ装置200は、オープンソースソフトウェアのソースコードを共有する多様なサイトから複数のオープンソースソフトウェアをダウンロードしてよく、ダウンロードされた複数のオープンソースソフトウェアそれぞれに対して次の段階920~940を実行してよい。このような段階910は、
図3を参照しながら説明した段階310に対応してよく、ライセンス検証方法が
図3の方法と
図9の方法との両方を含む場合には、段階310および段階910は同じ段階となってよい。
【0060】
段階920で、コンピュータ装置200は、ダウンロードされたオープンソースソフトウェアのディレクトリ構造に対応するツリー構造のデータを生成してよい。Javaソースコードは、類似する性格のJavaクラスを集めてディレクトリを生成して分類する。このようなディレクトリ構造の形態は、オープンソースソフトウェアの1つの特徴となってよく、ツリー構造で表現されてよい。例えば、ディレクトリはブランチノード(branch node)となってよく、ディレクトリに格納されたJavaコードファイルはリーフノード(leaf node)と表現されてよい。このようなディレクトリ構造とツリー構造については、以下でさらに詳しく説明する。
【0061】
段階930で、コンピュータ装置200は、生成されたツリー構造のノードを整列してよい。ツリー構造におけるノードの整列は、以後に他のツリー構造と一致するか否かを比較するために実行されてよく、実施形態によっては省略されてもよい。具体的な整列方法については、以下で詳しく説明する。
【0062】
段階940で、コンピュータ装置200は、整列されたツリー構造のデータを該当のオープンソースソフトウェアの識別子と連携させてデータベースに格納してよい。ツリー構造のデータは、ツリー構造がそのままデータベースに格納されてもよいが、ツリー構造のデータベース化の複雑性を考慮するとき、直列化(serialize)されて格納されてもよい。このようなツリー構造のデータの直列化については、以下でさらに詳しく説明する。
【0063】
また、ダウンロードされる複数のオープンソースソフトウェアそれぞれに対してこのようなツリー構造のデータが生成されてよく、生成されたツリー構造のデータは、複数のオープンソースソフトウェアそれぞれの識別子と連携されてデータベースに格納されてよい。
【0064】
図10は、本発明の一実施形態における、パッケージファイルの構造による形態比較によってオープンソースソフトウェアの使用の可否を検査する方法の例を示したフローチャートである。本実施形態に係る方法も、一実施形態に係るライセンス検証方法に含まれてよい。例えば、
図9の実施形態に係る方法により、多様なオープンソースソフトウェアそれぞれに対してツリー構造のデータが生成されてデータベース化された後、
図10の実施形態に係る方法により、特定のアプリケーションに対してオープンソースソフトウェアの検査が実行されてよい。本実施形態に係る方法も、上述したコンピュータ装置200によって実行されてよい。例えば、コンピュータ装置200のプロセッサ220は、メモリ210が含むオペレーティングシステムのコードと、少なくとも1つのプログラムのコードとによる制御命令を実行するように実現されてよい。ここで、プロセッサ220は、コンピュータ装置200に記録されたコードが提供する制御命令にしたがってコンピュータ装置200が
図10の方法に含まれる段階1010~1040を実行するようにコンピュータ装置200を制御してよい。
【0065】
段階1010で、コンピュータ装置200は、検査の対象となるパッケージファイルの入力を受けてよい。例えば、アンドロイドアプリケーションが検査の対象となる場合、コンピュータ装置200は、該当のアンドロイドアプリケーションのインストールおよび実行のためのAPKファイルの入力を受けてよい。
【0066】
段階1020で、コンピュータ装置200は、入力されたパッケージファイルのディレクトリ構造に対応するツリー構造のデータを生成してよい。このような段階1020は、段階920でツリー構造のデータを生成する過程と等しくてよい。
【0067】
段階1030で、コンピュータ装置200は、生成されたツリー構造のノードを整列してよい。このような段階1030は、段階930でツリー構造のデータを整列する過程と等しくてよい。
【0068】
段階1040で、コンピュータ装置200は、整列されたツリー構造のデータとデータベースに格納されたツリー構造のデータとを比較してよい。このとき、コンピュータ装置200は、データベースから抽出されたツリー構造のデータと段階1030で整列されたツリー構造のデータとが一致する場合、データベースに格納されたオープンソースソフトウェアの識別子により、段階1010で入力されたパッケージファイルが該当のオープンソースソフトウェアを使用していることが分かるようになる。
【0069】
この後、コンピュータ装置200は、検索されたオープンソースソフトウェアの識別子と該当のオープンソースソフトウェアにマッチングされたライセンス情報を提供してよい。この場合、管理者は、検索の対象となるパッケージファイルが、どのようなオープンソースソフトウェアを使用しており、どのようなライセンスが適用されているかを把握することができるようになる。
【0070】
パッケージファイルの文字列に難読化が適用された場合には、クラス経路名、クラス名、メソッド名などが変わることがある。しかし、本実施形態では、ソースコードの内容を比較するのではなく、ディレクトリとディレクトリに格納されたJavaコードファイルのようなパッケージファイルの構造に基づいてオープンソースソフトウェアの使用の可否を検査するため、パッケージファイルに難読化が適用された場合であっても使用されることができる。
【0071】
図11は、本発明の一実施形態における、パッケージファイルのディレクトリ構造の例を示した図であり、
図12は、本発明の一実施形態における、ディレクトリ構造に対応するツリー構造の例を示した図である。
【0072】
先ず、
図11は、パッケージファイルのディレクトリ構造の例として、9つのディレクトリと8つのJavaコードファイルを示している。このとき、
図12は、ディレクトリを円形のブランチノードで表現しており、Javaコードファイルを四角形のリーフノードで表現している。このとき、円内の1番目の数字は子ノードの数である次数を、2番目の数字は下位のすべてのノードの次数の和をそれぞれ意味してよい。例えば、
図11の1番目のディレクトリ「com」は、
図12で、次数1と次数の和16を有するルートノードで表現されている。
図11の2番目のディレクトリ「sample」は、
図12で、次数1と次数の和15を有するブランチノードで表現されている。さらに、
図11の1番目のJavaコードファイルである「Internet.java」は、
図12で、ルートノードの深さを0とするとき、深さ5の四角形の1番目のリーフノードで表現されている。
【0073】
このように、コンピュータ装置200は、
図11のパッケージファイルのディレクトリ構造を左側から右側に、さらに上から下に巡回しながら、ツリー構造のデータを生成してよい。上述したように、ブランチノードはディレクトリを意味してよく、下位ノード(子ノード)としてブランチノードまたはリーフノードを有してよい。各ノードは、次数と次数の和の情報を有してよい。また、リーフノードはJavaコードファイルを意味してよく、下位ノードを有することはできない。クラスに関する情報を含んでよく、含まれたクラスに関する情報として、メンバー変数の数、メンバー関数の数、各メンバー関数のシグニチャ、メソッドリターンタイプ、因子の数、および各因子のタイプのうちの対応する情報を含んでよい。例えば、コード「public static void main(String[]args)」で、リターンタイプは「void」であり、因子の数は2であり、因子タイプは「String[]」と「args」であることが分かる。
【0074】
上述したように、ツリー構造の整列は、以後に、他のツリー構造と一致するか否かを比較するために実行されてよい。整列の基準は、ブランチノードがリーフノードよりも高い優先順位を有してよく、同じ親を有するブランチノードは、次数を利用して降順あるいは昇順に整列されてよい。次数を利用して整列されたブランチノードのうち同じ次数を有するブランチノードは、次数の和を利用して降順あるいは昇順に整列されてよい。同じ親を有するリーフノードは、メソッドの数(メンバー関数の数)を基準として降順あるいは昇順に整列されてよい。整列方式は、オープンソースソフトウェアのディレクトリ構造に対して生成されたツリー構造とパッケージファイルのディレクトリ構造に対して生成されたツリー構造に対して同じ方式で適用されることのできる整列方式であれば、上述した実施形態に制限されることはない。
【0075】
図13、は本発明の一実施形態における、整列されたツリー構造の例を示した図である。
図12と
図13とを比較すると、第1ブランチノード1210の次数が1であり、第2ブランチノード1220の次数が2である関係により、第2ブランチノード1220が第1ブランチノード1210の左側に配置されるように整列された例を示している。このような第1ブランチノード1210と第2ブランチノード1220の配置変更により、上述した整列方式によってツリー構造のすべてのノードが配置されたことが分かる。
【0076】
また、コンピュータ装置200は、Javaのオブジェクト直列化を利用してツリー構造のデータを直列化させた後、データベースに格納してよい。より具体的に、コンピュータ装置200は、ディレクトリを巡回して各ディレクトリをJavaオブジェクトとして生成し、次数に基づいて降順あるいは昇順に整列したオブジェクトを格納してよい。ツリー構造の非線形配列構造を関係型データベースに格納するためには、各ノード別に親と子の関係を確認してからデータベースに格納しなければならないため、実現が複雑となる。これを容易に格納するために、コンピュータ装置200は、ルートノードを基準としてJavaのオブジェクト直列化によってツリー構造のデータを直列化させた後、データベースに格納してよい。このとき、格納に必要となるオブジェクトは、「java.io.Serializable」を実装(implements)しなければならず、メンバー変数として格納に必要な情報を入れなければならない。ブランチノードのオブジェクトの場合には、次数、次数の和、親ノード情報、子ノード情報がメンバー変数として定義されてよく、リーフノードの場合には、メンバー変数の数、メンバー関数の数、各メンバー関数のシグニチャ(メソッドリターンタイプ、因子の数、各因子のタイプ)、親ノードの情報がメンバー変数として定義されてよい。
【0077】
以下の表1は親と子の関係を定義した情報の例を、表2はブランチノードを定義した情報の例を、表3はリーフノードを定義した情報の例を、それぞれ示している。
【0078】
【表1】
図14は、本発明の一実施形態における、直列化されて格納されたデータの例を示した図である。Java直列化過程は、クラスの形態で生成されたメモリのヒープ(Heap)領域にオブジェクトを書き込む(write)ために連続的なデータに変形する過程であってよく、例えば、ツリー構造のデータを連続的なJavaオブジェクトのデータに変形する過程であってよい。直列化されて格納されたデータは、
図14に示すように、人間が確認し難い形態で格納されてよい。
【0079】
検査の対象となるパッケージファイルにオープンソースソフトウェアが使用されたか否かを決定するために、コンピュータ装置200は、先ず、パッケージファイルのルートディレクトリから下位ディレクトリを巡回してツリー構造のデータを生成および整列してよい。また、コンピュータ装置200は、直列化されてデータベースに格納されたデータを逆直列化(deserialize)してメモリ210から読み取ってよい。逆直列化過程は、直列化過程の反対であってよい。逆直列化過程が完了すると、直列化される前の形態でオブジェクトが生成され、メモリのヒープ(Heap)領域にロードされてよい。コンピュータ装置200は、このオブジェクトを使用して2つのツリー構造を比較してよい。
【0080】
図15および
図16は、本発明の一実施形態における、ツリー構造の比較例を示した図である。
図15の点線枠1510は、オープンソースソフトウェアのディレクトリ構造に対応するツリー構造(以下、「オープンソースツリー構造」とする)の例を示している。また、
図16の第1点線枠1610は、パッケージファイルのディレクトリ構造に対応するツリー構造(以下、「パッケージファイルツリー構造」とする)の例を示している。このとき、
図16の第2点線枠1620は、
図15の点線枠1510が示すツリー構造と一致するサブツリー構造を示している。
【0081】
例えば、コンピュータ装置200は、パッケージファイルツリー構造のノードを巡回してオープンソースツリー構造のルートノードの情報(次数、次数の和)と一致するノードを探索してよい。一致するノードを探索する場合、探索したノードを含むサブツリーとオープンソースツリー構造を巡回しながら比較してよい。ブランチノードの比較は、ノードの情報(次数、次数の和)が一致するか否かを判断してよく、リーフノードの比較は、メンバー変数の数、メンバー関数の数、各メンバー関数のシグニチャを比較して一致するか否かを判断してよい。ただし、関数のシグニチャの比較において、因子のタイプは、Javaのプリミティブ(primitive)型だけを比較し、ノンプリミティブ(non-primitive)型の場合は難読化される可能性があるため、比較対象に含まなくてもよい。
【0082】
上述した2つの実施形態(
図3~8を参照しながら説明したパターンを利用する実施形態、および
図9~16を参照しながら説明したツリー構造を利用する実施形態)はそれぞれ、個別に利用されてもよいし、結合されて利用されてもよい。例えば、検査の対象となるパッケージファイルに難読化が適用されていない場合にはパターンを利用する実施形態を適用し、パッケージファイルに難読化が適用されている場合にはツリー構造を利用する実施形態を適用してよい。
【0083】
以上のように、本発明の実施形態によると、アンドロイド環境におけるsmaliコードのような予め設定されたコード形態を活用することで、開発者のソースコードではなく、ビルドされた状態のバイナリーコードによってオープンソースソフトウェアのライセンスを検証することができる。また、パッケージファイルの構造による形態比較により、文字列が難読化されたコードに対してもオープンソースソフトウェアのライセンスを検証することができる。
【0084】
上述したシステムまたは装置は、ハードウェア構成要素、ソフトウェア構成要素、またはハードウェア構成要素とソフトウェア構成要素との組み合わせによって実現されてよい。例えば、実施形態で説明された装置および構成要素は、例えば、プロセッサ、コントローラ、ALU(arithmetic logic unit)、デジタル信号プロセッサ、マイクロコンピュータ、FPGA(field programmable gate array)、PLU(programmable logic unit)、マイクロプロセッサ、または命令を実行して応答することができる様々な装置のように、1つ以上の汎用コンピュータまたは特殊目的コンピュータを利用して実現されてよい。処理装置は、オペレーティングシステム(OS)およびOS上で実行される1つ以上のソフトウェアアプリケーションを実行してよい。また、処理装置は、ソフトウェアの実行に応答し、データにアクセスし、データを記録、操作、処理、および生成してもよい。理解の便宜のために、1つの処理装置が使用されるとして説明される場合もあるが、当業者は、処理装置が複数個の処理要素および/または複数種類の処理要素を含んでもよいことが理解できるであろう。例えば、処理装置は、複数個のプロセッサまたは1つのプロセッサおよび1つのコントローラを含んでよい。また、並列プロセッサのような、他の処理構成も可能である。
【0085】
ソフトウェアは、コンピュータプログラム、コード、命令、またはこれらのうちの1つ以上の組み合わせを含んでもよく、所望の動作をするように処理装置を構成したり、独立的または集合的に処理装置に命令したりしてよい。ソフトウェアおよび/またはデータは、処理装置に基づいて解釈されたり、処理装置に命令またはデータを提供したりするために、いかなる種類の機械、コンポーネント、物理装置、仮想装置、コンピュータ記録媒体または装置に具現化されてよい。ソフトウェアは、ネットワークによって接続されたコンピュータシステム上に分散され、分散された状態で記録されても実行されてもよい。ソフトウェアおよびデータは、1つ以上のコンピュータ読み取り可能な記録媒体に記録されてよい。
【0086】
実施形態に係る方法は、多様なコンピュータ手段によって実行可能なプログラム命令の形態で実現されてコンピュータ読み取り可能な媒体に記録されてよい。コンピュータ読み取り可能な媒体は、プログラム命令、データファイル、データ構造などを単独でまたは組み合わせて含んでよい。媒体に記録されるプログラム命令は、実施形態のために特別に設計されたものであっても、コンピュータソフウェアの当業者に公知の使用可能なものであってもよい。コンピュータ読み取り可能な記録媒体の例としては、ハードディスク、フロッピーディスク、および磁気テープのような磁気媒体、CD-ROMおよびDVDのような光媒体、フロプティカルディスク(floptical disk)のような光磁気媒体、およびROM、RAM、フラッシュメモリなどのようなプログラム命令を記録して実行するように特別に構成されたハードウェア装置が含まれる。このような記録媒体は、単一または複数のハードウェアが結合された形態の多様な記録手段または格納手段であってよく、あるコンピュータシステムに直接接続される媒体に限定されることなく、ネットワーク上に分散して存在するものであってもよい。プログラム命令の例は、コンパイラによって生成されるもののような機械語コードだけではなく、インタプリタなどを使用してコンピュータによって実行される高級言語コードを含む。
【0087】
以上のように、実施形態を、限定された実施形態および図面に基づいて説明したが、当業者であれば、上述した記載から多様な修正および変形が可能であろう。例えば、説明された技術が、説明された方法とは異なる順序で実行されたり、および/または、説明されたシステム、構造、装置、回路などの構成要素が、説明された方法とは異なる形態で結合されたりまたは組み合わされたり、他の構成要素または均等物によって交換されたり置換されたとしても、適切な結果を達成することができる。
【0088】
したがって、異なる実施形態であっても、特許請求の範囲と均等なものであれば、添付される特許請求の範囲に属する。