Mercurial > hg > Papers > 2015 > tatsuki-thresis
changeset 18:96fc201c4e8c
add bibi
author | tatsuki |
---|---|
date | Wed, 18 Feb 2015 12:24:03 +0900 |
parents | ceeb95a12d64 |
children | 7e9bd506ceae |
files | bibliography.tex chapter1.tex chapter2.tex chapter3.tex chapter4.tex chapter7.tex chapter8.tex fig/TreeMapGet.pdf fig/XACML.graffle fig/XACML.pdf main.pdf main.tex |
diffstat | 12 files changed, 718 insertions(+), 658 deletions(-) [+] |
line wrap: on
line diff
--- a/bibliography.tex Tue Feb 17 23:32:21 2015 +0900 +++ b/bibliography.tex Wed Feb 18 12:24:03 2015 +0900 @@ -7,8 +7,17 @@ %これをベースに書き換えた方が楽かも。 %書籍、論文、URLによって若干書き方が異なる。 %URLを載せる人は参考にした年月日を最後に記入すること。 - +\bibitem{1} +玉城将士 非破壊的木構造を用いた分散CMSの設計と実装 +\bibitem{2} +大城信康 分散Database Jungleに関する研究 +\bibitem{3} +玉城将士、河野真治. Cassandraを使ったスケーラビリティのあるcmsの設計.情報処理学会,March 2011 +\bibitem{4} +Eric Redmond and Jim R. Wilson 7つのデータベース7つの世界 +\bibitem{5} +The MongoDB 2.6 Manual http://docs.mongodb.org/manual/ +\bibitem{6} +XACML References and Products \\ \verb|http://docs.oasis-open.org/xacml/xacmlRefs.html| -\bibitem{hoge} -hoge \end{thebibliography}
--- a/chapter1.tex Tue Feb 17 23:32:21 2015 +0900 +++ b/chapter1.tex Wed Feb 18 12:24:03 2015 +0900 @@ -8,8 +8,7 @@ \section{研究目的} 我々があつかっている知識は木構造であることが多い。 例えば書籍や組織情報などである。 -RDB上に木構造を格納する際、nodeとnodeの関係を定義したテーブルを用意し、表構造に変換するが、それではデータ構造が複雑になってしまう。 -そのため、木構造をそのままデータベースに格納することで、直接的な操作や効率的なサービスが可能になる。 +RDB上に木構造を格納する際、nodeとnodeの関係を定義したテーブルを用意し、表構造に変換するが、木構造のままデータベースに格納することで、直接的な操作や効率的なサービスが可能になる考えられる。 また、データベースを使用するウェブサービスの規模も年々大きなものとなり、それに比例して負荷も増大し、その結果サービスが停止する自体が多々見られるようになった。 そのため、データベースの処理性能はそのままサービスの質につながっている重要な項目となっている。 @@ -24,17 +23,17 @@ してはスケールアウトが求められている。 本研究で扱うスケーラビリティとはスケールアウトのことをさす。 -データを分散させて扱う分散データシステムにおいて、データの整合性(一貫性)、常にアクセスが可能であること(可用性)、データを分散させやすいかどうか(分割耐性)、この3つを同時に保証することは出来ない。 +分散データシステムにおいて、データの整合性(一貫性)、常にアクセスが可能であること(可用性)、データを分散させやすいかどうか(分割耐性)、この3つを同時に保証することは出来ない。 この定義をCAP定理と言う。 今、最も使われているデータベースであるRDBは、一貫性と可用性を重視している。 -そのため、データを分割し、複数のノードにデータを分散させると、整合性のチェックやデータの統合処理性能が低下する等の問題があり、データを分割し、マシンを追加して負荷を分散することが困難である。 +そのため、データを分割し、複数のノードにデータを分散させると、整合性のチェック等の問題があり、スケールアウトを行うことが困難である。 当研究室では、これらの問題を解決した、煩雑なデータ設計が必要ないスケーラビリティのあるデータベースを目指して、非破壊的木構造データベースJungleを開発している。 -Jungleは、全体の整合性ではなく、木に閉じた局所的な整合性を保証している。 +Jungleは、全体の整合性ではなく、木ごとに閉じた局所的な整合性を保証している。 また、整合性のある木同士をマージすることで新しい整合性のある木をす繰り出すことも可能であるため、データの伝搬も容易である。 そのため、Jungleは可用性と分割耐性を重視しつつ、整合性も持つ。 %しかし、Jungleはまだ、データベースとして必要な検索等の機能が実装されておらず、実際に業務等で使用されるアプリケーションに組み込み、使用できる状態ではなかった。 Jungleは、これまでの開発によって木構造を格納する機能をもっている。 -そこで、当研究では、共同研究を行っているSymphonies社が開発している組織の中の許認可を管理するアプリケーションmaTrixにJungleを組み込み、実装すべきAPIの洗い出しを行い、その後実用DBとしての性能があるか実証実験を行う。 +そこで、当研究では、Jungle上に組織の許認可管理アプリケーションmaTrixを実装し、データベースの表現力、機能の十分性、実用的な性能実証実験を行う。
--- a/chapter2.tex Tue Feb 17 23:32:21 2015 +0900 +++ b/chapter2.tex Wed Feb 18 12:24:03 2015 +0900 @@ -6,10 +6,11 @@ \section{Jungleのデータ構造} 研究目的でも述べたが、我々が扱う知識は主に木構造である。 -Jungleはそれらの知識をそのまま格納するため、データ形式は非破壊的木構造を採用している。 +Jungleはそれらの知識を直接格納するため、データ形式は非破壊的木構造を採用している。 はじめに、非破壊的木構造と通常の破壊的木構造の違いについて説明を行う。 -通常の破壊的木構造は、データの編集を行う際に、データを上書き更新する(図\ref{fig:Des})ため、編集を行っている間ずっと木にロックをかける必要があり、また、閲覧者がいる場合、検索途中にデータが変わることを避けるために、データの検索が終わるまで書き換えを待つ必要がある。 +通常の破壊的木構造は、データの編集を行う際に、データを上書き更新する(図\ref{fig:Des})ため、編集を行っている間ずっと木にロックをかける必要がある。 +また、閲覧者がいる場合検索途中にデータが変わることを避けるために、データの検索が終わるまで書き換えを待つ必要がある。 しかし、これではロックによりスケーラビリティが損なわれてしまう。 \begin{figure}[h] @@ -27,7 +28,7 @@ \begin{figure}[h] \begin{center} -\includegraphics[height = 5cm , bb=0 0 459 207]{fig/destructive_tree.pdf} +\includegraphics[height = 5cm , bb=0 0 459 207]{fig/non_destructive_tree.pdf} \caption{非破壊的木構造の編集} \label{fig:nonDes} \end{center} @@ -44,7 +45,7 @@ \end{center} \end{figure} -また、過去のTreeは全て保持しているため、いつでもアクセスすることが可能である。 +また、Jungleは過去のversionのTreeを全て保持しているため、いつでもアクセスすることが可能である。 \section{分散機能} Jungleの分散機能は、当研究室で開発を行っている並列分散フレームワークであるAliceを使用している。
--- a/chapter3.tex Tue Feb 17 23:32:21 2015 +0900 +++ b/chapter3.tex Wed Feb 18 12:24:03 2015 +0900 @@ -1,8 +1,8 @@ \chapter{組織中の許認可管理\\アプリケーションmaTrix} maTrixとはSymphonies社が開発しているアカウント管理、許諾判定システムのことである。 -人や組織の情報などを保持しており、それらの情報を関連付けることで組織の構造を表現し、許認可管理を行う。 -本章ではmaTrixの説明と、Jungle上でどのようにmaTrixを表現したかの説明を行う。 +人、組織、役割等の情報などを木構造として持っている、それらの情報を関連付けることで組織の構造を表現し、許認可管理を行う。 +本章ではmaTrixの説明と、Jungle上におけるmaTrixの実装方法の説明を行う。 \label{chap:concept} @@ -10,23 +10,21 @@ matrixは人、役職、役割、役割記述要素といったデータ(表\ref{list:maTrixData})を用いた組織構造と、許認可の判断に用いるポリシーファイルの2つのデータを持っている。 \begin{table}[h] -\caption{maTrixの組織構造} +\caption{maTrixの保持する木構造データの例} \label{list:maTrixData} \begin{center} \begin{tabular}{|l|l|} \hline -人物Tree & 人のデータが入っている。1人1人ユニークなpersonIdを持つ \\ \hline -組織Tree & 組織のデータが入っている。企業ごとにユニークなorgIdを持つ ~\\ \hline -役割Tree & 人や組織の役割データが入っている。役割毎にユニークなroleIdを持つ ~ \\ \hline -役割記述要素Tree & 役割が持っている要素が記述されている。 ~ \\ - & 役割記述要素毎にユニークなrdeIdを持つ ~\\ \hline +人物 & 人のデータが入っている。personIdを持つ \\ \hline +組織 & 組織のデータが入っている。orgIdを持つ ~\\ \hline +役割 & 人や組織の役割データが入っている。roleIdを持つ ~ \\ \hline +役割記述要素 & 役割が持っている要素が記述されている。rdeIdを持つ ~\\ \hline \end{tabular} \end{center} \end{table} -表\ref{list:maTrixData}に書いてあるように、maTrixの保持している組織のデータはそれぞれがユニークなIdを保持しているため、それを利用しお互いに参照することが可能である。 -これらのデータを元にmaTrixは組織構造を構築している。 -例として、人物Treeと組織Treeの組み合わせで組織運用モデルを表現しており、役割Treeは役割モデルを表現している。 -このように様々な情報が参照しあうことでたくさんのデータモデルを表現している。 +これらのデータはIdを用いて他の木の参照を行い、組織構造を構築している。 +組織構造の例として、人物と組織の組み合わせで組織運用モデルを表現しており、役割は自身のみで役割モデルを表現している。 +このように様々な木構造が参照しあうことで多数のデータモデルを表現している。 以下にmaTrixの組織情報モデルを記す(図\ref{fig:sosikiTree})。 \begin{figure}[h] @@ -44,34 +42,33 @@ \begin{itembox}[l]{} \begin{verbatim} <Persons> -<Person id="p:1" type="Person"> -<accountId>a:26</accountId> -<lastName>東</lastName> -<name>東俊一</name> -<nameReading>あずましゅんいちくん</nameReading> -<roleRefIds>r:10 r:34</roleRefId> -</roleRefIds> -<parentOrganizations type="OrganizationMappedByRole"> -<OrganizationMappedByRole type="OrganizationMappedByRole"> -<organizationRefId>o:2</organizationRefId> -<roleRefId>r:10</roleRefId> -</OrganizationMappedByRole> -<OrganizationMappedByRole type="OrganizationMappedByRole"> -<organizationRefId>o:11</organizationRefId> -<roleRefId>r:34</roleRefId> -</OrganizationMappedByRole> -</parentOrganizations> -<priorities type="PriorityMappedByRole"> -<PriorityMappedByRole type="PriorityMappedByRole"> -<priority>0</priority> -<roleRefId>r:10</roleRefId> -</PriorityMappedByRole> -<PriorityMappedByRole type="PriorityMappedByRole"> -<priority>1</priority> -<roleRefId>r:34</roleRefId> -</PriorityMappedByRole> -</priorities> -</Person> + <Person id="p:1" type="Person"> + <accountId>a:26</accountId> + <lastName>東</lastName> + <name>東俊一</name> + <nameReading>あずましゅんいちくん</nameReading> + <roleRefIds>r:10 r:34</roleRefIds> + <parentOrganizations type="OrganizationMappedByRole"> + <OrganizationMappedByRole type="OrganizationMappedByRole"> + <organizationRefId>o:2</organizationRefId> + <roleRefId>r:10</roleRefId> + </OrganizationMappedByRole> + <OrganizationMappedByRole type="OrganizationMappedByRole"> + <organizationRefId>o:11</organizationRefId> + <roleRefId>r:34</roleRefId> + </OrganizationMappedByRole> + </parentOrganizations> + <priorities type="PriorityMappedByRole"> + <PriorityMappedByRole type="PriorityMappedByRole"> + <priority>0</priority> + <roleRefId>r:10</roleRefId> + </PriorityMappedByRole> + <PriorityMappedByRole type="PriorityMappedByRole"> + <priority>1</priority> + <roleRefId>r:34</roleRefId> + </PriorityMappedByRole> + </priorities> + </Person> </Persons> \end{verbatim} \end{itembox} @@ -84,7 +81,7 @@ \begin{center} \begin{tabular}{|l|l|} \hline Persons & この要素以下にPersonの情報があることを意味する~ \\ \hline -Person & 人の情報が以下にあることを示す。uniqueIdが割り振られている ~\\ \hline +Person & 人の情報が以下にあることを示す。PersonIdが割り振られている ~\\ \hline accontId & そのPersonのアカウントId。Tree同士の参照に用いる。 ~ \\ \hline lastName & 苗字 ~ \\ \hline name & フルネーム ~\\ \hline @@ -100,15 +97,13 @@ \end{center} \end{table} -Person.xmlを例で上げたが、役職Treeや役割Treeも同じような構造でデータを保持している。 -また、maTrixには、組織情報からデータを取得するFunctionが15種類実装されている。 +Person.xmlを例で上げたが、役職や役割も同じような構造でデータを保持しており、maTrixには組織情報からデータを取得するFunctionが15種類実装されている。 \section{Jungle上でのmaTrixのデータ構造の表現} -maTrixが保持している、人物Treeや役職Treeは、木構造のデータであるためそのままJungleに格納することができる。 -実際に人物Treeを格納した際のデータの形の一部を(図\ref{fig:PersonTree}、図\ref{fig:PersonTree})に示した。(図\ref{fig:PersonTree})は前章で表示 -したPerson.xmlと対応している。 +maTrixが保持している、人物や役職は、木構造のデータであるため直接Jungleに格納できる。 +実際に人物のデータを格納したJungleの構造を(図\ref{fig:PersonTree}、図\ref{fig:PersonTree})に示した。 \newpage @@ -126,12 +121,12 @@ \begin{center} \begin{tabular}{|l|} \hline \verb|<|Persons\verb|>| \\ -\verb|<|Person id="p:1" type="Person"\verb|>| \\ -\verb|<|PersonData\verb|>| \verb|<|/PersonData\verb|>| \\ -\verb|<|/Person\verb|>| \\ -\verb|<|Person id="p:2" type="Person"\verb|>| \\ -\verb|<|PersonData\verb|>| \verb|<|/PersonData\verb|>| \\ -\verb|<|/Person\verb|>| \\ +\ \verb|<|Person id="p:1" type="Person"\verb|>| \\ +\ \ \verb|<|PersonData\verb|>| \verb|<|/PersonData\verb|>| \\ +\ \verb|<|/Person\verb|>| \\ +\ \verb|<|Person id="p:2" type="Person"\verb|>| \\ +\ \ \verb|<|PersonData\verb|>| \verb|<|/PersonData\verb|>| \\ +\ \verb|<|/Person\verb|>| \\ \verb|<|/Persons\verb|>|\\ \hline \end{tabular} \end{center} @@ -141,8 +136,8 @@ 図\ref{fig:PersonTree}は、表\ref{list:PersonTree}をJungleに格納したものである。 Jungleは、TreeNodeに\verb|<|Key String, Value Attribtue\verb|>|の組み合わせでデータを保持する。 -そのため、XMLのデータをTreeNodeに格納する際、要素の格納は\verb|<| Key "element", Value "要素名"\verb|>|、属性の場合は\verb|<|Key "要素名-属性名", Value "属性値"\verb|>|で格納する。 -属性格納時のKeyを、"要素名-属性名"にした理由は、属性名のみで格納してしまうと、Keyで検索を行う際に該当するNodeが増えすぎるため、keyを"要素名-属性名"とし、なるべくKeyの重複を避けるように格納した。 +そのため、XMLのデータをTreeNodeに格納する際、要素の格納は\verb|<| Key "element", Value "要素名"\verb|>|、属性の格納は\verb|<|Key "要素名-属性名", Value "属性値"\verb|>|で格納する。 +属性格納時のKeyを、"要素名-属性名"にした理由は、Indexで検索を行う際にKeyの重複を避けるためである。 \clearpage @@ -154,6 +149,7 @@ \end{center} \end{figure} +\clearpage \begin{table}[h] \caption{図\ref{fig:PersonTree2}に対応したXML} @@ -161,12 +157,12 @@ \begin{center} \begin{tabular}{|l|} \hline \verb|<|Person id="p:1" type="Person"\verb|>| \\ -\verb|<|accountId\verb|>|a:26\verb|<|/accountId\verb|>| \\ -\verb|<|lastName\verb|>|東\verb|<|/lastName\verb|>| \\ -\verb|<|name\verb|>|東俊一\verb|<|/name\verb|>| \\ -\verb|<|nameReading\verb|>|あずましゅんいちくん\verb|<|/nameReading\verb|>| \\ -\verb|<|roleRefIds\verb|>|r:10 r:34\verb|<|/roleRefIds\verb|>| \\ -\verb|<|その他の値\verb|>| \verb|<|/その他の値\verb|>| \\ + \ \verb|<|accountId\verb|>|a:26\verb|<|/accountId\verb|>| \\ + \ \verb|<|lastName\verb|>|東\verb|<|/lastName\verb|>| \\ + \ \verb|<|name\verb|>|東俊一\verb|<|/name\verb|>| \\ + \ \verb|<|nameReading\verb|>|あずましゅんいちくん\verb|<|/nameReading\verb|>| \\ + \ \verb|<|roleRefIds\verb|>|r:10 r:34\verb|<|/roleRefIds\verb|>| \\ + \ \verb|<|その他の値\verb|>| \verb|<|/その他の値\verb|>| \\ \verb|<|/Person\verb|>| \\ \hline \end{tabular} @@ -175,8 +171,8 @@ 図\ref{fig:PersonTree2}と表\ref{list:PersonTree2}も同じくPersonTreeの一部をJungleに格納した時の図である。 基本的な構造は図\ref{fig:PersonTree}と変わらないが、1箇所XMLの構造を変えてJungleに格納した箇所があるのでそこの解説を行う。 -Jungleはノードにデータを格納する際に、Key,Valueで格納するが、keyに対応するvalueは1つしか格納できない。 -そのため、表\ref{list:PersonTree2}の\verb|<|roleRefIds\verb|>|r:10 r:34\verb|<|/roleRefId\verb|>| の様に、2つの値をテキスト部分が保持している場合どちらか片方しか格納することが出来ない。 +Jungleはノードにデータを格納する際に、List構造を持つことが出来ないため、keyに対応するvalueは1つしか格納できない。 +よって、表\ref{list:PersonTree2}の\verb|<|roleRefIds\verb|>|r:10 r:34\verb|<|/roleRefId\verb|>| の様に、2つの値をテキスト部分が保持している場合どちらか片方しか格納することが出来ない。 そこで、読み込む際にデータ構造を、表\ref{list:maTrixDataChild}の様に書き換えてJungleに格納する。 \begin{table}[h] @@ -194,9 +190,8 @@ \end{center} \end{table} -\newpage この様にmaTrixのデータ構造をJungleにマッピングしていく。 - +また木構造同士の参照を用いて行う組織構造の表現は、JungleではTreeに対する検索で表現する。 \clearpage @@ -204,7 +199,8 @@ \section{maTrixのデータの版管理} maTrixは、組織構造を構成情報モデルとして表現し、版管理している。 -構成情報モデルはversion毎に存在し、各versionに対応した組織構造を構成するTreeを保持している。 +構成情報モデルはversion毎に存在し、各versionに対応した組織構造を構成する木構造の集合を保持している。 + \begin{figure}[h] \begin{center} \includegraphics[height = 6cm , bb=0 0 463 271]{fig/maTrixVersion1.pdf} @@ -228,7 +224,7 @@ \section{JungleでのmaTrixの版管理の表現} -JungleのTreeは、全てのversionのTreeでユニークなIdを保持しているため、Idを指定すれば、過去のTreeにアクセスすることが可能である。 +JungleのTreeは、全てのversionのTreeで単一なIdを保持しているため、Idを指定すれば、過去のTreeにアクセスすることが可能である。 それを利用し、Jungle上での過去の変更履歴を保持する構成情報モデルの表現は、構成情報モデルのversionと、各Treeのversionを保持し、関連付ける構成情報モデルTreeを作成し表現した。(図\ref{fig:configTree})。 \begin{figure}[h] \begin{center} @@ -261,26 +257,17 @@ 構成情報モデルversion:3に対応する人物Treeにアクセスする手順を以下に示す。 \begin{enumerate} -\item 構成情報Tree(図\ref{fig:configTree})からアクセスしたいversion情報を保持しているNodeを取得する(今回の例題ではversion3) -\item 取得したTreeNodeには、構成情報:version:3に対応した人物Treeなどのversionが記述されている(図\ref{fig:configTree})ので、人物Treeのverson(v:5)を取得する -\item 2で取得したversionの人物Treeにアクセスする(図\ref{fig:configTree2})。 +\item 構成情報Treeからアクセスしたいversion情報を保持しているNodeを取得する(今回の例題ではversion3) +\item 取得したTreeNodeには、構成情報:version:3に対応した人物Treeなどのversionが記述されているため、人物Treeのverson(v:5)を取得する +\item 2で取得したversionの人物Treeにアクセスする。 \end{enumerate} といった手順でJungleではmaTrixの構成情報モデルを表現する。 -\begin{figure}[h] -\begin{center} -\includegraphics[height = 10cm ,bb=0 0 563 325]{fig/configModel.pdf} -\caption{構成情報モデル:3に対するアクセス例} -\label{fig:configTree2} -\end{center} -\end{figure} - -\clearpage - - \section{申請の許認可} -maTrixを用いた許認可は、アクセス管理のルールを表現方法を定義するXACMLという言語で記述された、ポリシーファイルを用いて行う。 +maTrixを用いた許認可は、組織構造だけで判断されるわけではない。 +アクセス可能な時間や、貸出の場合は同時貸出数の上限など、組織構造以外のアクセスルールは組織構造だけでは表現できない。 +そのため、maTrixはアクセス管理のルールを表現方法を定義するXACMLという言語で記述された、ポリシーファイルを用いて許認可判断を行う。。 ポリシーファイルは、リポジトリで管理されており、アクセス要求にあったポリシーファイルが利用される。 以下にmaTrixでの申請の許認可の流れを記述する。 @@ -292,7 +279,7 @@ \end{enumerate} といった流れになる。 -maTrixの許認可を使用するメリットとして、許認可のログをとっておくことで、いつ、誰が、どのポリシーを元に、どんなことをしたか、の情報がいつでも取得可能であるため、不正アクセス等の問題発生時の解決等役立つ。 +maTrixの許認可を使用するメリットとして、許認可のログをとっておくことで、いつ、誰が、どのポリシーを元に、どんなことをしたか、の情報がいつでも取得可能であるため、データの不正改竄等の問題発生時の解決等役立つ。 といったメリットもある。 \clearpage @@ -312,7 +299,7 @@ \begin{figure}[h] \begin{center} -\includegraphics[height=10cm,bb=0 0 439 610]{fig/XACML.pdf} +\includegraphics[height=10cm,bb=0 0 526 308]{fig/XACML.pdf} \caption{XACMLのデータ構造} \label{fig:xacml} \end{center} @@ -380,4 +367,4 @@ \end{enumerate} といった流れになる。 - +Jungleが提供しているのはあくまで組織構造であるため、アクセス可能な時間等の条件に関してJungleは一切関与しない。
--- a/chapter4.tex Tue Feb 17 23:32:21 2015 +0900 +++ b/chapter4.tex Wed Feb 18 12:24:03 2015 +0900 @@ -1,13 +1,12 @@ -\chapter{仮} - +\chapter{Jungleに新しく追加したAPI} +前章ではmaTrixのデータ構造と許認可について説明を行った後、Jungle上にどのように構築するか記述した。 +本章では、Jungle上にmaTrixを構築するために新しく追加した機能について解説する。 \section{検索APIの実装} -Treeに対する検索は、java8の新機能であるlambda式を用いてfind関数を実装した。 +JungleのTreeに対する検索は、java8の新機能であるlambda式を用いてfind関数を実装した。 lambda式を使用することで、匿名クラスを使う時より簡潔にコードを記述できるようになった。 -find関数は、以下の様に定義されている。 - \begin{itembox}[l]{find関数の定義} \begin{verbatim} @@ -47,7 +46,7 @@ \begin{enumerate} \item find関数の処理の流れは、まず、第2、第3引数のString key,String valueを用いて、これらの値に対応したIndexが登録されているかを調べる、Indexがある場合はIndexを使用し値を返す。Indexがない場合は、Treeから深さ優先でTreeNodeを取得していく。(図\ref{fig:DepthFirstSearch}) -\item TreeNodeを取得したら、boolean Query.condition(TreeNode)を実行する。このconditionはfindを使用するときにlambda式で記述する。 +\item TreeNodeを取得したら、boolean Query.condition(TreeNode)を実行する。このconditionは実際にfindを使用する際にlambda式で記述する。 \item conditionの中では、TreeNodeのAttributeに対してgetを行い探索対象のデータをTreeNodeが保持しているかを調べる \item データを持っていた場合はTrueを、持っていなかった場合はFalseを返す \item conditionの返り値が、Trueだった場合取得したTreeNodeを返す。Falseだった場合は次のTreeNodeを取得し、2に戻る。 @@ -77,7 +76,6 @@ また、maTrix上に実装されていた、構成情報からデータを取得するFunctionも全て実装して、実際のmaTrixと同じようにデータのアクセスを行えるようにした。 -\clearpage \section{Jungle上のIndexの設計} Jungleの探索はTreeを全探索するので、探索の計算量はO(n)である。 そこで、Indexを使用することで効率よく探索を行えるようにする。 @@ -90,9 +88,9 @@ それに加え、FunctionalJavaのTreeMapは、データの更新が行われた際に、一度作られたTreeに対して更新を行わず過去のTreeを再利用し、更新後のTreeMap新しく返すため、メモリの使用量を抑えつつ複数のversionでIndexを保持できる。 Indexの型を以下に記す。 -\begin{itembox}[l]{Queryinterface} +\begin{itembox}[l]{Indexの型} \begin{verbatim} -TreeMap$<$String key,TreeMap$<$String value,List$<$TreeNode$>>>>$ +TreeMap<String key,TreeMap<String value,List<TreeNode>>> \end{verbatim} \label{interface} \end{itembox} @@ -100,6 +98,7 @@ このTreeMapに対しkeyでgetを行うと、keyに対応するIndexが登録されている場合、Indexを取得でき、取得したIndexに対し valueでgetを行うと、valueの値を持つNodeのListが返ってくる。 +\newpage {\large ParentIndex} TreeNodeでgetを行うと、親Nodeを返すParentIndexを実装した。 @@ -127,13 +126,12 @@ \end{tabular} \end{center} \end{table} + Jungleはノードの編集に、そのノードまでのNodePathを必要としたため、ParentIndexを実装するまでは、Indexの型を、TreeMap$<$String key, TreeMap$<$ String value , List$<$Pair$<$TreeNode,NodePath$>>>>$ -と定義し、返り値をPair$<$TreeNode,NodePath$>$というように、TreeNodeとそのTreeNodeへのNodePathのペアにすることでNode -の編集を可能にしていた。 -しかし、Treeの編集を行った際に、TreeNodeへのPathは常に変動する為、Index内のNodePathの更新コストが編集時のネックであ -った。 +と定義し、返り値をPair$<$TreeNode,NodePath$>$とし、TreeNodeとそのTreeNodeへのNodePathのペアにすることでNodeの編集を可能にしていた。 +しかし、Treeの編集を行った際に、TreeNodeへのPathは常に変動する為、Index内のNodePathの更新コストが編集時のネックであった。 しかし、ParentIndexを実装することで、TreeNodeからNodePathを取得できるようになったため、IndexにNodePathを入れる必要がなくなり、Indexは今の型で定義できるようになった。 -また、ParentIndexもIndexと同じようにFunctionalJavaのTreeMapを使用しているため、メモリの消費を抑えて、全てのversionのTreeで保持することが可能である。 +ParentIndexもIndexと同じようにFunctionalJavaのTreeMapを使用しているため、メモリの消費を抑えて、全てのversionのTreeで保持することが可能である。 以下にParentIndexを使用して、NodePathを取得する方法を示す。 \begin{enumerate} @@ -141,20 +139,15 @@ \item 親Nodeから子ノードのリストを取得する。 \item 子ノードのリストから、親Nodeをgetするのに使用したNodeがある位置のインデックスを取得する。 \item 3で取得したIndexをPathに追加する -\item rootNodeに辿り着くまで1 - 4を繰り返すと、対象へのNodePathが取得できる。 +\item rootNodeに辿り着くまで1 - 4を繰り返すと、対象NodeへのNodePathが取得できる。 \end{enumerate} -\clearpage - \section{過去のTreeに対するアクセス} -Jungle上でmaTrixの構成情報モデルの表現を行う際に、過去のTreeにアクセスする必要があるが、Jungleには、過去のTreeに対し、アクセスするAPIは実装されていなかったため実装を行った。 - - +Jungle上でmaTrixの構成情報モデルの表現を行う際に、過去のTreeにアクセスする必要がある。 Jungleは、クラスChangeSet内にTreeのデータを保持している。 ChangeSetからは、今のrevisionIdと、1つ前のTreeのデータを取得できるため、再帰的に過去のTreeのデータを取得できる。 - アクセスしたいTreeのrevisionIdを引数に取り、過去のTreeのデータの取得とrevisionIdの比較を繰り返すことで過去のTreeにアクセスする、getOldTree(long revisionId)を DefaultJungleTree内に実装した。 @@ -187,8 +180,6 @@ for文の中で、過去のTreeの取得と、revisionの比較を繰り返している。 revisionが一致した場合は、そのversionのTreeを返し、アクセスしたいrevisionを持つTreeが見つからなかった場合は、エラーを返す。 -\newpage - \section{JungleXMLReader} maTrixからXML形式で書き出されたデータをJungleに格納するためのAPIとして、XMLReaderを実装した。 JungleXMLReaderの実装にはsax(Simple API for XML)を用いた。 @@ -214,16 +205,16 @@ \end{table} saxでは、org.xml.sax.helpers.DefaultHandlerという形で、ContentHandlerのデフォルト機能が提供されているため、プロ -グラマはこれを継承することで、必要なイベント処理のみをoverrideして記述できるようになっている。 +グラマはこれを継承することで必要なイベント処理のみをoverrideして記述できるようになっている。 XMLReaderで使用しているReadXmlHandlerは、startElement、charactor、endElement、endDocument、の4つのイベントを使用しており、XMLを読み込む際に、Treeを構築しながらParseを行う。 -startElementが呼ばれた時は、今いる地点の下に新しくNodeを作りそのNodeへ移動し、NodeにAttributeの値を格納する。 +startElementが呼ばれた時は、今いる地点の下に新しくNodeを作り、Attributeの値を格納する。 charactorが呼ばれた時は、今いるNodeにテキストデータを格納する。 endElementが呼ばれたら、今いるNodeの親ノードに移動する。 以上の3つの関数を用いて、XMLのデータをTreeに格納していき、endDocumentが呼ばれた時に木のCommitを行っている。 -データの格納は、3.2章Jungle上でのmaTrixのデータ構造の表現述べたように、多少Jungleに適合した形に書き換えてから行う。 +データの格納は、Jungle上でのmaTrixのデータ構造の表現で述べたように、多少Jungleに適合した形に書き換えてから行う。 \section{XACMLInterpreter} XMLReaderと同じようsaxにを用いて実装している。 XACMLInterpreterは、引数に、使用するpolicyFile名、どのResourceにアクセスするか、どんな処理を行うか、許認可を求める人のUserID等を与える。 @@ -242,9 +233,7 @@ \end{figure} charactorでは、評価関数の引数を取得し、AttributeStackにpushする - endElementでは。主に評価関数の実行を行う。 - endDocumentでは、これまでに実行した評価関数等の結果から今回の許認可を判断する。 XACMLInterpreterを用いることでJungle単体でXACMLで記述されたポリシーファイルのテストが行えるようになった。
--- a/chapter7.tex Tue Feb 17 23:32:21 2015 +0900 +++ b/chapter7.tex Wed Feb 18 12:24:03 2015 +0900 @@ -1,19 +1,21 @@ -\chapter{実装の評価} -前章では、Jungle上にmaTrixを構築する方法と、構築に必要なAPIの実装について述べた。 -本章では、実装を行ったJungleの性能評価を行う。 +\chapter{検索APIの評価} \label{chap:poordirection} +\section{測定方法} +測定はmaTrixが書き出した人物、組織等のXMLファイルをXMLReaderでJungleに読み込み構成情報モデルを構築する。 +その構成情報モデルに対して、実装したデータに対するアクセス関数の実行時間を測定し、実用的な早さで動作するかを調べる。 -\section{実験環境} - +\section{測定環境} +プログラムの測定には並列信頼権が所有しているfireflyを使用した。 +fireflyのスペックを表\ref{list:VM}に記す \begin{table}[h] \caption{実験環境} \label{list:VM} \begin{center} \begin{tabular}{|l|l|} \hline 名前 & 概要 ~ \\ \hline -CPU & ~ \\ \hline -Memory & ~ \\ \hline -OS & ~ \\ \hline +CPU & 24 ~ \\ \hline +Memory & 16GB ~ \\ \hline +OS & OSX yosemite 10.10.2 ~ \\ \hline JavaVM & 1.8.0-25 ~ \\ \hline \end{tabular} \end{center} @@ -35,5 +37,6 @@ \end{center} \end{figure} -isActiveの実行時間は、Indexを使用しない場合は、Personの数が増えると比例して増えていくのに対し、Indexを使用するとPersonの数が増えても実行時間は変わらなかった。 +isActiveの処理時間は、Indexを使用しない場合Personの数が増えると比例して増えていくのに対し、Indexを使用するとPersonの数に関係なく一定の処理時間だった。 +この結果より、Jungleに実装した検索APIはIndexを使用することで高速に動作することが確認できた。
--- a/chapter8.tex Tue Feb 17 23:32:21 2015 +0900 +++ b/chapter8.tex Wed Feb 18 12:24:03 2015 +0900 @@ -3,18 +3,27 @@ \section{まとめ} 本研究では、初めに当研究室が開発している分散データベースJungleで使われている非破壊的木構造について述べ、破壊的木構造に比べてロックが少ないというメリットがあること、当研究室で開発している並列分散フレームワークAliceを用いて分散実装を行っていることを述べた。 -その後、株式会社Symphonyが開発しているアカウント管理、許諾判定システムであるmaTrixが、どのようなデータ構造を保持しており、どのようにアカウント管理を行い、申請の許認可を行っているかの説明を行って、Jungle上でmaTrixをどのように実装するかを述べた。 -その後Jungle上でどのようにmaTrixを表現するかの説明を行った。 -検索APIは、Java8の新機能であるlambda式を用いて実装を行い、検索を高速化するため、functionalJavaのTreeMapを用いてIndexの実装も行った。過去のTreeに対するアクセスは、全てのVersionのTreeが持っている固有のrevisionIdを使用しアクセスを可能にした。 +次に、実際にJungleの上に構築する、組織の中の許認可管理を行うアプリケーションであるmaTrixが、どのようなデータ構造を保持し、申請の許認可を行っているかの説明を行い、Jungle上でmaTrixをどのように実装するかの説明を行った。 + +maTrixを表現する上で、Jungleに必要な機能があったため機能拡張を行った。Java8の新機能であるlambda式を用いてTreeに対して特定の値の検索を行えるようにし、functionalJavaのTreeMapを用いてIndexを実装することで検索の高速化に成功した。また、全てのVersionのTreeが持っている固有のrevisionIdを使用し、過去のTreeに対するアクセスも可能にした。 -また、maTrixが書きだしたxmlファイルを読み込むためにXMLReaderをsaxを用いて実装し、XMLファイルをJungleに取り込めるようにした。 -その後、XACMLInterpreterを実装し、maTrixが使用しているポリシーファイルを読み込んで、Jungle上で許諾判定を行えるようにした。 +さらに、saxを用いてXMLReaderを実装したことでJungleにXML形式で記述されたデータを格納できるようになり、maTrixが書き出したデータを取り込めるようになった。 +また、XACMLInterpreterを実装することでポリシーファイルを読み込み、実際にJungleを用いて許認可判断を行えるようになりJungle上で許認可判断を行えるようになった。 -最後に、実際にmaTrixがデータにアクセスする際に使用するアクセス関数を実装し、性能評価を行った。 -1つ目の実験ではIndexの性能評価を行うため、Indexを使用する場合と、使用しない場合で検索を行い、アクセス関数の実行速度の比較を行った。 -2つ目の実験では、データの検索APIに対して複数のThreadから負荷をかけ、並列に動作するかどうかを調べ、どちらの実験でもIndexの性能は出ていた。 +最後に、検索APIの性能評価を行った結果、Jungleの検索はIndexを用いることで実用的な速度が出ることを確認した。 + \section{今後の課題} \subsection{push/pop} +Jungleの新しい子のInsert処理の計算量は木の深さに依存するため、最悪計算量はO(n)となる。 +しかし、Treeの根の部分に子を追加するpush/popを実装することでInsertの計算量が、非破壊の性質を維持しながらO(1)で行えるようになる + \subsection{indexのIncrementalUpdate} +今JungleのIndexは木の更新が行われる度に新しく作りなおされているため、メモリの消費が大きい +しかし新しく作り直さず、木の更新時に差分更新を行うことでメモリの消費を抑えて各versionのTreeにIndexを保持することが可能になる。 + \subsection{differencialList} +Treeの葉部分に、更新可能な未定義ノードを付加しておくことで、ルートまでのコピーを行わずにノードの追加を行えるようになるので、更新処理が短くなる。 + \subsection{exponential backoff} +Jungleは書き込みが競合し、書き込みに失敗した場合すぐに再度書き込みを行うため、書き込みが集中した際失敗を繰り返すことがある。 +しかし、書き込みが失敗する度に一定時間待機してから再度書き込みを行うことで、競合を避ける事が出来る。
--- a/fig/XACML.graffle Tue Feb 17 23:32:21 2015 +0900 +++ b/fig/XACML.graffle Wed Feb 18 12:24:03 2015 +0900 @@ -42,7 +42,7 @@ <key>ColumnSpacing</key> <real>36</real> <key>CreationDate</key> - <string>2015-02-12 01:11:38 +0000</string> + <string>2015-02-18 03:18:45 +0000</string> <key>Creator</key> <string>sister_clown</string> <key>DisplayScale</key> @@ -52,346 +52,356 @@ <key>GraphicsList</key> <array> <dict> - <key>Bounds</key> - <string>{{102, 362}, {335, 42}}</string> + <key>AllowLabelDrop</key> + <false/> <key>Class</key> - <string>ShapedGraphic</string> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>8</integer> + <key>Info</key> + <integer>2</integer> + </dict> <key>ID</key> <integer>19</integer> - <key>Shape</key> - <string>Rectangle</string> + <key>Points</key> + <array> + <string>{208.5, 254}</string> + <string>{465.5, 306}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>Join</key> + <integer>0</integer> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>5</integer> + <key>Info</key> + <integer>1</integer> + </dict> + </dict> + <dict> + <key>AllowLabelDrop</key> + <false/> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>10</integer> + <key>Info</key> + <integer>2</integer> + </dict> + <key>ID</key> + <integer>18</integer> + <key>Points</key> + <array> + <string>{208.5, 254}</string> + <string>{333.5, 306}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>Join</key> + <integer>0</integer> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>5</integer> + <key>Info</key> + <integer>1</integer> + </dict> + </dict> + <dict> + <key>AllowLabelDrop</key> + <false/> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>9</integer> + <key>Info</key> + <integer>2</integer> + </dict> + <key>ID</key> + <integer>17</integer> + <key>Points</key> + <array> + <string>{208.5, 254}</string> + <string>{206, 306}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>Join</key> + <integer>0</integer> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>5</integer> + <key>Info</key> + <integer>1</integer> + </dict> + </dict> + <dict> + <key>AllowLabelDrop</key> + <false/> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>7</integer> + <key>Info</key> + <integer>2</integer> + </dict> + <key>ID</key> + <integer>16</integer> + <key>Points</key> + <array> + <string>{208.5, 254}</string> + <string>{71.5, 306}</string> + </array> <key>Style</key> <dict> - <key>fill</key> + <key>stroke</key> <dict> - <key>Color</key> - <dict> - <key>b</key> - <string>0.974573</string> - <key>g</key> - <string>0.998064</string> - <key>r</key> - <string>1</string> - </dict> + <key>HeadArrow</key> + <string>0</string> + <key>Join</key> + <integer>0</integer> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> </dict> - <key>shadow</key> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>5</integer> + <key>Info</key> + <integer>1</integer> + </dict> + </dict> + <dict> + <key>AllowLabelDrop</key> + <false/> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>11</integer> + <key>Info</key> + <integer>2</integer> + </dict> + <key>ID</key> + <integer>15</integer> + <key>Points</key> + <array> + <string>{273.5, 128}</string> + <string>{472.5, 191}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> <dict> - <key>Color</key> - <dict> - <key>a</key> - <string>0.75</string> - <key>b</key> - <string>0.94523</string> - <key>g</key> - <string>0.987116</string> - <key>r</key> - <string>1</string> - </dict> + <key>HeadArrow</key> + <string>0</string> + <key>Join</key> + <integer>0</integer> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> </dict> </dict> - <key>Text</key> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>3</integer> + <key>Info</key> + <integer>1</integer> + </dict> + </dict> + <dict> + <key>AllowLabelDrop</key> + <false/> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>6</integer> + <key>Info</key> + <integer>2</integer> + </dict> + <key>ID</key> + <integer>14</integer> + <key>Points</key> + <array> + <string>{273.5, 128}</string> + <string>{340.5, 192}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>Join</key> + <integer>0</integer> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>3</integer> + <key>Info</key> + <integer>1</integer> + </dict> + </dict> + <dict> + <key>AllowLabelDrop</key> + <false/> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> <dict> - <key>Text</key> - <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 -\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs36 \cf0 Conditions}</string> + <key>ID</key> + <integer>5</integer> + </dict> + <key>ID</key> + <integer>13</integer> + <key>Points</key> + <array> + <string>{273.5, 128}</string> + <string>{208.5, 191}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>Join</key> + <integer>0</integer> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>3</integer> + <key>Info</key> + <integer>1</integer> + </dict> + </dict> + <dict> + <key>AllowLabelDrop</key> + <false/> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>4</integer> + <key>Info</key> + <integer>2</integer> + </dict> + <key>ID</key> + <integer>12</integer> + <key>Points</key> + <array> + <string>{273.5, 128}</string> + <string>{76.5, 192}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>Join</key> + <integer>0</integer> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>14</integer> </dict> </dict> <dict> <key>Bounds</key> - <string>{{78.5, 528}, {378, 42}}</string> - <key>Class</key> - <string>ShapedGraphic</string> - <key>ID</key> - <integer>18</integer> - <key>Shape</key> - <string>Rectangle</string> - <key>Style</key> - <dict> - <key>fill</key> - <dict> - <key>Color</key> - <dict> - <key>b</key> - <string>0.974573</string> - <key>g</key> - <string>0.998064</string> - <key>r</key> - <string>1</string> - </dict> - </dict> - <key>shadow</key> - <dict> - <key>Color</key> - <dict> - <key>a</key> - <string>0.75</string> - <key>b</key> - <string>0.94523</string> - <key>g</key> - <string>0.987116</string> - <key>r</key> - <string>1</string> - </dict> - </dict> - </dict> - <key>Text</key> - <dict> - <key>Text</key> - <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 -\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs36 \cf0 Obligations}</string> - </dict> - </dict> - <dict> - <key>Bounds</key> - <string>{{78.5, 442}, {378, 65}}</string> + <string>{{412, 191}, {121, 63}}</string> <key>Class</key> <string>ShapedGraphic</string> - <key>ID</key> - <integer>16</integer> - <key>Shape</key> - <string>Rectangle</string> - <key>Style</key> + <key>FontInfo</key> <dict> - <key>fill</key> - <dict> - <key>Color</key> - <dict> - <key>b</key> - <string>0.974573</string> - <key>g</key> - <string>0.998064</string> - <key>r</key> - <string>1</string> - </dict> - </dict> - <key>shadow</key> - <dict> - <key>Color</key> - <dict> - <key>a</key> - <string>0.75</string> - <key>b</key> - <string>0.94523</string> - <key>g</key> - <string>0.987116</string> - <key>r</key> - <string>1</string> - </dict> - </dict> + <key>Font</key> + <string>HiraKakuProN-W3</string> + <key>Size</key> + <real>12</real> </dict> - <key>Text</key> - <dict> - <key>Text</key> - <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 -\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs36 \cf0 Rule\uc0\u8232 (\'8f\'e3\'82\'c9\'93\'af\'82\'b6)}</string> - </dict> - </dict> - <dict> - <key>Bounds</key> - <string>{{138, 283}, {275, 42}}</string> - <key>Class</key> - <string>ShapedGraphic</string> <key>ID</key> - <integer>15</integer> + <integer>11</integer> + <key>Magnets</key> + <array> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + </array> <key>Shape</key> <string>Rectangle</string> <key>Style</key> <dict> - <key>fill</key> - <dict> - <key>Color</key> - <dict> - <key>b</key> - <string>0.974573</string> - <key>g</key> - <string>0.998064</string> - <key>r</key> - <string>1</string> - </dict> - </dict> <key>shadow</key> <dict> - <key>Color</key> - <dict> - <key>a</key> - <string>0.75</string> - <key>b</key> - <string>0.94523</string> - <key>g</key> - <string>0.987116</string> - <key>r</key> - <string>1</string> - </dict> - </dict> - </dict> - <key>Text</key> - <dict> - <key>Text</key> - <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 -\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs36 \cf0 Actions}</string> - </dict> - </dict> - <dict> - <key>Bounds</key> - <string>{{138, 232.5}, {275, 42}}</string> - <key>Class</key> - <string>ShapedGraphic</string> - <key>ID</key> - <integer>14</integer> - <key>Shape</key> - <string>Rectangle</string> - <key>Style</key> - <dict> - <key>fill</key> - <dict> - <key>Color</key> - <dict> - <key>b</key> - <string>0.974573</string> - <key>g</key> - <string>0.998064</string> - <key>r</key> - <string>1</string> - </dict> - </dict> - <key>shadow</key> - <dict> - <key>Color</key> - <dict> - <key>a</key> - <string>0.75</string> - <key>b</key> - <string>0.94523</string> - <key>g</key> - <string>0.987116</string> - <key>r</key> - <string>1</string> - </dict> - </dict> - </dict> - <key>Text</key> - <dict> - <key>Text</key> - <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 -\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs36 \cf0 Resource}</string> - </dict> - </dict> - <dict> - <key>Bounds</key> - <string>{{138, 182}, {275, 42}}</string> - <key>Class</key> - <string>ShapedGraphic</string> - <key>ID</key> - <integer>13</integer> - <key>Shape</key> - <string>Rectangle</string> - <key>Style</key> - <dict> - <key>fill</key> - <dict> - <key>Color</key> - <dict> - <key>b</key> - <string>0.974573</string> - <key>g</key> - <string>0.998064</string> - <key>r</key> - <string>1</string> - </dict> - </dict> - <key>shadow</key> - <dict> - <key>Color</key> - <dict> - <key>a</key> - <string>0.75</string> - <key>b</key> - <string>0.94523</string> - <key>g</key> - <string>0.987116</string> - <key>r</key> - <string>1</string> - </dict> - </dict> - </dict> - <key>Text</key> - <dict> - <key>Text</key> - <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 -\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs36 \cf0 Subject}</string> - </dict> - </dict> - <dict> - <key>Bounds</key> - <string>{{229, 150}, {68, 37}}</string> - <key>Class</key> - <string>ShapedGraphic</string> - <key>FitText</key> - <string>YES</string> - <key>Flow</key> - <string>Resize</string> - <key>ID</key> - <integer>12</integer> - <key>Shape</key> - <string>Circle</string> - <key>Style</key> - <dict> - <key>fill</key> - <dict> - <key>Color</key> - <dict> - <key>b</key> - <string>0.974573</string> - <key>g</key> - <string>0.998064</string> - <key>r</key> - <string>1</string> - </dict> - <key>Draws</key> - <string>NO</string> - </dict> - <key>shadow</key> - <dict> - <key>Color</key> - <dict> - <key>a</key> - <string>0.75</string> - <key>b</key> - <string>0.94523</string> - <key>g</key> - <string>0.987116</string> - <key>r</key> - <string>1</string> - </dict> - <key>Draws</key> - <string>NO</string> - </dict> - <key>stroke</key> - <dict> <key>Draws</key> <string>NO</string> </dict> @@ -404,99 +414,170 @@ {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc -\f0\fs36 \cf0 Target}</string> +\f0\fs24 \cf0 Obligations}</string> + <key>VerticalPad</key> + <integer>0</integer> </dict> - <key>TextRelativeArea</key> - <string>{{0, 0}, {1, 1}}</string> - <key>Wrap</key> - <string>NO</string> </dict> <dict> <key>Bounds</key> - <string>{{102, 143}, {335, 201}}</string> + <string>{{273, 306}, {121, 63}}</string> <key>Class</key> <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>HiraKakuProN-W3</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>10</integer> + <key>Magnets</key> + <array> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 Actions}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{145.5, 306}, {121, 63}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>HiraKakuProN-W3</string> + <key>Size</key> + <real>12</real> + </dict> <key>ID</key> <integer>9</integer> + <key>Magnets</key> + <array> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + </array> <key>Shape</key> <string>Rectangle</string> <key>Style</key> <dict> - <key>fill</key> - <dict> - <key>Color</key> - <dict> - <key>b</key> - <string>0.974573</string> - <key>g</key> - <string>0.998064</string> - <key>r</key> - <string>1</string> - </dict> - </dict> <key>shadow</key> <dict> - <key>Color</key> - <dict> - <key>a</key> - <string>0.75</string> - <key>b</key> - <string>0.94523</string> - <key>g</key> - <string>0.987116</string> - <key>r</key> - <string>1</string> - </dict> + <key>Draws</key> + <string>NO</string> </dict> </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 Resource}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> </dict> <dict> <key>Bounds</key> - <string>{{238.5, 108}, {49, 37}}</string> + <string>{{405, 306}, {121, 63}}</string> <key>Class</key> <string>ShapedGraphic</string> - <key>FitText</key> - <string>YES</string> - <key>Flow</key> - <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>HiraKakuProN-W3</string> + <key>Size</key> + <real>12</real> + </dict> <key>ID</key> - <integer>7</integer> + <integer>8</integer> + <key>Magnets</key> + <array> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + </array> <key>Shape</key> - <string>Circle</string> + <string>Rectangle</string> <key>Style</key> <dict> - <key>fill</key> + <key>shadow</key> <dict> - <key>Color</key> - <dict> - <key>b</key> - <string>0.974573</string> - <key>g</key> - <string>0.998064</string> - <key>r</key> - <string>1</string> - </dict> <key>Draws</key> <string>NO</string> </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 Conditions}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{11, 306}, {121, 63}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>HiraKakuProN-W3</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>7</integer> + <key>Magnets</key> + <array> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> <key>shadow</key> <dict> - <key>Color</key> - <dict> - <key>a</key> - <string>0.75</string> - <key>b</key> - <string>0.94523</string> - <key>g</key> - <string>0.987116</string> - <key>r</key> - <string>1</string> - </dict> - <key>Draws</key> - <string>NO</string> - </dict> - <key>stroke</key> - <dict> <key>Draws</key> <string>NO</string> </dict> @@ -509,88 +590,40 @@ {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc -\f0\fs36 \cf0 Rule}</string> +\f0\fs24 \cf0 Subject}</string> + <key>VerticalPad</key> + <integer>0</integer> </dict> - <key>TextRelativeArea</key> - <string>{{0, 0}, {1, 1}}</string> - <key>Wrap</key> - <string>NO</string> </dict> <dict> <key>Bounds</key> - <string>{{77, 108}, {378, 308}}</string> + <string>{{280, 192}, {121, 63}}</string> <key>Class</key> <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>HiraKakuProN-W3</string> + <key>Size</key> + <real>12</real> + </dict> <key>ID</key> <integer>6</integer> + <key>Magnets</key> + <array> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + </array> <key>Shape</key> <string>Rectangle</string> <key>Style</key> <dict> - <key>fill</key> - <dict> - <key>Color</key> - <dict> - <key>b</key> - <string>0.974573</string> - <key>g</key> - <string>0.998064</string> - <key>r</key> - <string>1</string> - </dict> - </dict> <key>shadow</key> <dict> - <key>Color</key> - <dict> - <key>a</key> - <string>0.75</string> - <key>b</key> - <string>0.94523</string> - <key>g</key> - <string>0.987116</string> - <key>r</key> - <string>1</string> - </dict> - </dict> - </dict> - </dict> - <dict> - <key>Bounds</key> - <string>{{71, 52}, {384, 33}}</string> - <key>Class</key> - <string>ShapedGraphic</string> - <key>ID</key> - <integer>5</integer> - <key>Shape</key> - <string>Rectangle</string> - <key>Style</key> - <dict> - <key>fill</key> - <dict> - <key>Color</key> - <dict> - <key>b</key> - <string>0.974573</string> - <key>g</key> - <string>0.998064</string> - <key>r</key> - <string>1</string> - </dict> - </dict> - <key>shadow</key> - <dict> - <key>Color</key> - <dict> - <key>a</key> - <string>0.75</string> - <key>b</key> - <string>0.94523</string> - <key>g</key> - <string>0.987116</string> - <key>r</key> - <string>1</string> - </dict> + <key>Draws</key> + <string>NO</string> </dict> </dict> <key>Text</key> @@ -601,56 +634,38 @@ {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc -\f0\fs36 \cf0 Target}</string> +\f0\fs24 \cf0 Rule}</string> + <key>VerticalPad</key> + <integer>0</integer> </dict> </dict> <dict> <key>Bounds</key> - <string>{{236, 4}, {63, 37}}</string> + <string>{{148, 191}, {121, 63}}</string> <key>Class</key> <string>ShapedGraphic</string> - <key>FitText</key> - <string>YES</string> - <key>Flow</key> - <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>HiraKakuProN-W3</string> + <key>Size</key> + <real>12</real> + </dict> <key>ID</key> - <integer>4</integer> + <integer>5</integer> + <key>Magnets</key> + <array> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + </array> <key>Shape</key> - <string>Circle</string> + <string>Rectangle</string> <key>Style</key> <dict> - <key>fill</key> - <dict> - <key>Color</key> - <dict> - <key>b</key> - <string>0.974573</string> - <key>g</key> - <string>0.998064</string> - <key>r</key> - <string>1</string> - </dict> - <key>Draws</key> - <string>NO</string> - </dict> <key>shadow</key> <dict> - <key>Color</key> - <dict> - <key>a</key> - <string>0.75</string> - <key>b</key> - <string>0.94523</string> - <key>g</key> - <string>0.987116</string> - <key>r</key> - <string>1</string> - </dict> - <key>Draws</key> - <string>NO</string> - </dict> - <key>stroke</key> - <dict> <key>Draws</key> <string>NO</string> </dict> @@ -663,51 +678,98 @@ {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc -\f0\fs36 \cf0 Policy}</string> +\f0\fs24 \cf0 Rule}</string> + <key>VerticalPad</key> + <integer>0</integer> </dict> - <key>TextRelativeArea</key> - <string>{{0, 0}, {1, 1}}</string> - <key>Wrap</key> - <string>NO</string> </dict> <dict> <key>Bounds</key> - <string>{{59, 41}, {417, 558}}</string> + <string>{{16, 192}, {121, 63}}</string> <key>Class</key> <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>HiraKakuProN-W3</string> + <key>Size</key> + <real>12</real> + </dict> <key>ID</key> - <integer>3</integer> + <integer>4</integer> + <key>Magnets</key> + <array> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + </array> <key>Shape</key> <string>Rectangle</string> <key>Style</key> <dict> - <key>fill</key> - <dict> - <key>Color</key> - <dict> - <key>b</key> - <string>0.974573</string> - <key>g</key> - <string>0.998064</string> - <key>r</key> - <string>1</string> - </dict> - </dict> <key>shadow</key> <dict> - <key>Color</key> - <dict> - <key>a</key> - <string>0.75</string> - <key>b</key> - <string>0.94523</string> - <key>g</key> - <string>0.987116</string> - <key>r</key> - <string>1</string> - </dict> + <key>Draws</key> + <string>NO</string> </dict> </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 Target}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{213, 65}, {121, 63}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>HiraKakuProN-W3</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>3</integer> + <key>Magnets</key> + <array> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 Policy}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> </dict> </array> <key>GridInfo</key> @@ -757,7 +819,7 @@ <key>MasterSheets</key> <array/> <key>ModificationDate</key> - <string>2015-02-12 01:30:51 +0000</string> + <string>2015-02-18 03:23:25 +0000</string> <key>Modifier</key> <string>sister_clown</string> <key>NotesVisible</key> @@ -833,7 +895,7 @@ <key>ExpandedCanvases</key> <array/> <key>Frame</key> - <string>{{280, 164}, {693, 925}}</string> + <string>{{2218, 332}, {1165, 925}}</string> <key>ListView</key> <true/> <key>OutlineWidth</key> @@ -847,7 +909,7 @@ <key>SidebarWidth</key> <integer>120</integer> <key>VisibleRegion</key> - <string>{{0, 0}, {558, 783}}</string> + <string>{{-236, 0}, {1030, 783}}</string> <key>Zoom</key> <real>1</real> <key>ZoomValues</key>