(57)【要約】【課題】  作成したソフトウェアについて、製造工程開始後かつテスト工程開始前の期間に、テスト工程において見つけるべきバグが多く含まれる機能を予測する。【解決手段】  本発明は、近い過去に修正された箇所ほど近い将来にも修正されやすいという前提の下、ソースコードの変更履歴を取得し、該変更履歴からバグの修正が行われたと判断できるリビジョンのみに限定して、機能的な関連の強いソースコードの変更箇所を導出するための行列を作成し、該行列をクラスタリングすることによりバグが多く含まれる機能のソフトウェアの機能を推定する。【選択図】  図１
2016024784.tif 000002
【特許請求の範囲】
【請求項１】
ソースコード上のバグが多く含まれる機能を検出するためのバグ予測装置であって、
近い過去に修正された箇所ほど近い将来にも修正されやすいという前提の下、ソースコードの変更履歴を取得し、該変更履歴からバグの修正が行われたと判断できるリビジョンのみに限定して、機能的な関連の強いソースコードの変更箇所を導出するための行列を作成し、該行列をクラスタリングすることによりバグが多く含まれる機能のソフトウェアの機能を推定するバグ推定手段
を有することを特徴とするバグ予測装置。
【請求項２】
前記バグ推定手段は、
少なくとも、ソースコードのリビジョン毎の変更履歴、コミットメッセージを格納した変更履歴記憶手段と、
前記変更履歴記憶手段からリビジョン毎の変更箇所を抽出して変更リビジョン一覧を変更箇所記憶手段に登録する変更箇所登録手段と、
前記変更履歴記憶手段からバグを修正したと判断可能なリビジョンを前記コミットメッセージに基づいて抽出し、バグ修正リビジョン記憶手段に登録するバグ修正リビジョン登録手段と、
前記変更箇所記憶手段から取得した前記変更リビジョン一覧について、前記バグ修正リビジョン記憶手段から取得した修正したリビジョン毎に２つの変更箇所が共に変更されているかを示す行列を生成し、修正箇所行列記憶手段に登録する修正箇所行列登録手段と、
前記修正箇所行列記憶手段の行列についてクラスタリングを行い、関連性の強い変更箇所同士をクラスタとし、クラスタ記憶手段に格納するクラスタリング手段と、
前記クラスタ記憶手段から取得した各クラスタを構成するすべての変更箇所に基づいて、前記変更箇所記憶手段から変更箇所のリビジョンを取得し、該リビジョンに基づいて、前記バグ修正リビジョン記憶手段から各リビジョンのコミットメッセージを取得し、該コミットメッセージの特徴語を抽出することにより、バグが含まれると推定されるソフトウェアの機能の名前を抽出する特徴語抽出手段と、
を有する請求項１記載のバグ予測装置。
【請求項３】
前記修正箇所行列登録手段は、
前記行列の行及び列の数を変更箇所の数とし、前記修正したリビジョン毎に、変更箇所iと変更箇所jが共に変更されている場合は、該行列の要素(i,j)を１とし、そうでなければ０とする手段を含み、
前記クラスタリング手段は、
前記行列の要素(i,j)が１の変更箇所行列に対してクラスタリングを行う手段を含む
請求項２記載のバグ予測装置。
【請求項４】
ソースコード上のバグが多く含まれる機能を検出するための装置におけるバグ予測方法であって、
近い過去に修正された箇所ほど近い将来にも修正されやすいという前提の下、ソースコードの変更履歴を取得し、該変更履歴からバグの修正が行われたと判断できるリビジョンのみに限定して、機能的な関連の強いソースコードの変更箇所を導出するための行列を作成し、該行列をクラスタリングすることによりバグが多く含まれる機能のソフトウェアの機能を推定するバグ推定ステップ
を行うことを特徴とするバグ予測方法。
【請求項５】
前記バグ推定ステップにおいて、
少なくとも、ソースコードのリビジョン毎の変更履歴、コミットメッセージを格納した変更履歴記憶手段からリビジョン毎の変更箇所を抽出して変更リビジョン一覧を変更箇所記憶手段に登録する変更箇所登録ステップと、
前記変更履歴記憶手段からバグを修正したと判断可能なリビジョンを前記コミットメッセージに基づいて抽出し、バグ修正リビジョン記憶手段に登録するバグ修正リビジョン登録ステップと、
前記変更箇所記憶手段から取得した前記変更リビジョン一覧について、前記バグ修正リビジョン記憶手段から取得した修正したリビジョン毎に２つの変更箇所が共に変更されているかを示す行列を生成し、修正箇所行列記憶手段に登録する修正箇所行列登録ステップと、
前記修正箇所行列記憶手段の行列についてクラスタリングを行い、関連性の強い変更箇所同士をクラスタとし、クラスタ記憶手段に格納するクラスタリングステップと、
前記クラスタ記憶手段から取得した各クラスタを構成するすべての変更箇所に基づいて、前記変更箇所記憶手段から変更箇所のリビジョンを取得し、該リビジョンに基づいて、前記バグ修正リビジョン記憶手段から各リビジョンのコミットメッセージを取得し、該コミットメッセージの特徴語を抽出することにより、バグが含まれると推定されるソフトウェアの機能の名前を抽出する特徴語抽出ステップと、
を有する請求項４記載のバグ予測方法。
【請求項６】
前記修正箇所行列登録ステップにおいて、
前記行列の行及び列の数を変更箇所の数とし、前記修正したリビジョン毎に、変更箇所iと変更箇所jが共に変更されている場合は、該行列の要素(i,j)を１とし、そうでなければ０とし、
前記クラスタリングステップにおいて、
前記行列の要素(i,j)が１の変更箇所行列に対してクラスタリングを行う
請求項５記載のバグ予測方法。
【請求項７】
コンピュータを、
請求項１乃至３のいずれか１項に記載のバグ予測装置の各手段として機能させるためのバグ予測プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、バグ予測装置及び方法及びプログラムに係り、特に、ソースコード上のバグを予測するためのバグ予測装置及び方法及びプログラムに関する。
【背景技術】
【０００２】
ソースコード上でバグのありそうな箇所を連続するバージョンのソースコードから予測する技術や（例えば、非特許文献１参照）、ソースコード上で修正の多い箇所が、近い将来も修正される傾向にある、という経験則に基づいたバグ予測技術がある（例えば、非特許文献２参照）。
【０００３】
また、ソースコードの中で同時に変更される傾向にある箇所は機能的な関連性が高い、という経験則による、ソースコードから機能への多対多マッピング技術がある（例えば、非特許文献３参照）。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】Y. Higo, K. Murao, S. Kusumoto, K. Inoue, "Predicting Fault-Prone Modules Based on Metrics Transitions", DEFECTS '08.
【非特許文献２】S. Kim, T. Zimmermann, E.J. Whitehead, and A. Zeller, "Predicting faults from cached history," ICSE '07.
【非特許文献３】R. Robbes, D. Pollet, and M. Lanza, "Logical coupling based on fine-grained change information," WCRE '08.
【非特許文献４】"An efficient algorithm for large-scale detection of protein families". A. J. Enright*, S. Van Dongen and C.A. Ouzounis, Nucleic Acids Research, 2002, Vol. 30, No. 7 1575-1584.
【非特許文献５】"出現頻度と連接頻度に基づく専門用語抽出",中川裕志,湯本紘彰,森辰則,自然言語処理2003.
【非特許文献６】"Identifying Linux bug fixing patches", Yuan Tian; J.: Lo, D., ICSE 2012.
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、上記の非特許文献１の技術では、バグ予測の結果が「モジュール」であり、バグの多い「機能」を求められない、という問題がある。
【０００６】
また、非特許文献２の技術は、バグが含まれそうなソースコード上の位置を予測可能ではあるが、バグの多い「機能」は求められない。
【０００７】
非特許文献３の技術は、上記の非特許文献１，２の技術によってバグの多いソースコード箇所を求めた上で、当該非特許文献３の技術を適用することで、バグの多い機能の候補を求めることはできるが、その候補のうちどの機能が実際にバグを含んでいるのか特定できないという問題がある。
【０００８】
本発明は、上記の点に鑑みなされたもので、作成したソフトウェアについて、製造工程開始後かつテスト工程開始前の期間に、テスト工程において見つけるべきバグが多く含まれる機能を予測することが可能なバグ予測装置及び方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
一態様によれば、ソースコード上のバグが多く含まれる機能を検出するためのバグ予測装置であって、
近い過去に修正された箇所ほど近い将来にも修正されやすいという前提の下、ソースコードの変更履歴を取得し、該変更履歴からバグの修正が行われたと判断できるリビジョンのみに限定して、機能的な関連の強いソースコードの変更箇所を導出するための行列を作成し、該行列をクラスタリングすることによりバグが多く含まれる機能のソフトウェアの機能を推定するバグ推定手段を有するバグ予測装置が提供される。
【発明の効果】
【００１０】
一態様によれば、作成したソフトウェアについて、製造工程開始後かつテスト工程開始前の期間に、テスト工程において見つけるべきバグが多く含まれるソフトウェアの機能を特定することが可能となる。
【図面の簡単な説明】
【００１１】
【図１】本発明の一実施の形態におけるバグ予測装置の構成例。
【図２】本発明の一実施の形態におけるVCSリポジトリの構成例。
【図３】本発明の一実施の形態におけるバグ予測装置の概要動作のフローチャート。
【図４】本発明の一実施の形態における修正箇所行列登録部で生成される行列の例。
【図５】本発明の一実施の形態における変更箇所登録処理の詳細フローチャート。
【図６】本発明の一実施の形態におけるバグ修正リビジョン登録処理の詳細フローチャート。
【図７】本発明の一実施の形態における修正箇所行列作成処理の詳細フローチャート。
【図８】本発明の一実施の形態における修正箇所行列初期化処理の詳細フローチャート。
【図９】本発明の一実施の形態におけるクラスタリング処理の詳細フローチャート。
【図１０】本発明の一実施の形態における特徴語抽出処理の詳細フローチャート。
【図１１】本発明の一実施の形態におけるクラスタ特徴語抽出処理の詳細フローチャート。
【発明を実施するための形態】
【００１２】
以下、図面と共に本発明の実施の形態を説明する。
【００１３】
本発明では、ソースコードの変更履歴からは、「近い過去に修正された箇所ほど将来にも修正されやすい」ことが知られており、バグの予測が可能であること、及び、ソースコードの変更履歴において、共有のリビジョンで共起的に変更される傾向にある一連のソースコード箇所は、機能的な関連の強いクラスタを構成するとき、ソースコードコメントやコミットメッセージを用いた特徴語抽出を併用することで、関連する機能の候補を導出可能であることを前提とする。
【００１４】
図１は、本発明の一実施の形態におけるバグ予測装置の構成例を示す。
【００１５】
同図に示すバグ予測装置１は、ユーザ端末２に接続され、ユーザ端末２から問い合わせに対して、バグの多い機能を出力する。
【００１６】
バグ予測装置１は、変更箇所登録部１０、バグ修正リビジョン登録部２０、修正箇所行列登録部３０、クラスタリング部４０、特徴語抽出部５０、VCS（Version Control System）リポジトリ１１、変更箇所記憶部１２、バグ修正リビジョン記憶部１３、修正箇所行列記憶部１４、クラスタ記憶部１５を有する。
【００１７】
VCSリポジトリ１１は、一般的には、図２に示すような機能を有する。リビジョン記憶部１１１は、リビジョン毎に管理下のファイル名、ファイル内容、コミットメッセージを記憶する。ファイル差分抽出機能１１２は、ユーザ端末２からコミット操作があると、追加、変更、削除のあったファイル名とコミットメッセージ及び、新しいリビジョンを取得し、ユーザ手元のファイルと、リビジョン記憶部１１１にある最新のリビジョンのファイルを比較して、差分を抽出する。リビジョン記録機能１１３は、差分、コミットログ、リビジョン番号をリビジョン記憶部１１１に追加し、当該処理が完了したことをユーザ端末２に通知する。リビジョン間差分計算機能１１４は、ユーザの比較操作により、リビジョン番号を２つ取得し、２つのリビジョン間にある差分（ファイルの存在、ファイルの内容）を求める。関数名導出機能１１５は、差分の箇所の前後コンテキストをもとに、その箇所の関数名を導出する。コミットメッセージ抽出機能１１６は、２つのリビジョン間にある全てのコミットメッセージを抽出し、差分の内容、差分箇所の関数名、コミットメッセージを返却する。なお、図１では、VCSリポジトリ１１をバグ予測装置１内に設けているが、この例に限定されることなく、バグ予測装置１の外部に設けられていてもよい。
【００１８】
次に、上記の構成における各部の処理について説明する。
【００１９】
図３は、本発明の一実施の形態におけるバグ予測装置の概要動作のフローチャートである。
【００２０】
ステップ２１０）  変更箇所登録部１０は、ユーザ端末２から問い合わせがあると、VCSリポジトリ１１からリビジョンを読み出し、各リビジョンの変更箇所を収集して、変更箇所記憶部１２に登録する。ユーザ端末２から問い合わせとして、VCSリポジトリ１１の場所の指定が入力される。また、収集される変更箇所は、ファイル名と関数名からなる。変更箇所記憶部１２は、収集された変更箇所のリビジョンの一覧である変更リビジョン一覧を持つ。詳細な処理については図５で説明する。
【００２１】
ステップ２２０）  バグ修正リビジョン登録部２０は、VCSリポジトリ１１から読み出したコミットメッセージに基づいて、バグを修正したと判断可能なリビジョンを、バグ修正リビジョン記憶部１３に登録する。
【００２２】
ステップ２３０）  修正箇所行列登録部３０は、ステップ２１０で変更箇所記憶部１２に登録された変更箇所の集合について、ステップ２２０でバグ修正リビジョン記憶部１３に登録されたバグ修正のリビジョンの１つ１つに、２つの変更箇所が共に変更されているかを表す行列を作成する。具体的には、図４に示すように、バグ修正リビジョン毎に１つの行列を作成する。行列の大きさは、行、列ともに、変更箇所の数である。行列は特定のリビジョンにおいて２つの変更箇所が共に変更されていることを表す。変更箇所iと変更箇所jがあるとき、着目するリビジョンにおいてiとjが共に変更されているならば、行列の要素（i,j）を"１"とし、そうでなければ"０"とする。図４の例は、変更箇所１と２のみがあるリビジョンにおいて変更されていることを示す。
【００２３】
得られた行列は修正箇所行列記憶部１４に登録される。
【００２４】
ステップ２４０）  クラスタリング部４０は、修正箇所行列記憶部１４に登録された修正箇所行列の集合にクラスタリングアルゴリズムを適用することで、関連性の強い変更箇所同士をクラスタとする。具体的には、修正箇所行列記憶部１４から修正箇所行列を読み出し、当該修正箇所行列に対して、与えられた複数のグラフから関連の高い部分グラフを求める技術（例えば、非特許文献４）を適用することで、分類結果であるクラスタが得られる。クラスタは変更箇所の集合で構成され、クラスタ記憶部１５に格納される。
【００２５】
ステップ２５０）  特徴語抽出部５０は、クラスタ記憶部１５のバグが含まれると考えられるソフトウェア機能の名前を、コミットメッセージに対する特徴語抽出により求める。具体的には、クラスタ記憶部１５からクラスタリング結果を読み出し、個々のクラスタについて、ソフトウェア機能の名前を取得する。その処理内容は、クラスタを構成するすべての修正箇所を、変更箇所記憶部１２を参照することにより、全ての変更箇所から変更リビジョン一覧を取得した後、各リビジョンにおけるコミットメッセージをバグ修正リビジョン記憶部１３から取得し、コミットメッセージ群に対して、特徴的な単語を抽出する自然言語処理手法（例えば、非特許文献５参照）のような特徴語抽出アルゴリズムを適用する。得られた特徴語を、バグが含まれると考えられるソフトウェア機能名としてユーザ端末２に出力する。
【００２６】
次に、上記のステップ２１０の変更箇所登録処理の詳細を説明する。
【００２７】
図５は、本発明の一実施の形態における変更箇所登録処理の詳細フローチャートである。
【００２８】
以下のステップ３１０〜３３０の処理を、VCSリポジトリ１１内のすべてのリビジョンについて繰り返す。
【００２９】
ステップ３１０）  変更箇所登録部１０は、VCSリポジトリ１１中の着目しているi番目のリビジョンと、その１つ前のリビジョンを比較し、差分を抽出する。差分を抽出する際に、VCSのdiffコマンドを想定し、"＋"、"−"、"*"、"!"などの記号で示された差分を、差分箇所毎に分類して保持する。
【００３０】
ステップ３２０）  ステップ３１０で得られたそれぞれの差分に対して、差分箇所の位置する関数名を取得する。取得できない場合は近傍のシンボル名を用いる。
【００３１】
ステップ３３０）  差分箇所を変更箇所記憶部１２に登録する。
【００３２】
次に、上記のステップ２２０のバグ修正リビジョン登録処理の詳細を説明する。
【００３３】
図６は、本発明の一実施の形態におけるバグ修正リビジョン登録処理の詳細フローチャートである。
【００３４】
バグ修正リビジョン登録部２０は、読み出したVCSリポジトリ１１内のすべてのリビジョンに対して、以下のステップ４１０〜４４０までの処理を繰り返す。
【００３５】
ステップ４１０）  VCSリポジトリ１１から読み出されたリビジョンのコミットメッセージを取得する。
【００３６】
ステップ４２０）  コミットメッセージに基づいて、パッチがバグフィックスを含むかどうかを判断する手法（例えば、非特許文献６）を適用してバグの修正を表す表現が含まれているかを判断する。
【００３７】
ステップ４３０）  バグの修正を表す表現が含まれている場合には、ステップ４４０に移行し、含まれていない場合には、ステップ４１０の処理に戻る。
【００３８】
ステップ４４０）  コミットメッセージにバグの修正を表す表現が含まれている場合には、当該リビジョンの番号とコミットメッセージをバグ修正リビジョン記憶部１３に登録する。
【００３９】
次に、ステップ２３０の修正箇所行列作成処理の詳細を説明する。
【００４０】
図７は、本発明の一実施の形態における修正箇所行列作成処理の詳細フローチャートである。
【００４１】
ステップ５１０）  修正箇所行列登録部３０は、バグ修正リビジョン記憶部１３からリビジョンを読み出す。
【００４２】
ステップ５２０）  読み出したリビジョンの数をRvとする。
【００４３】
ステップ５３０）  変更箇所記憶部１２から変更箇所を読み出す。
【００４４】
ステップ５４０）  読み出した変更箇所の数をPとする。
【００４５】
ステップ５５０）  処理したリビジョンの数revを０に初期化する。
【００４６】
ステップ５６０）  修正箇所行列の初期化処理を行う。詳細な処理は図８で説明する。
【００４７】
ステップ５７０）  rev=rev+1とする。
【００４８】
ステップ５８０）  rev＜Rvであればステップ５６０に戻り、rev≧Rvであれば当該修正箇所行列登録部３０の処理を終了する。
【００４９】
次に、上記のステップ５６０の処理を詳細に説明する。
【００５０】
図８は、本発明の一実施の形態における修正箇所行列初期化処理の詳細フローチャートである。
【００５１】
ステップ６０１０）  修正箇所行列登録部３０は、変更箇所記憶部１２からrev番目の変更箇所を読み出し、Rとする。
【００５２】
ステップ６０２０）  T=P×Pのゼロ行列とする（ただし、Pは変更箇所記憶部１２から読み出された変更箇所の数）。
【００５３】
ステップ６０３０）  変更箇所iをi=0とする。
【００５４】
ステップ６０４０）  変更箇所ｊをj=i+1とする。
【００５５】
ステップ６０５０）  i番目とj番目のユニークな変更箇所が、ともに、Rに含まれているかを判断する。
【００５６】
ステップ６０６０）  含まれている場合にはステップ６０７０に移行し、含まれていない場合にはステップ６０８０に移行する。
【００５７】
ステップ６０７０）  T(i,j)=T(j,i)＝１とする。
【００５８】
ステップ６０８０）  j=j+1とする。
【００５９】
ステップ６０９０）  j＜Pであればステップ６０４０に移行し、j≧Pであればステップ６１００に移行する。
【００６０】
ステップ６１００）  変更箇所iをi=i+1とする。
【００６１】
ステップ６１１０）  i＜Pであればステップ６０４０に戻り、i≧Pであればステップ６１２０に移行する。
【００６２】
ステップ６１２０）  行列Tとリビジョンrevを修正箇所行列記憶部１４に登録する。
【００６３】
次に、図３のステップ２４０のクラスタリング処理の詳細について説明する。
【００６４】
図９は、本発明の一実施の形態におけるクラスタリング処理の詳細フローチャートである。
【００６５】
ステップ７１０）  クラスタリング部４０は、修正箇所行列記憶部１４からリビジョン毎の修正箇所行列を取り出す。
【００６６】
ステップ７２０）  取り出した修正行列群に、与えられた複数のグラフから関連の高い部分を求める既存手法（例えば、非特許文献４）を適用してクラスタリングを行う。
【００６７】
ステップ７３０）  ステップ７２０でクラスタリングされた各クラスタをクラスタ記憶部１５に登録する。
【００６８】
次に、図３のステップ２５０の特徴語抽出処理の詳細について説明する。
【００６９】
図１０は、本発明の一実施の形態における特徴語抽出処理の詳細フローチャートである。
【００７０】
ステップ８１０）  特徴語抽出部５０は、クラスタ記憶部１５からすべてのクラスタを読み出す。
【００７１】
ステップ８２０）  変更箇所記憶部１２からすべての変更箇所を読み出す。
【００７２】
ステップ８３０）ステップ８１０で読み出されたすべてのクラスタに対して、クラスタ特徴語抽出処理を行う。詳細については図１１で詳述する。
【００７３】
ステップ８４０）  ステップ８３０で得られた特徴語を、クラスタが表すバグの多い機能として出力する。
【００７４】
上記のステップ８３０のクラスタ特徴語抽出処理について説明する。
【００７５】
図１１は、本発明の一実施の形態におけるクラスタ特徴語抽出処理の詳細フローチャートである。
【００７６】
ステップ９１０）特徴語抽出部５０は、クラスタ記憶部１５から読み出されたクラスタを構成する変更箇所を取得する。
【００７７】
ステップ９２０）  変更箇所を変更しているリビジョンの集合を取得する。
【００７８】
ステップ９３０）  メモリ（図示せず）上の文書DをD=φとする。
【００７９】
ステップ９４０）  バグ修正リビジョン記憶部１３から、ステップ９２０で取得したリビジョンの集合の各リビジョンのコミットメッセージを読み出す。
【００８０】
ステップ９５０）  リビジョンのコミットメッセージを文書Dに追加する。
【００８１】
ステップ９６０）  上記のステップ９４０，９５０の処理を、リビジョン集合のすべてのリビジョンに対して繰り返した後、文書Dに対する特徴語抽出を実行する。特徴語抽出処理は、特徴的な単語を抽出する自然言語処理手法（例えば、非特許文献５）をはじめとする既存の特徴語抽出技術を適用することにより実現できる。
【００８２】
本実施の形態に係るバグ予測装置１は、例えば、１つ又は複数のコンピュータに、本実施の形態で説明する処理内容を記述したプログラムを実行させることにより実現可能である。すなわち、バグ予測装置１が有する機能は、当該コンピュータに内蔵されるCPUやメモリ、ハードディスクなどのハードウェア資源を用いて、バグ予測装置１で実施される処理に対応するプログラムを実行することによって実現することが可能である。また、上記プログラムは、コンピュータが読み取り可能な記録媒体（可搬メモリ等）に記録して、保存したり、配布したりすることが可能である。また、上記プログラムをインターネットや電子メールなど、ネットワークを通して提供することも可能である。
【００８３】
本発明は、上記の実施の形態に限定されることなく、特許請求の範囲内において、種々変更・応用が可能である。
【符号の説明】
【００８４】
１  バグ予測装置
２  ユーザ端末
１０  変更箇所登録部
１１  VCS（Version Control System）リポジトリ
１２  変更箇所記憶部
１３  バグ修正リビジョン記憶部
１４  修正箇所行列記憶部
１５  クラスタ記憶部
２０  バグ修正リビジョン登録部
３０  修正箇所行列登録部
４０  クラスタリング部
５０  特徴語抽出部
１１１  リビジョン記憶部
１１２  ファイル差分抽出機能
１１３  リビジョン記録機能
１１４  リビジョン間差分計算機能
１１５  関数名導出機能
１１６  コミットメッセージ抽出機能
【図１】
2016024784.tif 000003
【図２】
2016024784.tif 000004
【図３】
2016024784.tif 000005
【図４】
2016024784.tif 000006
【図５】
2016024784.tif 000007
【図６】
2016024784.tif 000008
【図７】
2016024784.tif 000009
【図８】
2016024784.tif 000010
【図９】
2016024784.tif 000011
【図１０】
2016024784.tif 000012
【図１１】
2016024784.tif 000013