1
|
1 <!DOCTYPE html>
|
|
2 <html>
|
|
3 <head>
|
|
4 <meta http-equiv="content-type" content="text/html;charset=utf-8">
|
|
5 <title>非破壊的木構造データベースJungleとその評価</title>
|
|
6 <!--
|
|
7 Notes on CSS media types used:
|
|
8
|
|
9 1) projection -> slideshow mode (display one slide at-a-time; hide all others)
|
|
10 2) screen -> outline mode (display all slides-at-once on screen)
|
|
11 3) print -> print (and print preview)
|
|
12
|
|
13 Note: toggle between projection/screen (that is, slideshow/outline) mode using t-key
|
|
14
|
|
15 Questions, comments?
|
|
16 - send them along to the mailinglist/forum online @ http://groups.google.com/group/webslideshow
|
|
17 -->
|
|
18
|
|
19 <!-- styles -->
|
|
20 <style media="screen,projection">
|
|
21
|
|
22 html,
|
|
23 body,
|
|
24 .presentation { margin: 0; padding: 0; }
|
|
25
|
|
26 .slide { display: none;
|
|
27 position: absolute;
|
|
28 top: 0; left: 0;
|
|
29 margin: 0;
|
|
30 border: none;
|
|
31 padding: 2% 4% 0% 4%; /* css note: order is => top right bottom left */
|
|
32 -moz-box-sizing: border-box;
|
|
33 -webkit-box-sizing: border-box;
|
|
34 box-sizing: border-box;
|
|
35 width: 100%; height: 100%; /* css note: lets use border-box; no need to add padding+border to get to 100% */
|
|
36 overflow-x: hidden; overflow-y: auto;
|
|
37 z-index: 2;
|
|
38 }
|
|
39
|
|
40 .slide.current { display: block; } /* only display current slide in projection mode */
|
|
41
|
|
42 .slide .stepcurrent { color: black; }
|
|
43 .slide .step { color: silver; } /* or hide next steps e.g. .step { visibility: hidden; } */
|
|
44
|
|
45 .slide {
|
|
46 /*
|
|
47 background-image: -webkit-linear-gradient(top, blue, aqua, blue, aqua);
|
|
48 background-image: -moz-linear-gradient(top, blue, aqua, blue, aqua);
|
|
49 */
|
|
50 }
|
|
51 </style>
|
|
52
|
|
53 <style media="screen">
|
|
54 .slide { border-top: 1px solid #888; }
|
|
55 .slide:first-child { border: none; }
|
|
56 </style>
|
|
57
|
|
58 <style media="print">
|
|
59 .slide { page-break-inside: avoid; }
|
|
60 .slide h1 { page-break-after: avoid; }
|
|
61 .slide ul { page-break-inside: avoid; }
|
|
62 </style>
|
|
63
|
|
64
|
|
65 <!-- add js lib (jquery) -->
|
|
66 <script src="js/jquery-1.7.min.js"></script>
|
|
67
|
|
68 <!-- S6 JS -->
|
|
69 <script src="js/jquery.slideshow.js"></script>
|
|
70 <script src="js/jquery.slideshow.counter.js"></script>
|
|
71 <script src="js/jquery.slideshow.controls.js"></script>
|
|
72 <script>
|
|
73 $(document).ready( function() {
|
|
74 Slideshow.init();
|
|
75
|
|
76 // Example 2: Start Off in Outline Mode
|
|
77 // Slideshow.init( { mode: 'outline' } );
|
|
78
|
|
79 // Example 3: Use Custom Transition
|
|
80 // Slideshow.transition = transitionScrollUp;
|
|
81 // Slideshow.init();
|
|
82
|
|
83 // Example 4: Start Off in Autoplay Mode with Custom Transition
|
|
84 // Slideshow.transition = transitionScrollUp;
|
|
85 // Slideshow.init( { mode: 'autoplay' } );
|
|
86 } );
|
|
87 </script>
|
|
88
|
|
89 </head>
|
|
90 <body>
|
|
91
|
|
92 <div class="presentation">
|
|
93
|
|
94 <!-- add slides here; example -->
|
|
95 <div id="header">
|
|
96 <font size=5>
|
|
97 <h1>非破壊的木構造データベースJungleとその評価</h1>
|
|
98 <br><br>
|
4
|
99 </font>
|
|
100 <font size=6>
|
1
|
101 <p>琉球大学情報工学科並列信頼研</p>
|
|
102 <p>金川竜己</p></font>
|
|
103
|
|
104 </div>
|
|
105
|
|
106 <div>
|
2
|
107 <h1>知的構造を格納するためのデータベース</h1>
|
1
|
108 <font size=5>
|
2
|
109 <p>我々が扱っている知識は木構造であることが多い。</p>
|
4
|
110 <p>RDBに木構造を格納する際は表に変換を行う必要があり、スキーマが煩雑になる</p>
|
|
111 <p>木構造をそのまま格納できるデータベースが欲しい</p>
|
|
112 <p>データ構造をリトライ可能な形で変更したい</p>
|
|
113 <p>いろいろ試しながらアプリケーションに合ったデータ設計を行える</p>
|
|
114 <p>当研究室では、非破壊的木構造データベースJungleの開発をおこなっている</p>
|
1
|
115 <p>Jungleの表現力、機能の十分性検証、及び性能実証実験を行いたい</p>
|
|
116 <p>そのために、Jungle上に組織の許認可管理アプリケーションmaTrixを実装した</p>
|
|
117 </font>
|
|
118 </div>
|
|
119
|
|
120
|
|
121 <div>
|
2
|
122 <h1>組織の中の許認可管理アプリケーションmaTrix</h1>
|
1
|
123 <font size=5>
|
4
|
124 <p>人、組織、役割等の複数の木構造データを組織構造として保持している</p>
|
|
125 <p>組織構造は版管理されている</p>
|
|
126 <p>木構造のデータはお互いに参照を行っている</p>
|
2
|
127 <p>許認可の判断はアクセスルールが記述されたポリシーファイルにそって行われる</p>
|
1
|
128 <p>ポリシーファイルは主に、誰が (Target)、何を (Redource)、どうできるか(Action) の3つの要素で記述されている</p>
|
|
129 </font>
|
|
130 </div>
|
|
131
|
|
132
|
|
133 <div>
|
2
|
134 <h1>非破壊的木構造データベースJungle</h1>
|
1
|
135 <font size=5>
|
|
136 <p>Jungleは、複数の木の集合からなり、木はノードの集合で出来ている</p>
|
|
137 <p>ノードは、自身の子供のリストと、属性名(Key)と属性値(Value)のデータの組を持つ</p>
|
4
|
138 <p>Jungleは、木の編集を行う際に一度作成した木を上書きしない</p>
|
|
139 <p>新しい木構造を構築することでデータの編集を行う</p>
|
|
140 <p>変更がないノードは共有する</p>
|
|
141 <p>木が変更されていることが保証されているため、読み込み時にロックをかける必要がない</p>
|
|
142 <p>Jungleは過去のversionへの木の参照を持つ</p>
|
|
143 <p>過去の木に対してアクセスが可能</p>
|
2
|
144 </font>
|
|
145 </div>
|
|
146
|
|
147
|
|
148
|
4
|
149 <!--
|
2
|
150 <div>
|
|
151 <h1>Jungleのデータの編集</h1>
|
|
152 <font size=5>
|
4
|
153 <p>Jungleは、木の編集を行う際に一度作成した木を上書きしない</p>
|
|
154 <p>新しい木構造を構築することでデータの編集を行う</p>
|
2
|
155 <p>変更がないノードは共有する</p>
|
4
|
156 <iframe src="images/non_destructive_tree_edit2.html" width="1000" height="400"></iframe>
|
1
|
157 <p>木の更新は、ルートノードをCASを用いて入れ替えることで行う</p>
|
2
|
158 <p>データの上書きが無いため、読み込み中にロックをかける必要がない</p>
|
4
|
159 <p>木は過去のversionの木への参照を持つ</p>
|
1
|
160 </font>
|
|
161 </div>
|
|
162
|
4
|
163 -->
|
1
|
164
|
|
165 <div>
|
2
|
166 <h1>Jungle上でのmaTrixのデータ構造の表現</h1>
|
1
|
167 <font size=5>
|
4
|
168 <p>Jugnleは木構造のデータをそのまま格納できる</p>
|
|
169 <p>maTrixが書きだしたxml形式データをそのまま格納できる</p>
|
1
|
170 <p>maTrixの人物TreeをJungleに格納した図の一部を以下に示す</p>
|
|
171 <iframe src="images/TreePersonJungle.html" width="1000" height="1000"></iframe>
|
|
172 <p></p>
|
|
173 </font>
|
|
174 </div>
|
|
175
|
|
176
|
|
177 <div>
|
|
178 <font size=5>
|
2
|
179 <h1>Jungle上でのIdを使った木の相互参照</h1>
|
4
|
180 <p>組織構造は複数の木構造を持ち、お互いのノード参照している</p>
|
|
181 <p>ノードの参照はidとindexを用いて表現する</p>
|
3
|
182 <iframe src="images/ref.html" width="2000" height="1000"></iframe>
|
1
|
183 </font>
|
|
184 </div>
|
|
185
|
|
186
|
|
187 <div>
|
2
|
188 <h1>JungleのIndex</h1>
|
1
|
189 <font size=5>
|
4
|
190 <p>Jungleは過去の木を全て保持している</p>
|
|
191 <p>version毎にIndexを持っている必要がある</p>
|
|
192 <p>全てに新しくIndexを作るとメモリを多量使用してしまう</p>
|
|
193 <p>前の版のIndexから変更が行われていないデータを共有するIndexを実装した</p>
|
2
|
194 <p>複数のversionのIndexがあっても、データの差分しかメモリは使用されない</p>
|
|
195 </font>
|
|
196 </div>
|
|
197
|
|
198 <div>
|
|
199 <h1>非破壊TreeMapの実装</h1>
|
|
200 <font size=5>
|
4
|
201 <p>FunctionalJavaというjava上で関数型プログラミングが行えるライブラリがある</p>
|
|
202 <p>当初はFunctionalJavaのTreeMapを使用してIndexの実装を行った</p>
|
|
203 <p>FunctionalJavaにはTreeMapにはgetが致命的に遅いバグがあった</p>
|
2
|
204 <p>新しく非破壊TreeMapを実装した</p>
|
|
205 <p>その結果Jungleの性能は劇的に向上した</p>
|
1
|
206 </font>
|
|
207 </div>
|
|
208
|
|
209
|
2
|
210
|
1
|
211 <div>
|
4
|
212 <h1>ノードの親を取得するIndex</h1>
|
1
|
213 <font size=5>
|
4
|
214 <p>Jungleは子から親への参照は存在しない</p>
|
|
215 <p>子ノードを渡すと親をノードを返すParentIndexの実装を行った</p>
|
2
|
216 </font>
|
|
217 </div>
|
|
218
|
|
219 <div>
|
|
220 <h1>許認可Queryの実装</h1>
|
|
221 <font size=5>
|
|
222 <p>maTrixを用いた許認可は、ポリシーファイルを参照し行われる</p>
|
1
|
223 <p>ポリシーファイルには、subject(誰が)、Resource(何に対して)、Action(何が出来るか)を記述する</p>
|
3
|
224 <p>maTrixにおける許認可判断において、データに対するアクセスは、subject部分で検索関数を用いて行う</p>
|
|
225 <p>Jungle上にmaTrixを実装するにあって、検索関数の実装を行った</p>
|
1
|
226 </font>
|
|
227 </div>
|
|
228
|
|
229
|
|
230 <div>
|
4
|
231 <h1>Treeの検索</h1>
|
1
|
232 <font size=5>
|
4
|
233 <p>検索関数はTraverserに実装する</p>
|
1
|
234 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
|
|
235 InterfaceTraverser traverser = tree.getTraverser(boolean useIndex);
|
|
236 </div>
|
4
|
237 <p>Traverserは木のノードを走破する機能を持ったクラスです</p>
|
1
|
238 <p>TreeからgetTraverserで取得可能</p>
|
2
|
239 <p>引数で検索を行う際にIndexを使用するかどうかを選択できる</p>
|
|
240 </font>
|
|
241 </div>
|
|
242
|
|
243 <div>
|
4
|
244 <h1>Treeの検索</h1>
|
2
|
245 <font size=5>
|
1
|
246 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
|
2
|
247 public Iterator<TreeNode> find(Query query,String key, String searchValue);
|
|
248 </div>
|
4
|
249 <p>findは上のように定義されており、引数に</p>
|
|
250 <p>検索の条件を記述する関数boolean condition(TreeNode)を定義したQuery</p>
|
2
|
251 <p>Indexを使う検索に使用するString 属性名、String 属性値のペア</p>
|
|
252 <p>の3つを取る</p>
|
|
253 <p>条件に一致したNodeのIteratorを返す</p>
|
|
254 <p>Iteratorは、複数の値から1つずつ順番に取得するためのinterfaceである</p>
|
|
255 </font>
|
|
256 </div>
|
|
257
|
|
258 <div>
|
|
259 <h1>findの使用例</h1>
|
|
260 <font size=5>
|
|
261 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
|
|
262 InterfaceTraverser personTraverser = personTree.getTraverser(true);<br>
|
4
|
263 Iterator<TreeNode> iterator = personTraverser.find((TreeNode node) -> { <br>
|
2
|
264 String personId = node.getAttributes().getString("Person-id");<br>
|
|
265 if (personId.equals("p:4"))<br>
|
|
266 return true;<br>
|
|
267 return false;<br>
|
|
268 }, "Person-id", "p:4");<br>
|
|
269 <br>
|
4
|
270 if (iterator.hasNext())<br>
|
|
271 TreeNode node = iterator.next();
|
1
|
272 </div>
|
2
|
273 <ol>
|
|
274 <li>Treeから木の探索を行うInterfaceTraverserを取得する</li>
|
|
275 <li>findを実行する。引数には、検索条件が記述されたQuery、Person-Id、p:4を与える。(以下Queryの中の解説)</li>
|
|
276 <li>nodeから属性名Person-idとペアになっている属性値を取得する</li>
|
|
277 <li>返り値がp:4と一致するかどうかを調べる</li>
|
|
278 <li>一致した場合trueを一致しなかった場合falseを返す</li>
|
|
279 <li>帰ってきたIteratorからNodeを取得する</li>
|
|
280 </ol>
|
|
281 </font>
|
|
282 </div>
|
|
283
|
|
284 <div>
|
|
285 <h1>maTrix上での許認可判断例(1)</h1>
|
|
286 <font size=5>
|
|
287 <p>情報工学科の学生にのみ貸し出されるPCをAさんが借りようとした場合の許認可判断</p>
|
|
288 <ol>
|
|
289 <li>Aさん(Subject)が、学科のノートPC(Resource)の借りる(Action)ために、maTrixに貸出許可を求める</li>
|
|
290 <li>maTrixは、PCの貸出許可を与えるかを判断するためのポリシーファイルを参照する</li>
|
3
|
291 <li>maTrixはAさんの役割を取得する</li>
|
4
|
292 <li>Aさんが情報工学科学生の役割を持っていた場合貸出許可を与える</li>
|
2
|
293 </ol>
|
4
|
294 <p>maTrixは、3番目の処理で役割を取得する検索関数roleIdsを使用している</p>
|
2
|
295 </font>
|
|
296 </div>
|
|
297
|
|
298 <div>
|
|
299 <h1>役割を取得する関数</h1>
|
|
300 <font size=5>
|
|
301 <p>roleIdsは、人、組織の役割を取得する関数</p>
|
1
|
302 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
|
2
|
303 public Iterator<String> searchPersonRoleIds(String version, String id, LinkedList<String> filterIds)
|
|
304 </div>
|
|
305 <p>roleIdsは引数に</p>
|
|
306 <li>検索を行う組織構造のversion</li>
|
|
307 <li>役割を取得したい人 or 組織のId</li>
|
|
308 <li>検索対象を絞り込むために使用するフィルター</li>
|
3
|
309 <p>の3つをとり、返り値に役割のIteratorを返します</p>
|
2
|
310 </font>
|
|
311 </div>
|
1
|
312
|
2
|
313 <div>
|
|
314 <h1>roleIdsのフィルター</h1>
|
|
315 <font size=5>
|
|
316 <p>人や組織は、複数の組織に所属することが可能</p>
|
|
317 <p>組織に所属する際に役割が与えられる</p>
|
|
318 <p>例. 人が大学に所属していると、「学生」や「教授」という役割が与えられる</p>
|
4
|
319 <p>フィルターを使うと役割を与える組織、で結果を絞り込める</p>
|
1
|
320 </font>
|
|
321 </div>
|
|
322
|
4
|
323 <!--
|
1
|
324 <div>
|
2
|
325 <h1>roleIdsのコード</h1>
|
1
|
326 <font size=5>
|
2
|
327 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
|
|
328 JungleTree personTree = getTree(version, "Person");<br>
|
|
329 </div>
|
|
330 <p>maTrixは組織構造を版管理している</p>
|
|
331 <p>getTree(String Version, String TreeName)は、VersionとTreeNameで指定された木を返す</p>
|
|
332 <p>今回はroleIdsの引数で指定されたversionの人物Treeを取得している</p>
|
|
333 </font>
|
|
334 </div>
|
|
335
|
|
336 <div>
|
|
337 <h1>roleIdsのコード</h1>
|
|
338 <font size=5>
|
|
339 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
|
|
340 InterfaceTraverser traverser = personTree.getTraverser(useIndex);<br>
|
|
341 Iterator<TreeNode> personNodeIterator = traverser.find((TreeNode node) -> {<br>
|
|
342 String nodeId = node.getAttributes().getString("Person-id");<br>
|
|
343 if (nodeId.equals(id))<br>
|
|
344 return true;<br>
|
|
345 return false;<br>
|
|
346 }, "Person-id", id);<br>
|
|
347 </div>
|
3
|
348 <p>getTreeで取得した木から、getTraverserで木を探索する機能を持ったTraverserを取得する</p>
|
4
|
349 <p>取得したTraverser.findで、属性名 Person-id、属性値 引数で指定されたidのペアを持つノードを検索する</p>
|
2
|
350 </font>
|
|
351 </div>
|
|
352
|
|
353
|
|
354 <div>
|
|
355 <h1>roleIdsのコード</h1>
|
|
356 <font size=5>
|
|
357 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
|
|
358 TreeNode PersonNode = personNodeIterator.next();<br>
|
4
|
359 TreeNode rolesNode = PersonNode.getChildren().at(5);<br>
|
|
360 Iterator<TreeNode> roleIterator = rolesNode.getChildren().iterator();<br>
|
|
361 return new Iterator<String>() {<br>
|
3
|
362 ………<BR>
|
|
363 };
|
2
|
364 </div>
|
|
365 <p>findで取得したノードから、その人が持っている役割を持つノードのIteratorを取得する</p>
|
|
366 <p>idを持っているノードの5番目の子供の下に役割のデータが格納されている</p>
|
|
367 <p>なので、PersonNode.getChildren().at(5).b();で5番目の子供を取得</p>
|
3
|
368 <p>その下に役割のデータが入ったノードがあるので、子供のiteratorを取得する</p>
|
|
369 <p>検索条件にあった役割を返すiteratorを定義する</p>
|
2
|
370 </font>
|
|
371 </div>
|
|
372
|
|
373 <div>
|
|
374 <h1>roleIdsのコード</h1>
|
|
375 <font size=5>
|
3
|
376 <p>定義したiteratorのhasNext</p>
|
|
377 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
|
|
378 public boolean hasNext() {<br>
|
4
|
379 if (roleIterator.hasNext())<br>
|
|
380 roleId = search();<br>
|
3
|
381 else<br>
|
4
|
382 roleId = null;<br>
|
|
383 if (roleId != null)<br>
|
3
|
384 return true;<br>
|
|
385 return false;<br>
|
|
386 }<br>
|
|
387 </div>
|
|
388 <p>取得した役割のIteratorの中身がある場合はsearch()を実行する</p>
|
|
389 <p>search()は条件にあった役割を返す</p>
|
4
|
390 <p>中身がない場合はroleId = nullを行う</p>
|
|
391 <p>roleIdがnullの場合、条件にあった役割は無いのでfalseを返し</p>
|
|
392 <p>roleIdに値がある場合はtrueを返す</p>
|
|
393 <p>next()では、roleIdの値を返せば良い</p>
|
3
|
394 </font>
|
|
395 </div>
|
|
396
|
|
397
|
|
398
|
|
399 <div>
|
|
400 <h1>roleIdsのコード</h1>
|
|
401 <font size=5>
|
2
|
402 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
|
4
|
403 for (; roleIterator.hasNext(); ) {<br>
|
|
404 TreeNode roleNode = roleIterator.next();<br>
|
|
405 TreeNode organizationNode = roleNode.getChildren().at(0).b();<br>
|
|
406 String organizationId = organizationNode.getAttributes().getString("text-organizationRefId");<br>
|
|
407 if (!filterIds.contains(organizationId) && !filterIds.isEmpty())<br>
|
3
|
408 continue;<br>
|
4
|
409 TreeNode roleIdNode = roleNode.getChildren().at(1).b();<br>
|
|
410 return roleIdNode.getAttributes().getString("text-roleRefId");<br>
|
2
|
411 }<br>
|
3
|
412 return null;
|
2
|
413 </div>
|
|
414 <p>役割のデータが入ったノードのiteratorをfor文で回して役割を取得する</p>
|
3
|
415 <p>iteratorで取得できるノードの0番目の子供には役割を与える組織idが</p>
|
|
416 <p>1番目のノードには与えられる役割idを保持している</p>
|
|
417 <p>0番目の子供から組織idを取得し検索結果の絞込を行う</p>
|
|
418 <p>その後1番目のノードから役割idを返す</p>
|
|
419 <p>役割のノードのiteratorが空になったら、nullを返す</p>
|
1
|
420 </font>
|
|
421 </div>
|
4
|
422 -->
|
1
|
423
|
|
424 <div>
|
|
425 <font size=5>
|
|
426 <h1>木構造の親を辿るQuery</h1>
|
2
|
427 <p>maTrixで許認可を判断する際に、木構造の親を辿る検索が必要になる場合がある</p>
|
1
|
428 <p>以下に親を辿る検索を行う例を記す</p>
|
|
429 <ol>
|
|
430 <li>Aさんが、maTrixに工学部の学生にのみ貸出を行っている書籍の貸出許可を求める</li>
|
4
|
431 <li>maTrixは、書籍の貸出許可を与えるかを判断するためのポリシーファイルを参照する</li>
|
1
|
432 <li>Aさんの所属している組織の情報を取得する(情報工学科)</li>
|
|
433 <li>情報工学科の親の情報を取得する(工学部)</li>
|
4
|
434 <li>maTrixは、Aさんは工学部に所属しているため本の貸出を許可する</li>
|
1
|
435 </ol>
|
4
|
436 <p>4番目の処理で親ノードを辿る処理を行っています</p>
|
2
|
437 </font>
|
|
438 </div>
|
|
439
|
|
440
|
|
441 <div>
|
|
442 <h1>親を辿るQueryのコード</h1>
|
|
443 <font size=5>
|
|
444 <p>以下に親の取得を行う部分のコードを記述する</p>
|
|
445 <p>idには工学部のidが、orgNodeにはAさんが所属している組織のidを持ったノードが入っている</p>
|
|
446 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
|
4
|
447 while(true) {<br>
|
3
|
448 String orgId = orgNode.getAttributes().getString("Organization-id");<br>
|
|
449 if (id.equals(orgId))<br>
|
|
450 return true;<br>
|
4
|
451 Optional<TreeNode> parentOrgNodeOptional = parentIndex.get(orgNode);<br>
|
3
|
452 if (parentOrgNodeOptional.isPresent())<br>
|
|
453 orgNode = parentOrgNodeOptional.get();<br>
|
|
454 else<br>
|
|
455 return false;<br>
|
4
|
456 }<br>
|
2
|
457 </div>
|
|
458 <ol>
|
|
459 <li>orgNodeから組織のidを取得する</li>
|
|
460 <li>idと取得した組織のidを比較する</li>
|
|
461 <li>一致した場合はtrueを、しなかった場合はorgNodeの親を取得する</li>
|
|
462 </ol>
|
|
463 <p>以上の処理を取得できる親ノードが無くなるまで行う</p>
|
|
464 </font>
|
|
465 </div>
|
|
466
|
|
467 <div>
|
4
|
468 <h1>ポリシーファイルのインタプリタ</h1>
|
|
469 <font size=5>
|
|
470 <p>maTrixのポリシーファイルを読み込んで許認可を判断するインタプリタの実装を行った</p>
|
|
471 <p>引数にポリシーファイルと、誰が(subject)、何に(Resource)、どうするか(Action)を取る</p>
|
|
472 <p>返り値は、許可(Permit) or 拒否(Deny)がある</p>
|
|
473 <p>実際にJungleの上で許認可判断が行えるようになった</p>
|
|
474 </font>
|
|
475 </div>
|
|
476
|
|
477
|
|
478 <div>
|
2
|
479 <h1>ベンチマーク</h1>
|
|
480 <font size=5>
|
|
481 <p>Jungle上にmaTrixの実装を行ったので、性能測定を行った</p>
|
4
|
482 <p>測定はmongoDBとの比較とマルチプロセッサー上での性能評価の2つを行った</p>
|
2
|
483 <p>木構造をそのまま格納できること、属性名を指定することで属性値が取得できるなど、Jungleと似た特徴を持っているmongoDBを比較対象に選択した</p>
|
|
484 </font>
|
|
485 </div>
|
|
486
|
|
487 <div>
|
|
488 <h1>測定環境</h1>
|
|
489 <font size=5>
|
|
490 <p>今回の測定は以下の環境で行った</p>
|
|
491 <li>Mac OS X 10.10.2</li>
|
|
492 <li>2*2.66 GHz 6-Core Intel Xeon</li>
|
|
493 <li>Memory 16GB 1333MHz DDR3</li>
|
|
494 <li>java 1.8.0-45</li>
|
|
495 <li>mongoDB 3.0.2</li>
|
|
496 <li>javascript V8JavaScriptengine</li>
|
1
|
497 </font>
|
|
498 </div>
|
|
499
|
|
500
|
|
501 <div>
|
2
|
502 <h1>mongoDBとの比較</h1>
|
1
|
503 <font size=5>
|
4
|
504 <p>1万個のデータをmongoDBとJungleに格納し、データの検索にかかる時間の測定を行った</p>
|
2
|
505 <p>各DBに挿入するデータは以下のような構造を持つ</p>
|
|
506 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
|
4
|
507 {PersonId: 固有のPersonId ,roleId:ランダムな役割Id}<br>
|
2
|
508 </div>
|
|
509 </font>
|
|
510 </div>
|
|
511
|
|
512 <div>
|
|
513 <h1>mongoDBとの比較</h1>
|
|
514 <font size=5>
|
|
515 <p>mongoDBでのデータの読み込みは以下のように行った</p>
|
|
516 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
|
|
517 var personData = db.person1.find({PersonId:"p:9"}).next();<br>
|
|
518 var roleId = personData.roleId<br>
|
|
519 </div>
|
|
520 <p>dbからpersonIdがp:9のuserを取得する</p>
|
|
521 <p>取得したuserのroleIdを取得する</p>
|
|
522 </font>
|
|
523 </div>
|
|
524
|
|
525 <div>
|
|
526 <h1>mongoDBとの比較</h1>
|
|
527 <font size=5>
|
|
528 <p>Jungleのデータの読み込みは以下のように行った</p>
|
|
529 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;">
|
4
|
530 InterfaceTraverser traverser = tree.getTraverser(true);<br>
|
2
|
531 Iterator<TreeNode> it = traverser.find((TreeNode node) -> {<br>
|
|
532 String nodeId = node.getAttributes().getString("Person-id");<br>
|
|
533 if (nodeId.equals("p:9"))<br>
|
|
534 return true;<br>
|
|
535 return false;<br>
|
4
|
536 }, "Person-id", "p:9");<br>
|
2
|
537 if (it.hasNext()) {<br>
|
|
538 TreeNode targetNode = it.next();<br>
|
|
539 String targetRoleId = targetNode.getAttributes().getString("roleId");<br>
|
|
540 }<br>
|
|
541 </div><br>
|
|
542 <p>TreeからpersonIdがp:9のノードを取得する</p>
|
|
543 <p>取得したノードからroleIdを取得する</p>
|
1
|
544 </font>
|
|
545 </div>
|
|
546
|
|
547 <div>
|
2
|
548 <h1>mongoDBとの比較</h1>
|
|
549 <embed src="images/mongoJungleperfomance.svg" width="700" height="700" align="left"/>
|
1
|
550 <font size=5>
|
2
|
551 <br>
|
|
552 <p>Jungleの方がmongoDBより高速で動いた理由として、<br>通信の有無が大きい</p>
|
|
553 <p>mongoDBはMongoShellからデータベースにアクセスする際に<br>通信を行っている</p>
|
|
554 <p>それに対しJungleは、通信を行わないため高速に動作する</p>
|
3
|
555 <p>データへのアクセスもmongoDBは<br>ディスクにあるデータに対しmmapを用いて行う</p>
|
2
|
556 <p>Jungleは初めからメモリにあるデータにアクセスする</p>
|
|
557 <p>その部分も差が出た理由の1つである</p>
|
|
558 <p>その結果JungleはmongoDBの約500倍の性能が出ている</p>
|
1
|
559 </font>
|
|
560 </div>
|
|
561
|
|
562 <div>
|
2
|
563 <h1>マルチプロセッサー上でのJungleの読み書き性能</h1>
|
1
|
564 <font size=5>
|
2
|
565 <p>Jungleがマルチプロセッサ上で性能が出るか測定を行った</p>
|
4
|
566 <p>複数スレッドからJungleに読み込みだけを行った場合と、1スレッドだけ書き込みを行い続け、<br>残りのスレッドで読み込み行った場合で測定を行った</p>
|
|
567 <p>Jungleに格納したデータはmaTrixで実際に使われているユーザーデータ400人分</p>
|
3
|
568 <p>読み込みではmaTrixで実際に使われている検索関数isActive(personId , version)を用いた</p>
|
|
569 <p>この関数引数で与えた人が、maTrixにアカウントを持っているか調べる関数である</p>
|
|
570 </font>
|
|
571 </div>
|
|
572
|
|
573 <div>
|
|
574 <h1>マルチプロセッサー上でのJungleの読み書き性能</h1>
|
|
575 <font size=5>
|
2
|
576 <embed src="images/transactionPersecond.svg" width="700" height="700"align="left"/>
|
|
577 <br>
|
4
|
578 <p>Jungleでは、書き込みと読み込みを同時に行っても<br>ほぼ性能低下はおこらなかった</p>
|
2
|
579 <p>ハイパースレッディングに引っかかるまでは<br>リニアに性能が出ている</p>
|
|
580 <p>書き込みと読み込みを同時に行った場合、<br>読み込みのCPUCOUNTが2の時だけ性能が出ていない</p>
|
|
581 <p>これは、書き込みを連続で行っているため<br>読み込みと書き込みで競合が起きている</p>
|
|
582 <p>しかし読み込みのスレッドが増えると<br>読み込みが優先されるので性能が出るようになっている</p>
|
|
583 <p>読み込みと書き込み同時に行っている方が<br>CPUCOUNT11で性能上昇が止まっているのは<br>書き込みに1スレッド使用しているからである</p>
|
|
584 </font>
|
|
585 </div>
|
|
586
|
3
|
587 <div>
|
2
|
588 <h1>考察</h1>
|
|
589 <font size=5>
|
4
|
590 <p>マルチプロセッサ上でもJungleは並列に動作する</p>
|
|
591 <p>性能比較では、JungleのほうがMongoDBより高速に動いたが、全てのアプリケーションでJungleの方が早いわけではない</p>
|
2
|
592 <p>Jungleは、木構造の形と使われ方がアルゴリズム的に一致している場合に性能が出る</p>
|
|
593 </font>
|
|
594 </div>
|
|
595
|
|
596 <div>
|
|
597 <h1>Jungleに向いているアプリケーション</h1>
|
|
598 <font size=5>
|
|
599 <p>Jungleは、書き込み時の処理が木の大きさで変わる</p>
|
4
|
600 <p>そのため、比較的小さな木がたくさんあり、木の深い部分に対し変更があまり行われないアプリケーションが得意</p>
|
2
|
601 <p>また、書き込みより読み込みを重視したDBであるため、読み込みが多いアプリケーションが性能が出る</p>
|
|
602 <p>そのため、Jungleの上に構築するアプリケーション例としてBBSやWEBページなどがある</p>
|
|
603 </font>
|
|
604 </div>
|
|
605
|
|
606 <div>
|
|
607 <h1>Jungleに不向きなアプリケーション</h1>
|
|
608 <font size=5>
|
|
609 <p>逆に、1つの大きな木に対し変更が頻繁に行われるようなアプリケーションは向いていない</p>
|
|
610 <p>そういった場合、木を分割して複数の小さな木にすることで性能を上げることは可能である</p>
|
|
611 <p>しかし、木を分割するための設計手法がまだ無いので、設計手法の確立は今後の課題である</p>
|
1
|
612 </font>
|
|
613 </div>
|
|
614
|
|
615
|
|
616 <div>
|
2
|
617 <h1>今後の課題</h1>
|
1
|
618 <font size=5>
|
2
|
619 <p>1. RDBとの比較</p>
|
|
620 <p> もともとmaTrixはRDB上で動いているアプリケーションなので、RDB版maTrixとの性能測定を行いたい</p>
|
|
621 <p>2.データの書き出し部分の改良</p>
|
|
622 <p> Jungleはデータをディスクに書き出すことが可能である</p>
|
|
623 <p> 書きだしたデータを読み込む機能もあるのでトラブルが発生し、Jungleが強制終了されても元の状態に復旧できる</p>
|
4
|
624 <p> 今の実装は、データの書き出しは、変更が加わる度に行われるので、非効率的である</p>
|
2
|
625 <p> できれば複数回分の変更をバッファリングしておいて一気に書き出しを行いたい</p>
|
3
|
626 <p> ある値を行ったり来たりするような、書き出す必要が無いデータもあるため、書き出す部分の最適化を行う必要がある</p>
|
2
|
627 </font>
|
|
628 </div>
|
|
629
|
|
630 <div>
|
|
631 <h1>今後の課題</h1>
|
|
632 <font size=5>
|
4
|
633 <p>3.メモリの効率的な利用</p>
|
2
|
634 <p> Jungleは非破壊でデータを保持し続けるため、非常に多くのメモリを消費する</p>
|
4
|
635 <p> ある程度のタイミングで過去のデータをメモリから解放する必要がある</p>
|
|
636 <p> しかし、データを解放するタイミングは、Jungle上に実装するアプリケーションによって変わる</p>
|
|
637 <p> そこを含め、データを解放するAPIの設計を行う必要がある</p>
|
2
|
638 <p>4.分散環境でのmaTrixの構築</p>
|
|
639 <p> Jungleはもともと分散データベースである</p>
|
|
640 <p> 分散版Jungle上にmaTrixを構築し、性能測定を行いたい</p>
|
1
|
641 </font>
|
|
642 </div>
|
|
643
|
2
|
644
|
|
645 <div>
|
|
646 <h1>今後の課題</h1>
|
|
647 <font size=5>
|
|
648 <p>5.設計手法の確立</p>
|
|
649 <p> Jungleは木構造のデータをそのまま格納できる</p>
|
|
650 <p> 木のサイズが大きいと、データ更新の負荷が大きくなるため分割を行う必要がある</p>
|
|
651 <p> 分割を行った木同士の参照はIdを用いた間接的なものになる</p>
|
|
652 <p> このようにJungleはRDBと異なり格納するデータの自由度が大きい</p>
|
4
|
653 <p> Jungleの設計手法を確立させる必要がある</p>
|
2
|
654 </font>
|
|
655 </div>
|
|
656
|
|
657 <div>
|
|
658 <h1>まとめ</h1>
|
|
659 <font size=5>
|
|
660 <p>当研究室で開発している非破壊的木構造データベースJungle上に許認可管理アプリケーションmaTrixを実装した</p>
|
|
661 <p>その際必要になった検索APIやIndexの実装を行った</p>
|
4
|
662 <p>またFunctionalJavaのTreeMapでは性能が出なかったので、非破壊TreeMapを自作した</p>
|
2
|
663 <p>性能測定ではmongoDBより高速に動き、マルチプロセッサ上でも並列に動作した</p>
|
|
664 </font>
|
|
665 </div>
|
1
|
666 </div> <!-- presentation -->
|
|
667 </body>
|
|
668 </html>
|