Mercurial > hg > Papers > 2015 > tatsuki-thresis
view slide/slide.html @ 23:018025ca0964
commit
author | tatsuki |
---|---|
date | Thu, 19 Feb 2015 03:50:48 +0900 |
parents | 7a279b87d112 |
children | 0e549369b63e |
line wrap: on
line source
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>分散木構造データベースJungleによる企業向け許認可システム</title> <!-- Notes on CSS media types used: 1) projection -> slideshow mode (display one slide at-a-time; hide all others) 2) screen -> outline mode (display all slides-at-once on screen) 3) print -> print (and print preview) Note: toggle between projection/screen (that is, slideshow/outline) mode using t-key Questions, comments? - send them along to the mailinglist/forum online @ http://groups.google.com/group/webslideshow --> <!-- styles --> <style media="screen,projection"> html, body, .presentation { margin: 0; padding: 0; } .slide { display: none; position: absolute; top: 0; left: 0; margin: 0; border: none; padding: 2% 4% 0% 4%; /* css note: order is => top right bottom left */ -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; width: 100%; height: 100%; /* css note: lets use border-box; no need to add padding+border to get to 100% */ overflow-x: hidden; overflow-y: auto; z-index: 2; } .slide.current { display: block; } /* only display current slide in projection mode */ .slide .stepcurrent { color: black; } .slide .step { color: silver; } /* or hide next steps e.g. .step { visibility: hidden; } */ .slide { /* background-image: -webkit-linear-gradient(top, blue, aqua, blue, aqua); background-image: -moz-linear-gradient(top, blue, aqua, blue, aqua); */ } </style> <style media="screen"> .slide { border-top: 1px solid #888; } .slide:first-child { border: none; } </style> <style media="print"> .slide { page-break-inside: avoid; } .slide h1 { page-break-after: avoid; } .slide ul { page-break-inside: avoid; } </style> <!-- add js lib (jquery) --> <script src="js/jquery-1.7.min.js"></script> <!-- S6 JS --> <script src="js/jquery.slideshow.js"></script> <script src="js/jquery.slideshow.counter.js"></script> <script src="js/jquery.slideshow.controls.js"></script> <script> $(document).ready( function() { Slideshow.init(); // Example 2: Start Off in Outline Mode // Slideshow.init( { mode: 'outline' } ); // Example 3: Use Custom Transition // Slideshow.transition = transitionScrollUp; // Slideshow.init(); // Example 4: Start Off in Autoplay Mode with Custom Transition // Slideshow.transition = transitionScrollUp; // Slideshow.init( { mode: 'autoplay' } ); } ); </script> </head> <body> <div class="presentation"> <!-- add slides here; example --> <div id="header"> <h1>分散木構造データベースJungleによる企業向け許認可システム</h1> <font size=5><p></p></font> </div> <div> <h1>知的構造を格納するためのデータベース</h1> <p>我々が扱っている知識は木構造であることが多い</p> <p>RDBに木構造のデータを格納する際は表変換を行う必要があり、データ構造が煩雑になりやすい</p> <p>分散木構造データベースJungleの開発を行っている</p> <p>Jungle上に組織の許認可管理アプリケーションmaTrixを実装する。</p> <p>データベースの表現力、機能の十分性、実用的な性能実証実験を行う</p> </div> <div> <h1>分散木構造データベースJungle</h1> <p>非破壊であるため、新しい木構造を作成することでデータの編集を行う</p> <p style="text-align:center;"> <img src="./images/non_destructive_tree_edit2.png"> </div> <div> <h1>組織の中の許認可管理アプリケーションmaTrix</h1> <p>人、組織、役割等の情報を木構造として保持しており、Idでお互いに参照し組織構造を表現している</p> <p>許認可の判断は、ポリシーファイルに記述されたルールにそって行われる</p> <p>ポリシーファイルは組織構造を参照するため木に対する参照機能が必要になる</p> </div> <!-- <div> <h1>maTrixのデータの書き出し</h1> <p>maTrixは自身の保持しているデータ構造をXML形式で書き出せる</p> <p></p> <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> <br><Persons> <br>  <Person id="p:1" type="Person"> <br>    <accountId>a:26</accountId> <br>    <lastName>東</lastName> <br>    <name>東俊一</name> <br>    <nameReading>あずましゅんいちくん</nameReading> <br>     <roleRefIds>r:10 r:34 </roleRefIds> <br>    <parentOrganizations type="OrganizationMappedByRole"> <br>      <OrganizationMappedByRole type="OrganizationMappedByRole"> <br>        <organizationRefId>o:2</organizationRefId> <br>        <roleRefId>r:10</roleRefId> <br>      </OrganizationMappedByRole> <br>      <OrganizationMappedByRole type="OrganizationMappedByRole"> <br>        <organizationRefId>o:11</organizationRefId> <br>        <roleRefId>r:34</roleRefId> <br>      </OrganizationMappedByRole> <br>    </parentOrganizations> <br>    <priorities type="PriorityMappedByRole"> <br>      <PriorityMappedByRole type="PriorityMappedByRole"> <br>        <priority>0</priority> <br>        <roleRefId>r:10</roleRefId> <br>      </PriorityMappedByRole> <br>      <PriorityMappedByRole type="PriorityMappedByRole"> <br>        <priority>1</priority> <br>        <roleRefId>r:34</roleRefId> <br>      </PriorityMappedByRole> <br>    </priorities> <br>  </Person> <br></Persons> </div> </div> --> <div> <h1>Jungle上でのmaTrixのデータ構造の表現</h1> <p>以下のXMLは、maTrixの人物Treeの一部である。</p> <p style="text-align:center;"><img src="./images/TreePersonJungle.png"> <p>この様にJungleでは木構造のデータを読み込む。</p> </div> <div> <h1>maTrixでの許認可管理</h1> <p>maTrixを用いた許認可は、組織構造だけでは判断されない</p> <p>アクセス可能な時間等のアクセスルールは組織構造では表現できないからである。</p> <p>そこでアクセスルールを定義できるXACML形式で記述したポリシーファイルを用いて許認可管理を行う</p> <p>XACMLは、subject(誰が)、Resource(何を)、Action(どうするか)を記述する。</p> <p>以下に許認可管理の流れを示す</p> <ul> <li>Aさんが、学科のノートPCの借りるために、maTrixに貸出許可を求める。</li> <li>maTrix はリポジトリから、貸出許可を与えるかを判断するためのポリシーを取得する。</li> <li>ポリシーファイルを元に、データにアクセスを行い許可を与えるかどうかを判断する。</li> </ul> </div> <div> <h1>maTrixの組織構造表現例</h1> <p>木同士の参照はIdの検索を用いて表現する</p> <p style="text-align:center;"> <img src="./images/sosikiTree.png"> <p>例えば人物Treeと組織Treeがお互い参照を行い組織運用モデルを表現している。</p> </div> <div> <h1>Idを使った木の相互参照</h1> <p>Treeの検索は、Traverserを使用する</p> <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> InterfaceTraverser traverser = tree.getTraverser(boolean useIndex); </div> <p>TreeからgetTraverserで取得可能。</p> <p>第一引数で 探索を行う際にIndexを使用するかどうかを選択できる。</p> </div> <div> <h1>Idを使った木の相互参照2 </h1> <p>Traverser.findでTreeに対して検索を行う。</p> <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> public Iterator<TreeNode> find(Query query,String key, String searchValue); </div> find関数は引数にQuery、String key、String valueの3つの引数を取り、条件に一致したNodeのIteratorを返す。 第一引数には、探索の条件を記述する関数boolean comdition(TreeNode)を定義したQueryを。 第二、第三引数の、String key、String valueはIndexの取得を行うために使用する。 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> public interface Query {<br>   boolean condition(TreeNode _node);<br> } </div> </div> <div> <h1>Indexの実装</h1> <p>Jungleは過去のTreeを全て保持しているため、Treeのversion毎にIndexを持っている必要がある。</p> <p>FunctionalJavaのTreeMapを使用してIndexの実装を行った</p> <p>データの更新が行われた際に、一度作られたIndexに対して更新を行わず、新しいIndexを構築する。</p> <p>その際、過去のIndexを最大限共有している。</p> <p>メモリの使用量を抑えつつ複数のversionでIndexを保持できる。</p> </div> <div> <h1>ParentIndexの実装</h1> <p>maTrixで許認可を判断する際に、木構造の親を辿って検索を行う必要がある。</p> <p>TreeNodeでgetを行うと、親Nodeを返すParentIndexを実装した。</p> <p>以下に親を辿る検索を行う例を記す。</p> <ul> <li>Aさんが、maTrixに工学部の学生にのみ貸出を行っている書籍の貸出許可を求める。</li> <li>Aさんの所属している組織の情報を取得する(情報工学科)。</li> <li>情報工学科の親の情報を取得する(工学部)。</li> <li>Aさんは工学部に所属しているため本の貸出を許可する。</li> </ul> <p>3番目の処理でParentIndexを使用する。</p> </div> <div> <h1>XACMLInterpreter</h1> <p>Jungle上での許認可判断は、組織構造の参照とポリシーファイルを使用して許認可判断を行う。</p> <p>ポリシーファイルを読み込んで</p> <p>これで実際にJungleの上で許認可判断が行えるようになった</p> </div> <div> <h1>今後の課題</h1> <p>push/popの実装</p> <li>Jungleの新しい子のInsert処理の計算量は木の深さであるため、最悪計算量はO(n) となる。しかし、Treeの根の部分に子を追加するpush/popを実装することでInsertの計算量が、非破壊の性質を維持しながらO(1)で行えるようになる</li> <p>IndexのIncrementalUpdate</p> <li>今JungleのIndexは木の更新が行われる度に新しく作りなおされているため、メモリの消費が大きい。 しかし、新しく作り直さず、木の更新時に差分更新を行うことでメモリの消費を抑えて各versionのTreeにIndexを保持するこ とが可能になる。</li> <p>differencialList</p> <li>Tree の葉部分に、更新可能な未定義ノードを付加しておくことで、ルートまでのコピーを行わずにノードの追加を行えるようになるので、更新処理が短くなる。</li> <p>exponential backoff</p> <li>Jungle は書き込みが競合し、書き込みに失敗した場合すぐに再度書き込みを行うため、 書き込みが集中した際失敗を繰り返すことがある。しかし、書き込みが失敗する度に一定時間待機してから再度書き込みを行うことで、競合を避ける事が出来る。</li> </div> </div> <!-- presentation --> </body> </html>