changeset 3:082148d6bf7f

change slide
author tatsuki
date Tue, 26 May 2015 13:54:37 +0900
parents 0b021791e15c
children 84bbcfe22656
files slide/images/ref.graffle slide/images/ref.jpg slide/slide.html
diffstat 3 files changed, 82 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/slide/images/ref.graffle	Tue May 26 04:28:22 2015 +0900
+++ b/slide/images/ref.graffle	Tue May 26 13:54:37 2015 +0900
@@ -156,7 +156,7 @@
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
 
-\f0\fs48 \cf0 o:1\'82\'f0\'8e\'67\'82\'c1\'82\'c4\
+\f0\fs48 \cf0 r:1\'82\'f0\'8e\'67\'82\'c1\'82\'c4\
 \'91\'8a\'8c\'dd\'8e\'51\'8f\'c6\'82\'b7\'82\'e9}</string>
 			</dict>
 			<key>TextRelativeArea</key>
@@ -327,7 +327,7 @@
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
 
-\f0\fs24 \cf0 o:1\'82\'cc\'91\'bc\'82\'cc\'83\'66\'81\'5b\'83\'5e}</string>
+\f0\fs24 \cf0 r:1\'82\'cc\'91\'bc\'82\'cc\'83\'66\'81\'5b\'83\'5e}</string>
 				<key>VerticalPad</key>
 				<integer>0</integer>
 			</dict>
@@ -501,7 +501,7 @@
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
 
 \f0\fs24 \cf0 element : name\
-text-name : \'97\'ae\'8b\'85\'91\'e5\'8a\'77}</string>
+text-name : \'8a\'77\'90\'b6}</string>
 				<key>VerticalPad</key>
 				<integer>0</integer>
 			</dict>
@@ -584,7 +584,7 @@
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
 
-\f0\fs24 \cf0 element     :    Organization\uc0\u8232 Organization-id :     o:1   \u8232 Organization-type : Organization}</string>
+\f0\fs24 \cf0 element     :    Role\uc0\u8232 Role-id :     r:1   \u8232 Role-type : Role}</string>
 				<key>VerticalPad</key>
 				<integer>0</integer>
 			</dict>
@@ -672,7 +672,7 @@
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
 
-\f0\fs24 \cf0 element     :    Organizations}</string>
+\f0\fs24 \cf0 element     :    Roles}</string>
 				<key>VerticalPad</key>
 				<integer>0</integer>
 			</dict>
@@ -972,7 +972,7 @@
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
 
-\f0\fs24 \cf0 element : orgRefId \uc0\u8232 text-orgRefId : o:1}</string>
+\f0\fs24 \cf0 element : RoleRefId \uc0\u8232 text-RoleRefId : r:1}</string>
 				<key>VerticalPad</key>
 				<integer>0</integer>
 			</dict>
@@ -1414,7 +1414,7 @@
 	<key>MasterSheets</key>
 	<array/>
 	<key>ModificationDate</key>
-	<string>2015-05-24 10:09:48 +0000</string>
+	<string>2015-05-26 04:49:05 +0000</string>
 	<key>Modifier</key>
 	<string>sister_clown</string>
 	<key>NotesVisible</key>
@@ -1514,7 +1514,7 @@
 		<key>SidebarWidth</key>
 		<integer>120</integer>
 		<key>VisibleRegion</key>
-		<string>{{131, 0}, {986, 783}}</string>
+		<string>{{14, 0}, {986, 783}}</string>
 		<key>Zoom</key>
 		<real>1</real>
 		<key>ZoomValues</key>
Binary file slide/images/ref.jpg has changed
--- a/slide/slide.html	Tue May 26 04:28:22 2015 +0900
+++ b/slide/slide.html	Tue May 26 13:54:37 2015 +0900
@@ -165,8 +165,8 @@
 <font size=5>
 <h1>Jungle上でのIdを使った木の相互参照</h1>
 <p>組織構造は複数の木構造を持ち、お互いのノード参照し合っている</p>
-<p>ex. 人物と組織は、idを用いてお互いのノードを参照する</p>
-<img src="./images/TreePersonJungle.png">
+<p>ex. 人物と役割は、idを用いてお互いのノードを参照する</p>
+<iframe src="images/ref.html" width="2000" height="1000"></iframe>
 </font>
 </div>
 
@@ -206,9 +206,8 @@
 <font size=5>
 <p>maTrixを用いた許認可は、ポリシーファイルを参照し行われる</p>
 <p>ポリシーファイルには、subject(誰が)、Resource(何に対して)、Action(何が出来るか)を記述する</p>
-<p>maTrixにおける許認可判断において、データに対するアクセスは、subject部分でデータアクセス関数を用いて行う</p>
-<p>maTrixには、データアクセス関数が実装されている</p>
-<p>Jungle上にmaTrixを実装するにあって、データアクセス関数の実装を行った</p>
+<p>maTrixにおける許認可判断において、データに対するアクセスは、subject部分で検索関数を用いて行う</p>
+<p>Jungle上にmaTrixを実装するにあって、検索関数の実装を行った</p>
 </font>
 </div>
 
@@ -279,7 +278,7 @@
 <ol>
 <li>Aさん(Subject)が、学科のノートPC(Resource)の借りる(Action)ために、maTrixに貸出許可を求める</li>
 <li>maTrixは、PCの貸出許可を与えるかを判断するためのポリシーファイルを参照する</li>
-<li>データにアクセスしAさんの役割を取得する</li>
+<li>maTrixはAさんの役割を取得する</li>
 <li>Aさんが情報工学科の役割を持っていた場合貸出許可を与える</li>
 </ol>
 <p>maTrixは、3番目の処理で役割を取得する関数roleIdsを使用している</p>
@@ -297,7 +296,7 @@
 <li>検索を行う組織構造のversion</li>
 <li>役割を取得したい人 or 組織のId</li>
 <li>検索対象を絞り込むために使用するフィルター</li>
-<p>の3つをとります</p>
+<p>の3つをとり、返り値に役割のIteratorを返します</p>
 </font>
 </div>
 
@@ -336,7 +335,7 @@
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;"Person-id",&nbsp;id);<br>
 </div>
-<p>getTreeで取得したTreeから、getTraverserで木を探索する機能を持ったTraverserを取得する</p>
+<p>getTreeで取得した木から、getTraverserで木を探索する機能を持ったTraverserを取得する</p>
 <p>取得したTraverser.findで、属性名 Person-id、属性値 引数で指定されたidのペアを持つノードのIteratorを検索する</p>
 </font>
 </div>
@@ -349,35 +348,65 @@
 TreeNode PersonNode = personNodeIterator.next();<br>
 TreeNode parentOrganizationsNode = PersonNode.getChildren().at(5).b();<br>
 Iterator&lt;TreeNode&gt; OrganizationMappedByRoleIterator = parentOrganizationsNode.getChildren().iterator();<br>
+return new Iteratorr&lt;String&gt;() {<br>
+………<BR>
+};
 </div>
 <p>findで取得したノードから、その人が持っている役割を持つノードのIteratorを取得する</p>
 <p>idを持っているノードの5番目の子供の下に役割のデータが格納されている</p>
 <p>なので、PersonNode.getChildren().at(5).b();で5番目の子供を取得</p>
-<p>その下に役割のデータが入ったノードがあるので、子供のiteratorを取得している</p>
+<p>その下に役割のデータが入ったノードがあるので、子供のiteratorを取得する</p>
+<p>検索条件にあった役割を返すiteratorを定義する</p>
 </font>
 </div>
 
 <div>
 <h1>roleIdsのコード</h1>
 <font size=5>
+<p>定義したiteratorのhasNext</p>
+<div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
+public boolean hasNext() {<br>
+&nbsp;&nbsp;if (OrganizationMappedByRoleIterator.hasNext())<br>
+&nbsp;&nbsp;&nbsp;&nbsp;roleRefId = search();<br>
+&nbsp;&nbsp;else<br>
+&nbsp;&nbsp;&nbsp;&nbsp;roleRefId = null;<br>
+&nbsp;&nbsp;if (roleRefId != null)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;return true;<br>
+&nbsp;&nbsp;return false;<br>
+}<br>
+</div>
+<p>取得した役割のIteratorの中身がある場合はsearch()を実行する</p>
+<p>search()は条件にあった役割を返す</p>
+<p>中身がない場合はroleRefId = nullを行う</p>
+<p>roleRefIdがnullの場合、条件にあった役割は無いのでfalseを返し</p>
+<p>roleRefIdに値がある場合はtrueを返す</p>
+<p>next()では、roleRefIdの値を返せば良い</p>
+</font>
+</div>
+
+
+
+<div>
+<h1>roleIdsのコード</h1>
+<font size=5>
 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
 for&nbsp;(;&nbsp;OrganizationMappedByRoleIterator.hasNext();&nbsp;)&nbsp;{<br>
   &nbsp;&nbsp;TreeNode&nbsp;OrganizationMappedByRole&nbsp;=&nbsp;OrganizationMappedByRoleIterator.next();<br>
-  &nbsp;&nbsp;TreeNode&nbsp;organizationRefIdNode&nbsp;=&nbsp;OrganizationMappedByRole.getChildren().at(0).b();<br>
-  &nbsp;&nbsp;String&nbsp;organizationRefId&nbsp;=&nbsp;organizationRefIdNode.getAttributes().getString("text-organizationRefId");<br>
-  &nbsp;&nbsp;if&nbsp;(!filterIds.contains(organizationRefId)&nbsp;&&&nbsp;!filterIds.isEmpty())<br>
-  &nbsp;&nbsp;&nbsp;&nbsp;continue;<br>
-
-  &nbsp;&nbsp;TreeNode&nbsp;roleRefIdNode&nbsp;=&nbsp;OrganizationMappedByRole.getChildren().at(1).b();<br>
-  &nbsp;&nbsp;return&nbsp;roleRefIdNode.getAttributes().getString("text-roleRefId");<br>
+    &nbsp;&nbsp;TreeNode&nbsp;organizationRefIdNode&nbsp;=&nbsp;OrganizationMappedByRole.getChildren().at(0).b();<br>
+    &nbsp;&nbsp;String&nbsp;organizationRefId&nbsp;=&nbsp;organizationRefIdNode.getAttributes().getString("text-organizationRefId");<br>
+    &nbsp;&nbsp;if&nbsp;(!filterIds.contains(organizationRefId)&nbsp;&&&nbsp;!filterIds.isEmpty())<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;continue;<br>
+    &nbsp;&nbsp;TreeNode&nbsp;roleRefIdNode&nbsp;=&nbsp;OrganizationMappedByRole.getChildren().at(1).b();<br>
+    &nbsp;&nbsp;return&nbsp;roleRefIdNode.getAttributes().getString("text-roleRefId");<br>
 }<br>
+return null;
 </div>
 <p>役割のデータが入ったノードのiteratorをfor文で回して役割を取得する</p>
-<p>iteratorで取得できるノードの0番目の子供には役割を与える組織名が</p>
-<p>1番目のノードには与えられる役割名を保持している</p>
-<p>0番目の子供から組織名を取得し検索結果の絞込を行う</p>
-<p>その後1番目のノードから役割名を返す</p>
-<p>このfor文はroleIdsの返り値のiteratorで呼ばれます</p>
+<p>iteratorで取得できるノードの0番目の子供には役割を与える組織idが</p>
+<p>1番目のノードには与えられる役割idを保持している</p>
+<p>0番目の子供から組織idを取得し検索結果の絞込を行う</p>
+<p>その後1番目のノードから役割idを返す</p>
+<p>役割のノードのiteratorが空になったら、nullを返す</p>
 </font>
 </div>
 
@@ -405,14 +434,14 @@
 <p>idには工学部のidが、orgNodeにはAさんが所属している組織のidを持ったノードが入っている</p>
 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
 do {<br>
-&nbsp;&nbsp;String orgId = orgNode.getAttributes().getString("Organization-id");<br>
-&nbsp;&nbsp;if (id.equals(orgId))<br>
-&nbsp;&nbsp;&nbsp;&nbsp;return true;<br>
-&nbsp;&nbsp;parentOrgNodeOptional = parentIndex.get(orgNode);<br>
-&nbsp;&nbsp;if (parentOrgNodeOptional.isPresent())<br>
-&nbsp;&nbsp;&nbsp;&nbsp;orgNode = parentOrgNodeOptional.get();<br>
-&nbsp;&nbsp;else<br>
-&nbsp;&nbsp;&nbsp;&nbsp;return false;<br>
+  &nbsp;&nbsp;String orgId = orgNode.getAttributes().getString("Organization-id");<br>
+    &nbsp;&nbsp;if (id.equals(orgId))<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;return true;<br>
+    &nbsp;&nbsp;parentOrgNodeOptional = parentIndex.get(orgNode);<br>
+    &nbsp;&nbsp;if (parentOrgNodeOptional.isPresent())<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;orgNode = parentOrgNodeOptional.get();<br>
+    &nbsp;&nbsp;else<br>
+    &nbsp;&nbsp;&nbsp;&nbsp;return false;<br>
 }while(true);<br>
 </div>
 <ol>
@@ -450,7 +479,7 @@
 <div>
 <h1>mongoDBとの比較</h1>
 <font size=5>
-<p>1万人のデータをmongoDBとJungleに格納し、データの読み込みにかかる時間の測定を行った</p>
+<p>1万人のデータをmongoDBとJungleに格納し、データの検索にかかる時間の測定を行った</p>
 <p>各DBに挿入するデータは以下のような構造を持つ</p>
 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
 {PersonId: 固有のPersonId ,roleRefIds:ランダムな役割Id}<br>
@@ -501,7 +530,7 @@
 <p>Jungleの方がmongoDBより高速で動いた理由として、<br>通信の有無が大きい</p>
 <p>mongoDBはMongoShellからデータベースにアクセスする際に<br>通信を行っている</p>
 <p>それに対しJungleは、通信を行わないため高速に動作する</p>
-<p>また、データへのアクセスもmongoDBは<br>ディスクにあるデータに対しmmapを用いて行う</p>
+<p>データへのアクセスもmongoDBは<br>ディスクにあるデータに対しmmapを用いて行う</p>
 <p>Jungleは初めからメモリにあるデータにアクセスする</p>
 <p>その部分も差が出た理由の1つである</p>
 <p>その結果JungleはmongoDBの約500倍の性能が出ている</p>
@@ -512,7 +541,15 @@
 <h1>マルチプロセッサー上でのJungleの読み書き性能</h1>
 <font size=5>
 <p>Jungleがマルチプロセッサ上で性能が出るか測定を行った</p>
-<p>複数スレッドからJungleに読み込みだけを行った場合と、1スレッドだけ書き込みを行い続け、残りのスレッドで読み込み行った場合で測定を行った。</p>
+<p>複数スレッドからJungleに読み込みだけを行った場合と、1スレッドだけ書き込みを行い続け、<br>残りのスレッドで読み込み行った場合で測定を行った。</p>
+<p>読み込みではmaTrixで実際に使われている検索関数isActive(personId , version)を用いた</p>
+<p>この関数引数で与えた人が、maTrixにアカウントを持っているか調べる関数である</p>
+</font>
+</div>
+
+<div>
+<h1>マルチプロセッサー上でのJungleの読み書き性能</h1>
+<font size=5>
 <embed src="images/transactionPersecond.svg" width="700" height="700"align="left"/>
 <br>
 <p>Jungleでは、書き込みと読み込みを同時に行っても<br>性能低下はおこらなかった</p>
@@ -524,10 +561,10 @@
 </font>
 </div>
 
-
+<div>
 <h1>考察</h1>
 <font size=5>
-<p>性能評価では、JungleのほうがMongoDBより高速に動いたが、全てのアプリケーションにおいてJungleの方が早いわけではない</p>
+<p>性能評価では、JungleのほうがMongoDBより高速に動いたが、全てのアプリケーションでJungleの方が早いわけではない</p>
 <p>Jungleは、木構造の形と使われ方がアルゴリズム的に一致している場合に性能が出る</p>
 </font>
 </div>
@@ -560,9 +597,9 @@
 <p>2.データの書き出し部分の改良</p>
 <p>&nbsp;&nbsp;Jungleはデータをディスクに書き出すことが可能である</p>
 <p>&nbsp;&nbsp;書きだしたデータを読み込む機能もあるのでトラブルが発生し、Jungleが強制終了されても元の状態に復旧できる</p>
-<p>&nbsp;&nbsp;しかし、今の実装は、データの書き出しはcommit時に毎回行っているため書き出しが非効率的である</p>
+<p>&nbsp;&nbsp;今の実装は、データの書き出しはcommit時に毎回行っているため書き出しが非効率的である</p>
 <p>&nbsp;&nbsp;できれば複数回分の変更をバッファリングしておいて一気に書き出しを行いたい</p>
-<p>&nbsp;&nbsp;また、ある値を行ったり来たりするような、書き出す必要が無いデータもあるため、書き出す部分の最適化を行う必要がある</p>
+<p>&nbsp;&nbsp;ある値を行ったり来たりするような、書き出す必要が無いデータもあるため、書き出す部分の最適化を行う必要がある</p>
 </font>
 </div>
 
@@ -572,7 +609,7 @@
 <p>3.過去のデータの掃除</p>
 <p>&nbsp;&nbsp;Jungleは非破壊でデータを保持し続けるため、非常に多くのメモリを消費する</p>
 <p>&nbsp;&nbsp;ある程度のタイミングで過去のデータをメモリから掃除する必要がある</p>
-<p>&nbsp;&nbsp;しかし、データを掃除するタイミングは、Jungle上に実装するアプリケーションによって変わるため、自明ではない</p>
+<p>&nbsp;&nbsp;しかし、データを掃除するタイミングは、Jungle上に実装するアプリケーションによって変わる</p>
 <p>&nbsp;&nbsp;そこを含め、データを掃除するAPIの設計を行う必要がある</p>
 <p>4.分散環境でのmaTrixの構築</p>
 <p>&nbsp;&nbsp;Jungleはもともと分散データベースである</p>