view slide/slide.html @ 29:5ee5d1bfce28 default tip

fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 19 Feb 2015 13:17:33 +0900
parents 81739e6ae6b9
children
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">
<font size=5>
<h1>分散木構造データベースJungleによる<br>企業向け許認可システム</h1>
<br><br>
<p>琉球大学情報工学科並列信頼研</p>
<p>金川竜己</p></font>

</div>

<div>
<font size=5>
<h1>知的構造を格納するためのデータベース</h1>
<il>
<li>我々が扱っている知識は木構造であることが多い
<li>RDBに木構造の格納する際は表に変換を行う必要があり、スキーマが煩雑になる
<li>木構造のデータを直接格納できるデータベースが望ましい
</il>

<p>そこで、並列研では非破壊木構造データベースJungleの開発を行っている</p>
<p>Jungleの表現力、機能の十分性検証、及び性能実証実験を行いたい</p>
<p>そのために、Jungle上に組織の許認可管理アプリケーションmaTrixを実装した</p>
</font>
</div>


<div>
<font size=5>
<h1>Jungle上でのmaTrixのデータ構造の表現</h1>
<p>Jugnleでは木構造持つノードを、そのままデータベースとして扱う</p>
<p>maTrixの人物Treeの一部をJungleのノードで表現</p>
<p>ノードは複数の子供ノードを持つ</p>
<p>ノードには属性名と属性の値の組があり、データベースのレコードに相当する</p>
<img src="./images/TreePersonJungle.png">
</font>
</div>


<div>
<font size=5>
<h1>Jungleのデータの編集</h1>
<p>新しい木構造を作成することでデータの編集を行う</p>
<img src="./images/non_destructive_tree_edit2.png">
<p>書き込み時に、ロックをかける必要があるのはルートノードを入れ替えるときのみ</p>
<p>データの上書きが無いため、読み込み中にロックをかける必要がない</p>
</font>
</div>



<div>
<font size=5>
<h1>組織の中の許認可管理アプリケーションmaTrix</h1>
<p>人、組織、役割等の情報を木構造として保持しており、Idでお互いに参照し組織構造を表現している</p>
<p>許認可の判断は、アクセスルールが記述されたポリシーファイルにそって行われる</p>
</font>
</div>


<!--
<div>
<h1>maTrixのデータの書き出し</h1>
<p>maTrixは自身の保持しているデータ構造をXML形式で書き出せる</p>
<p></p>
<div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
<br>&lt;Persons&gt;
<br>&nbsp;&nbsp&lt;Person id="p:1" type="Person"&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&lt;accountId&gt;a:26&lt;/accountId&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&lt;lastName&gt;東&lt;/lastName&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&lt;name&gt;東俊一&lt;/name&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&lt;nameReading&gt;あずましゅんいちくん&lt;/nameReading&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp;&nbsp&nbsp;&lt;roleRefIds&gt;r:10 r:34&nbsp;&lt;/roleRefIds&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&lt;parentOrganizations type="OrganizationMappedByRole"&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;OrganizationMappedByRole type="OrganizationMappedByRole"&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;organizationRefId&gt;o:2&lt;/organizationRefId&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;roleRefId&gt;r:10&lt;/roleRefId&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;/OrganizationMappedByRole&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;OrganizationMappedByRole type="OrganizationMappedByRole"&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;organizationRefId&gt;o:11&lt;/organizationRefId&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;roleRefId&gt;r:34&lt;/roleRefId&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;/OrganizationMappedByRole&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&lt;/parentOrganizations&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&lt;priorities type="PriorityMappedByRole"&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;PriorityMappedByRole type="PriorityMappedByRole"&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;priority&gt;0&lt;/priority&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;roleRefId&gt;r:10&lt;/roleRefId&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;/PriorityMappedByRole&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;PriorityMappedByRole type="PriorityMappedByRole"&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;priority&gt;1&lt;/priority&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;roleRefId&gt;r:34&lt;/roleRefId&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&lt;/PriorityMappedByRole&gt;
<br>&nbsp;&nbsp&nbsp;&nbsp&lt;/priorities&gt;
<br>&nbsp;&nbsp&lt;/Person&gt;
<br>&lt;/Persons&gt;
 </div>
</div>
-->

<div>
<font size=5>
<h1>Jungle上でのIdを使った木の相互参照</h1>
<p>組織構造は複数の木構造を持ち、お互いのノード参照し合っている</p>
<p>ex. 人物は、そのロールの木の中のノードを参照する</p>
<img src="./images/TreePersonJungle.png">
<p>ロールの木のノードにID属性を用意し、異なるID値を割りふる</p>
<p>ノードIDにより参照を可能にする</p>
<p>→ノードIDの検索機能が必要となる</p>
</font>
</div>


<div>
<font size=5>
<h1>maTrixでの許認可管理</h1>
<p>maTrixを用いた許認可は、組織構造だけでは判断されない</p>
<p>アクセス可能な時間等のルールは組織構造では表現できないからである</p>
<p>そこでアクセスルールを記述したポリシーファイルを用いて許認可管理を行う</p>
<p>ポリシーファイルには、subject(誰が)、Resource(何に対して)、Action(何が出来るか)を記述する</p>

<p>以下に許認可管理の流れを示す</p>
<ul>
<li>Aさん(Subject)が、学科のノートPC(Resource)の借りる(Action)ために、maTrixに貸出許可を求める</li>
<li>maTrixはリポジトリから、貸出許可を与えるかを判断するためのポリシーを取得する</li>
<li>ポリシーファイルを元に、組織構造にアクセスを行い許可を与えるかどうかを判断する</li>
</ul>
</font>
</div>


<div>
<font size=5>
<h1>Treeの検索</h1>
<p>Jungleの木をたどる Traverserを使用する</p>
<div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
InterfaceTraverser traverser = tree.getTraverser(boolean useIndex);
</div>
<p>TraverserはTreeのNodeを走破する機能を持ったクラスです</p>
<p>TreeからgetTraverserで取得可能</p>
<p>第一引数で 検索を行う際にIndexを使用するかどうかを選択できる</p>
<div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
 public Iterator&lt;TreeNode&gt; nodeIterator = traverser.find(Query query,String key, String searchValue);
</div>
<p>第一引数には、探索の条件を記述する関数boolean condition(TreeNode)を定義したQueryを受け取る</p>
<p>第二、第三引数の、String key、String valueはIndexの取得に使用する</p>
<p>条件に一致したNodeのIteratorを返す</p>
<div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
public interface Query {<br>
&nbsp;&nbsp boolean condition(TreeNode _node);<br>
}

</div>
</font>
</div>


<div>
<font size=5>
<h1>JungleのIndex</h1>
<p>indexを実装することで探索計算量がO(logN)となる</p>
<p>Jungleは過去のTreeを全て保持しているため、Treeのversion毎にIndexを持っている必要がある</p>
<p>version毎にIndexを作るとメモリを多量消費してしまう</p>
<p>FunctionalJavaのTreeMapを使用してIndexの実装を行った</p>
<p>データの更新が行われた際に、一度作られたIndexに対して更新を行わず、新しいIndexを構築します</p>
<p>その際、過去のIndexとデータを共有している</p>
<p>複数のversionのIndexがあっても、データの差分しかメモリは消費されない</p>
<p>メモリの使用量を抑えつつ複数のversionでIndexを保持できる</p>
</font>
</div>


<div>
<font size=5>
<h1>木構造の親を辿るQuery</h1>
<p>maTrixで許認可を判断する際に、木構造の親を辿る検索を行う必要がある</p>
<p>以下に親を辿る検索を行う例を記す</p>
<ol>
<li>Aさんが、maTrixに工学部の学生にのみ貸出を行っている書籍の貸出許可を求める</li>
<li>Aさんの所属している組織の情報を取得する(情報工学科)</li>
<li>情報工学科の親の情報を取得する(工学部)</li>
<li>Aさんは工学部に所属しているため本の貸出を許可する</li>
</ol>
<p>TreeNodeでgetを行うと、親Nodeを返すParentIndexを実装した</p>
<p>3番目の処理でParentIndexを使用する</p>
</font>
</div>


<div>
<font size=5>
<h1>maTrixのポリシーファイルのInterpreter</h1>
<p>Jungle上での許認可判断は、組織構造とポリシーファイルを参照して行う</p>
<p>引数にポリシーファイルと、誰が(subject)、何に(Resource)、どうするか(Action)を取る</p>
<p>返り値は、許可(Permit) or 拒否(Deny)がある</p>
<p>実際にJungleの上で許認可判断が行えるようになった</p>
</font>
</div>

<div>
<font size=5>
<h1>maTrixのポリシーファイルのInterpreter</h1>
<p>Jungle上での許認可判断は、組織構造とポリシーファイルを参照して行う</p>
<p>引数にポリシーファイルと、誰が(subject)、何に(Resource)、どうするか(Action)を取る</p>
<p>返り値は、許可(Permit) or 拒否(Deny)がある</p>
<p>実際にJungleの上で許認可判断が行えるようになった</p>
</font>
</div>

<div>
<font size=5>
<h1>今後の課題</h1>
<li>分散版の実装</li><br>
<li>maTrix専用のデータ構造の定義</li>
<p>今は、maTrixのデータ構造をそのまま格納しているため、Jungleに合ったデータ構造を設計する</p>
</font>
</div>


<div>
<font size=5>
<h1>まとめ</h1>
<p>Jungle上で実用アプリケーションを構築できた</p>
<p>その際に必要だった機能をJungleに追加した</p>
<li>Query</li>
<li>Index</li>
<p>実際にポリシーファイルを読み込み許認可を行えた</p>
</font>
</div>

</div> <!-- presentation -->
</body>
</html>