Mercurial > hg > Papers > 2015 > tatsuki-sigos
comparison slide/slide.html @ 4:84bbcfe22656 default tip
change slide
author | tatsuki |
---|---|
date | Sat, 12 Sep 2015 17:30:58 +0900 |
parents | 082148d6bf7f |
children |
comparison
equal
deleted
inserted
replaced
3:082148d6bf7f | 4:84bbcfe22656 |
---|---|
94 <!-- add slides here; example --> | 94 <!-- add slides here; example --> |
95 <div id="header"> | 95 <div id="header"> |
96 <font size=5> | 96 <font size=5> |
97 <h1>非破壊的木構造データベースJungleとその評価</h1> | 97 <h1>非破壊的木構造データベースJungleとその評価</h1> |
98 <br><br> | 98 <br><br> |
99 </font> | |
100 <font size=6> | |
99 <p>琉球大学情報工学科並列信頼研</p> | 101 <p>琉球大学情報工学科並列信頼研</p> |
100 <p>金川竜己</p></font> | 102 <p>金川竜己</p></font> |
101 | 103 |
102 </div> | 104 </div> |
103 | 105 |
104 <div> | 106 <div> |
105 <h1>知的構造を格納するためのデータベース</h1> | 107 <h1>知的構造を格納するためのデータベース</h1> |
106 <font size=5> | 108 <font size=5> |
107 <p>我々が扱っている知識は木構造であることが多い。</p> | 109 <p>我々が扱っている知識は木構造であることが多い。</p> |
108 <p>RDBに格納するためには煩雑なデータ設計を行わなければならない</p> | 110 <p>RDBに木構造を格納する際は表に変換を行う必要があり、スキーマが煩雑になる</p> |
109 <p>データ設計等を行うこと無く木構造を格納できるデータベースが望ましい</p> | 111 <p>木構造をそのまま格納できるデータベースが欲しい</p> |
110 <p>そこで当研究室では、非破壊的木構造データベースJungleの開発をおこなっている</p> | 112 <p>データ構造をリトライ可能な形で変更したい</p> |
113 <p>いろいろ試しながらアプリケーションに合ったデータ設計を行える</p> | |
114 <p>当研究室では、非破壊的木構造データベースJungleの開発をおこなっている</p> | |
111 <p>Jungleの表現力、機能の十分性検証、及び性能実証実験を行いたい</p> | 115 <p>Jungleの表現力、機能の十分性検証、及び性能実証実験を行いたい</p> |
112 <p>そのために、Jungle上に組織の許認可管理アプリケーションmaTrixを実装した</p> | 116 <p>そのために、Jungle上に組織の許認可管理アプリケーションmaTrixを実装した</p> |
113 </font> | 117 </font> |
114 </div> | 118 </div> |
115 | 119 |
116 | 120 |
117 <div> | 121 <div> |
118 <h1>組織の中の許認可管理アプリケーションmaTrix</h1> | 122 <h1>組織の中の許認可管理アプリケーションmaTrix</h1> |
119 <font size=5> | 123 <font size=5> |
120 <p>人、組織、役割等の木構造データを保持しており</p> | 124 <p>人、組織、役割等の複数の木構造データを組織構造として保持している</p> |
121 <p>木構造のデータはIdでお互いに参照を行っている</p> | 125 <p>組織構造は版管理されている</p> |
126 <p>木構造のデータはお互いに参照を行っている</p> | |
122 <p>許認可の判断はアクセスルールが記述されたポリシーファイルにそって行われる</p> | 127 <p>許認可の判断はアクセスルールが記述されたポリシーファイルにそって行われる</p> |
123 <p>ポリシーファイルは主に、誰が (Target)、何を (Redource)、どうできるか(Action) の3つの要素で記述されている</p> | 128 <p>ポリシーファイルは主に、誰が (Target)、何を (Redource)、どうできるか(Action) の3つの要素で記述されている</p> |
124 </font> | 129 </font> |
125 </div> | 130 </div> |
126 | 131 |
128 <div> | 133 <div> |
129 <h1>非破壊的木構造データベースJungle</h1> | 134 <h1>非破壊的木構造データベースJungle</h1> |
130 <font size=5> | 135 <font size=5> |
131 <p>Jungleは、複数の木の集合からなり、木はノードの集合で出来ている</p> | 136 <p>Jungleは、複数の木の集合からなり、木はノードの集合で出来ている</p> |
132 <p>ノードは、自身の子供のリストと、属性名(Key)と属性値(Value)のデータの組を持つ</p> | 137 <p>ノードは、自身の子供のリストと、属性名(Key)と属性値(Value)のデータの組を持つ</p> |
133 <p>Jungleは、非破壊的木構造であるため、一度作成した木を破壊することはない</p> | 138 <p>Jungleは、木の編集を行う際に一度作成した木を上書きしない</p> |
134 </font> | 139 <p>新しい木構造を構築することでデータの編集を行う</p> |
135 </div> | 140 <p>変更がないノードは共有する</p> |
136 | 141 <p>木が変更されていることが保証されているため、読み込み時にロックをかける必要がない</p> |
137 | 142 <p>Jungleは過去のversionへの木の参照を持つ</p> |
138 | 143 <p>過去の木に対してアクセスが可能</p> |
139 | 144 </font> |
145 </div> | |
146 | |
147 | |
148 | |
149 <!-- | |
140 <div> | 150 <div> |
141 <h1>Jungleのデータの編集</h1> | 151 <h1>Jungleのデータの編集</h1> |
142 <font size=5> | 152 <font size=5> |
143 <p>新しい木構造を作成することでデータの編集を行う</p> | 153 <p>Jungleは、木の編集を行う際に一度作成した木を上書きしない</p> |
154 <p>新しい木構造を構築することでデータの編集を行う</p> | |
144 <p>変更がないノードは共有する</p> | 155 <p>変更がないノードは共有する</p> |
145 <img src="./images/non_destructive_tree_edit2.png"> | 156 <iframe src="images/non_destructive_tree_edit2.html" width="1000" height="400"></iframe> |
146 <p>木の更新は、ルートノードをCASを用いて入れ替えることで行う</p> | 157 <p>木の更新は、ルートノードをCASを用いて入れ替えることで行う</p> |
147 <p>データの上書きが無いため、読み込み中にロックをかける必要がない</p> | 158 <p>データの上書きが無いため、読み込み中にロックをかける必要がない</p> |
148 </font> | 159 <p>木は過去のversionの木への参照を持つ</p> |
149 </div> | 160 </font> |
150 | 161 </div> |
151 | 162 |
163 --> | |
152 | 164 |
153 <div> | 165 <div> |
154 <h1>Jungle上でのmaTrixのデータ構造の表現</h1> | 166 <h1>Jungle上でのmaTrixのデータ構造の表現</h1> |
155 <font size=5> | 167 <font size=5> |
156 <p>Jugnleは木構造のデータをそのまま格納できるため、maTrixのデータを一部を除きそのまま格納できる</p> | 168 <p>Jugnleは木構造のデータをそのまま格納できる</p> |
169 <p>maTrixが書きだしたxml形式データをそのまま格納できる</p> | |
157 <p>maTrixの人物TreeをJungleに格納した図の一部を以下に示す</p> | 170 <p>maTrixの人物TreeをJungleに格納した図の一部を以下に示す</p> |
158 <iframe src="images/TreePersonJungle.html" width="1000" height="1000"></iframe> | 171 <iframe src="images/TreePersonJungle.html" width="1000" height="1000"></iframe> |
159 <p></p> | 172 <p></p> |
160 </font> | 173 </font> |
161 </div> | 174 </div> |
162 | 175 |
163 | 176 |
164 <div> | 177 <div> |
165 <font size=5> | 178 <font size=5> |
166 <h1>Jungle上でのIdを使った木の相互参照</h1> | 179 <h1>Jungle上でのIdを使った木の相互参照</h1> |
167 <p>組織構造は複数の木構造を持ち、お互いのノード参照し合っている</p> | 180 <p>組織構造は複数の木構造を持ち、お互いのノード参照している</p> |
168 <p>ex. 人物と役割は、idを用いてお互いのノードを参照する</p> | 181 <p>ノードの参照はidとindexを用いて表現する</p> |
169 <iframe src="images/ref.html" width="2000" height="1000"></iframe> | 182 <iframe src="images/ref.html" width="2000" height="1000"></iframe> |
170 </font> | 183 </font> |
171 </div> | 184 </div> |
172 | 185 |
173 | 186 |
174 <div> | 187 <div> |
175 <h1>JungleのIndex</h1> | 188 <h1>JungleのIndex</h1> |
176 <font size=5> | 189 <font size=5> |
177 <p>Jungleは過去のTreeを全て保持しているため、Treeのversion毎にIndexを持っている必要がある</p> | 190 <p>Jungleは過去の木を全て保持している</p> |
178 <p>version毎にIndexを作るとメモリを多量使用してしまう</p> | 191 <p>version毎にIndexを持っている必要がある</p> |
179 <p>過去のIndexとデータを共有するIndexを実装した</p> | 192 <p>全てに新しくIndexを作るとメモリを多量使用してしまう</p> |
193 <p>前の版のIndexから変更が行われていないデータを共有するIndexを実装した</p> | |
180 <p>複数のversionのIndexがあっても、データの差分しかメモリは使用されない</p> | 194 <p>複数のversionのIndexがあっても、データの差分しかメモリは使用されない</p> |
181 </font> | 195 </font> |
182 </div> | 196 </div> |
183 | 197 |
184 <div> | 198 <div> |
185 <h1>非破壊TreeMapの実装</h1> | 199 <h1>非破壊TreeMapの実装</h1> |
186 <font size=5> | 200 <font size=5> |
187 <p>当初は、FunctionalJavaのTreeMapを使用してIndexの実装を行った</p> | 201 <p>FunctionalJavaというjava上で関数型プログラミングが行えるライブラリがある</p> |
188 <p>FunctionalJavaにはバグがあり、性能が出なかった</p> | 202 <p>当初はFunctionalJavaのTreeMapを使用してIndexの実装を行った</p> |
203 <p>FunctionalJavaにはTreeMapにはgetが致命的に遅いバグがあった</p> | |
189 <p>新しく非破壊TreeMapを実装した</p> | 204 <p>新しく非破壊TreeMapを実装した</p> |
190 <p>TreeMapのアルゴリズムには赤黒木を採用した</p> | |
191 <p>その結果Jungleの性能は劇的に向上した</p> | 205 <p>その結果Jungleの性能は劇的に向上した</p> |
192 </font> | 206 </font> |
193 </div> | 207 </div> |
194 | 208 |
195 | 209 |
196 | 210 |
197 <div> | 211 <div> |
198 <h1>木構造の親を取得するIndex</h1> | 212 <h1>ノードの親を取得するIndex</h1> |
199 <font size=5> | 213 <font size=5> |
200 <p>Jungleは子から親への参照は存在しないため、自身の親を返すParentIndexの実装を行った</p> | 214 <p>Jungleは子から親への参照は存在しない</p> |
215 <p>子ノードを渡すと親をノードを返すParentIndexの実装を行った</p> | |
201 </font> | 216 </font> |
202 </div> | 217 </div> |
203 | 218 |
204 <div> | 219 <div> |
205 <h1>許認可Queryの実装</h1> | 220 <h1>許認可Queryの実装</h1> |
211 </font> | 226 </font> |
212 </div> | 227 </div> |
213 | 228 |
214 | 229 |
215 <div> | 230 <div> |
216 <font size=5> | |
217 <h1>Treeの検索</h1> | 231 <h1>Treeの検索</h1> |
218 <p>データアクセス関数を実装するため、Traverserに検索関数findを実装する</p> | 232 <font size=5> |
233 <p>検索関数はTraverserに実装する</p> | |
219 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> | 234 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> |
220 InterfaceTraverser traverser = tree.getTraverser(boolean useIndex); | 235 InterfaceTraverser traverser = tree.getTraverser(boolean useIndex); |
221 </div> | 236 </div> |
222 <p>TraverserはTreeのNodeを走破する機能を持ったクラスです</p> | 237 <p>Traverserは木のノードを走破する機能を持ったクラスです</p> |
223 <p>TreeからgetTraverserで取得可能</p> | 238 <p>TreeからgetTraverserで取得可能</p> |
224 <p>引数で検索を行う際にIndexを使用するかどうかを選択できる</p> | 239 <p>引数で検索を行う際にIndexを使用するかどうかを選択できる</p> |
225 </font> | 240 </font> |
226 </div> | 241 </div> |
227 | 242 |
228 <div> | 243 <div> |
229 <font size=5> | |
230 <h1>Treeの検索</h1> | 244 <h1>Treeの検索</h1> |
245 <font size=5> | |
231 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> | 246 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> |
232 public Iterator<TreeNode> find(Query query,String key, String searchValue); | 247 public Iterator<TreeNode> find(Query query,String key, String searchValue); |
233 </div> | 248 </div> |
234 <p>findは以下のように定義されており、引数に</p> | 249 <p>findは上のように定義されており、引数に</p> |
235 <p>探索の条件を記述する関数boolean condition(TreeNode)を定義したQuery</p> | 250 <p>検索の条件を記述する関数boolean condition(TreeNode)を定義したQuery</p> |
236 <p>Indexを使う検索に使用するString 属性名、String 属性値のペア</p> | 251 <p>Indexを使う検索に使用するString 属性名、String 属性値のペア</p> |
237 <p>の3つを取る</p> | 252 <p>の3つを取る</p> |
238 <p>条件に一致したNodeのIteratorを返す</p> | 253 <p>条件に一致したNodeのIteratorを返す</p> |
239 <p>Iteratorは、複数の値から1つずつ順番に取得するためのinterfaceである</p> | 254 <p>Iteratorは、複数の値から1つずつ順番に取得するためのinterfaceである</p> |
240 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> | |
241 public interface Query {<br> | |
242   boolean condition(TreeNode _node);<br> | |
243 } | |
244 </div> | |
245 </font> | 255 </font> |
246 </div> | 256 </div> |
247 | 257 |
248 <div> | 258 <div> |
249 <h1>findの使用例</h1> | 259 <h1>findの使用例</h1> |
250 <font size=5> | 260 <font size=5> |
251 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> | 261 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> |
252 InterfaceTraverser personTraverser = personTree.getTraverser(true);<br> | 262 InterfaceTraverser personTraverser = personTree.getTraverser(true);<br> |
253 Iterator<TreeNode> personIdpairIterator = personTraverser.find((TreeNode node) -> { <br> | 263 Iterator<TreeNode> iterator = personTraverser.find((TreeNode node) -> { <br> |
254 String personId = node.getAttributes().getString("Person-id");<br> | 264 String personId = node.getAttributes().getString("Person-id");<br> |
255 if (personId.equals("p:4"))<br> | 265 if (personId.equals("p:4"))<br> |
256 return true;<br> | 266 return true;<br> |
257 return false;<br> | 267 return false;<br> |
258 }, "Person-id", "p:4");<br> | 268 }, "Person-id", "p:4");<br> |
259 <br> | 269 <br> |
260 if (personIdpairIterator.hasNext())<br> | 270 if (iterator.hasNext())<br> |
261 TreeNode node = personIdpairIterator.next(); | 271 TreeNode node = iterator.next(); |
262 </div> | 272 </div> |
263 <ol> | 273 <ol> |
264 <li>Treeから木の探索を行うInterfaceTraverserを取得する</li> | 274 <li>Treeから木の探索を行うInterfaceTraverserを取得する</li> |
265 <li>findを実行する。引数には、検索条件が記述されたQuery、Person-Id、p:4を与える。(以下Queryの中の解説)</li> | 275 <li>findを実行する。引数には、検索条件が記述されたQuery、Person-Id、p:4を与える。(以下Queryの中の解説)</li> |
266 <li>nodeから属性名Person-idとペアになっている属性値を取得する</li> | 276 <li>nodeから属性名Person-idとペアになっている属性値を取得する</li> |
277 <p>情報工学科の学生にのみ貸し出されるPCをAさんが借りようとした場合の許認可判断</p> | 287 <p>情報工学科の学生にのみ貸し出されるPCをAさんが借りようとした場合の許認可判断</p> |
278 <ol> | 288 <ol> |
279 <li>Aさん(Subject)が、学科のノートPC(Resource)の借りる(Action)ために、maTrixに貸出許可を求める</li> | 289 <li>Aさん(Subject)が、学科のノートPC(Resource)の借りる(Action)ために、maTrixに貸出許可を求める</li> |
280 <li>maTrixは、PCの貸出許可を与えるかを判断するためのポリシーファイルを参照する</li> | 290 <li>maTrixは、PCの貸出許可を与えるかを判断するためのポリシーファイルを参照する</li> |
281 <li>maTrixはAさんの役割を取得する</li> | 291 <li>maTrixはAさんの役割を取得する</li> |
282 <li>Aさんが情報工学科の役割を持っていた場合貸出許可を与える</li> | 292 <li>Aさんが情報工学科学生の役割を持っていた場合貸出許可を与える</li> |
283 </ol> | 293 </ol> |
284 <p>maTrixは、3番目の処理で役割を取得する関数roleIdsを使用している</p> | 294 <p>maTrixは、3番目の処理で役割を取得する検索関数roleIdsを使用している</p> |
285 </font> | 295 </font> |
286 </div> | 296 </div> |
287 | 297 |
288 <div> | 298 <div> |
289 <h1>役割を取得する関数</h1> | 299 <h1>役割を取得する関数</h1> |
304 <h1>roleIdsのフィルター</h1> | 314 <h1>roleIdsのフィルター</h1> |
305 <font size=5> | 315 <font size=5> |
306 <p>人や組織は、複数の組織に所属することが可能</p> | 316 <p>人や組織は、複数の組織に所属することが可能</p> |
307 <p>組織に所属する際に役割が与えられる</p> | 317 <p>組織に所属する際に役割が与えられる</p> |
308 <p>例. 人が大学に所属していると、「学生」や「教授」という役割が与えられる</p> | 318 <p>例. 人が大学に所属していると、「学生」や「教授」という役割が与えられる</p> |
309 <p>フィルターを使うと組織が与える役割で結果を絞り込める</p> | 319 <p>フィルターを使うと役割を与える組織、で結果を絞り込める</p> |
310 </font> | 320 </font> |
311 </div> | 321 </div> |
312 | 322 |
313 | 323 <!-- |
314 <div> | 324 <div> |
315 <h1>roleIdsのコード</h1> | 325 <h1>roleIdsのコード</h1> |
316 <font size=5> | 326 <font size=5> |
317 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> | 327 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> |
318 JungleTree personTree = getTree(version, "Person");<br> | 328 JungleTree personTree = getTree(version, "Person");<br> |
334 return true;<br> | 344 return true;<br> |
335 return false;<br> | 345 return false;<br> |
336 }, "Person-id", id);<br> | 346 }, "Person-id", id);<br> |
337 </div> | 347 </div> |
338 <p>getTreeで取得した木から、getTraverserで木を探索する機能を持ったTraverserを取得する</p> | 348 <p>getTreeで取得した木から、getTraverserで木を探索する機能を持ったTraverserを取得する</p> |
339 <p>取得したTraverser.findで、属性名 Person-id、属性値 引数で指定されたidのペアを持つノードのIteratorを検索する</p> | 349 <p>取得したTraverser.findで、属性名 Person-id、属性値 引数で指定されたidのペアを持つノードを検索する</p> |
340 </font> | 350 </font> |
341 </div> | 351 </div> |
342 | 352 |
343 | 353 |
344 <div> | 354 <div> |
345 <h1>roleIdsのコード</h1> | 355 <h1>roleIdsのコード</h1> |
346 <font size=5> | 356 <font size=5> |
347 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> | 357 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> |
348 TreeNode PersonNode = personNodeIterator.next();<br> | 358 TreeNode PersonNode = personNodeIterator.next();<br> |
349 TreeNode parentOrganizationsNode = PersonNode.getChildren().at(5).b();<br> | 359 TreeNode rolesNode = PersonNode.getChildren().at(5);<br> |
350 Iterator<TreeNode> OrganizationMappedByRoleIterator = parentOrganizationsNode.getChildren().iterator();<br> | 360 Iterator<TreeNode> roleIterator = rolesNode.getChildren().iterator();<br> |
351 return new Iteratorr<String>() {<br> | 361 return new Iterator<String>() {<br> |
352 ………<BR> | 362 ………<BR> |
353 }; | 363 }; |
354 </div> | 364 </div> |
355 <p>findで取得したノードから、その人が持っている役割を持つノードのIteratorを取得する</p> | 365 <p>findで取得したノードから、その人が持っている役割を持つノードのIteratorを取得する</p> |
356 <p>idを持っているノードの5番目の子供の下に役割のデータが格納されている</p> | 366 <p>idを持っているノードの5番目の子供の下に役割のデータが格納されている</p> |
364 <h1>roleIdsのコード</h1> | 374 <h1>roleIdsのコード</h1> |
365 <font size=5> | 375 <font size=5> |
366 <p>定義したiteratorのhasNext</p> | 376 <p>定義したiteratorのhasNext</p> |
367 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> | 377 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> |
368 public boolean hasNext() {<br> | 378 public boolean hasNext() {<br> |
369 if (OrganizationMappedByRoleIterator.hasNext())<br> | 379 if (roleIterator.hasNext())<br> |
370 roleRefId = search();<br> | 380 roleId = search();<br> |
371 else<br> | 381 else<br> |
372 roleRefId = null;<br> | 382 roleId = null;<br> |
373 if (roleRefId != null)<br> | 383 if (roleId != null)<br> |
374 return true;<br> | 384 return true;<br> |
375 return false;<br> | 385 return false;<br> |
376 }<br> | 386 }<br> |
377 </div> | 387 </div> |
378 <p>取得した役割のIteratorの中身がある場合はsearch()を実行する</p> | 388 <p>取得した役割のIteratorの中身がある場合はsearch()を実行する</p> |
379 <p>search()は条件にあった役割を返す</p> | 389 <p>search()は条件にあった役割を返す</p> |
380 <p>中身がない場合はroleRefId = nullを行う</p> | 390 <p>中身がない場合はroleId = nullを行う</p> |
381 <p>roleRefIdがnullの場合、条件にあった役割は無いのでfalseを返し</p> | 391 <p>roleIdがnullの場合、条件にあった役割は無いのでfalseを返し</p> |
382 <p>roleRefIdに値がある場合はtrueを返す</p> | 392 <p>roleIdに値がある場合はtrueを返す</p> |
383 <p>next()では、roleRefIdの値を返せば良い</p> | 393 <p>next()では、roleIdの値を返せば良い</p> |
384 </font> | 394 </font> |
385 </div> | 395 </div> |
386 | 396 |
387 | 397 |
388 | 398 |
389 <div> | 399 <div> |
390 <h1>roleIdsのコード</h1> | 400 <h1>roleIdsのコード</h1> |
391 <font size=5> | 401 <font size=5> |
392 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> | 402 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> |
393 for (; OrganizationMappedByRoleIterator.hasNext(); ) {<br> | 403 for (; roleIterator.hasNext(); ) {<br> |
394 TreeNode OrganizationMappedByRole = OrganizationMappedByRoleIterator.next();<br> | 404 TreeNode roleNode = roleIterator.next();<br> |
395 TreeNode organizationRefIdNode = OrganizationMappedByRole.getChildren().at(0).b();<br> | 405 TreeNode organizationNode = roleNode.getChildren().at(0).b();<br> |
396 String organizationRefId = organizationRefIdNode.getAttributes().getString("text-organizationRefId");<br> | 406 String organizationId = organizationNode.getAttributes().getString("text-organizationRefId");<br> |
397 if (!filterIds.contains(organizationRefId) && !filterIds.isEmpty())<br> | 407 if (!filterIds.contains(organizationId) && !filterIds.isEmpty())<br> |
398 continue;<br> | 408 continue;<br> |
399 TreeNode roleRefIdNode = OrganizationMappedByRole.getChildren().at(1).b();<br> | 409 TreeNode roleIdNode = roleNode.getChildren().at(1).b();<br> |
400 return roleRefIdNode.getAttributes().getString("text-roleRefId");<br> | 410 return roleIdNode.getAttributes().getString("text-roleRefId");<br> |
401 }<br> | 411 }<br> |
402 return null; | 412 return null; |
403 </div> | 413 </div> |
404 <p>役割のデータが入ったノードのiteratorをfor文で回して役割を取得する</p> | 414 <p>役割のデータが入ったノードのiteratorをfor文で回して役割を取得する</p> |
405 <p>iteratorで取得できるノードの0番目の子供には役割を与える組織idが</p> | 415 <p>iteratorで取得できるノードの0番目の子供には役割を与える組織idが</p> |
407 <p>0番目の子供から組織idを取得し検索結果の絞込を行う</p> | 417 <p>0番目の子供から組織idを取得し検索結果の絞込を行う</p> |
408 <p>その後1番目のノードから役割idを返す</p> | 418 <p>その後1番目のノードから役割idを返す</p> |
409 <p>役割のノードのiteratorが空になったら、nullを返す</p> | 419 <p>役割のノードのiteratorが空になったら、nullを返す</p> |
410 </font> | 420 </font> |
411 </div> | 421 </div> |
412 | 422 --> |
413 | 423 |
414 <div> | 424 <div> |
415 <font size=5> | 425 <font size=5> |
416 <h1>木構造の親を辿るQuery</h1> | 426 <h1>木構造の親を辿るQuery</h1> |
417 <p>maTrixで許認可を判断する際に、木構造の親を辿る検索が必要になる場合がある</p> | 427 <p>maTrixで許認可を判断する際に、木構造の親を辿る検索が必要になる場合がある</p> |
418 <p>以下に親を辿る検索を行う例を記す</p> | 428 <p>以下に親を辿る検索を行う例を記す</p> |
419 <ol> | 429 <ol> |
420 <li>Aさんが、maTrixに工学部の学生にのみ貸出を行っている書籍の貸出許可を求める</li> | 430 <li>Aさんが、maTrixに工学部の学生にのみ貸出を行っている書籍の貸出許可を求める</li> |
431 <li>maTrixは、書籍の貸出許可を与えるかを判断するためのポリシーファイルを参照する</li> | |
421 <li>Aさんの所属している組織の情報を取得する(情報工学科)</li> | 432 <li>Aさんの所属している組織の情報を取得する(情報工学科)</li> |
422 <li>情報工学科の親の情報を取得する(工学部)</li> | 433 <li>情報工学科の親の情報を取得する(工学部)</li> |
423 <li>maTrixは、Aさんに工学部に所属しているため本の貸出を許可する</li> | 434 <li>maTrixは、Aさんは工学部に所属しているため本の貸出を許可する</li> |
424 </ol> | 435 </ol> |
425 <p>3番目の処理で親Nodeを返すParentIndexを使用する</p> | 436 <p>4番目の処理で親ノードを辿る処理を行っています</p> |
426 </font> | 437 </font> |
427 </div> | 438 </div> |
428 | 439 |
429 | 440 |
430 <div> | 441 <div> |
431 <h1>親を辿るQueryのコード</h1> | 442 <h1>親を辿るQueryのコード</h1> |
432 <font size=5> | 443 <font size=5> |
433 <p>以下に親の取得を行う部分のコードを記述する</p> | 444 <p>以下に親の取得を行う部分のコードを記述する</p> |
434 <p>idには工学部のidが、orgNodeにはAさんが所属している組織のidを持ったノードが入っている</p> | 445 <p>idには工学部のidが、orgNodeにはAさんが所属している組織のidを持ったノードが入っている</p> |
435 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> | 446 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> |
436 do {<br> | 447 while(true) {<br> |
437 String orgId = orgNode.getAttributes().getString("Organization-id");<br> | 448 String orgId = orgNode.getAttributes().getString("Organization-id");<br> |
438 if (id.equals(orgId))<br> | 449 if (id.equals(orgId))<br> |
439 return true;<br> | 450 return true;<br> |
440 parentOrgNodeOptional = parentIndex.get(orgNode);<br> | 451 Optional<TreeNode> parentOrgNodeOptional = parentIndex.get(orgNode);<br> |
441 if (parentOrgNodeOptional.isPresent())<br> | 452 if (parentOrgNodeOptional.isPresent())<br> |
442 orgNode = parentOrgNodeOptional.get();<br> | 453 orgNode = parentOrgNodeOptional.get();<br> |
443 else<br> | 454 else<br> |
444 return false;<br> | 455 return false;<br> |
445 }while(true);<br> | 456 }<br> |
446 </div> | 457 </div> |
447 <ol> | 458 <ol> |
448 <li>orgNodeから組織のidを取得する</li> | 459 <li>orgNodeから組織のidを取得する</li> |
449 <li>idと取得した組織のidを比較する</li> | 460 <li>idと取得した組織のidを比較する</li> |
450 <li>一致した場合はtrueを、しなかった場合はorgNodeの親を取得する</li> | 461 <li>一致した場合はtrueを、しなかった場合はorgNodeの親を取得する</li> |
452 <p>以上の処理を取得できる親ノードが無くなるまで行う</p> | 463 <p>以上の処理を取得できる親ノードが無くなるまで行う</p> |
453 </font> | 464 </font> |
454 </div> | 465 </div> |
455 | 466 |
456 <div> | 467 <div> |
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> | |
457 <h1>ベンチマーク</h1> | 479 <h1>ベンチマーク</h1> |
458 <font size=5> | 480 <font size=5> |
459 <p>Jungle上にmaTrixの実装を行ったので、性能測定を行った</p> | 481 <p>Jungle上にmaTrixの実装を行ったので、性能測定を行った</p> |
460 <p>測定はmongoDBとの比較とマルチプロセッサー上でのJungleの読み書き性能の2つを行った</p> | 482 <p>測定はmongoDBとの比較とマルチプロセッサー上での性能評価の2つを行った</p> |
461 <p>木構造をそのまま格納できること、属性名を指定することで属性値が取得できるなど、Jungleと似た特徴を持っているmongoDBを比較対象に選択した</p> | 483 <p>木構造をそのまま格納できること、属性名を指定することで属性値が取得できるなど、Jungleと似た特徴を持っているmongoDBを比較対象に選択した</p> |
462 </font> | 484 </font> |
463 </div> | 485 </div> |
464 | 486 |
465 <div> | 487 <div> |
477 | 499 |
478 | 500 |
479 <div> | 501 <div> |
480 <h1>mongoDBとの比較</h1> | 502 <h1>mongoDBとの比較</h1> |
481 <font size=5> | 503 <font size=5> |
482 <p>1万人のデータをmongoDBとJungleに格納し、データの検索にかかる時間の測定を行った</p> | 504 <p>1万個のデータをmongoDBとJungleに格納し、データの検索にかかる時間の測定を行った</p> |
483 <p>各DBに挿入するデータは以下のような構造を持つ</p> | 505 <p>各DBに挿入するデータは以下のような構造を持つ</p> |
484 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> | 506 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> |
485 {PersonId: 固有のPersonId ,roleRefIds:ランダムな役割Id}<br> | 507 {PersonId: 固有のPersonId ,roleId:ランダムな役割Id}<br> |
486 </div> | 508 </div> |
487 </font> | 509 </font> |
488 </div> | 510 </div> |
489 | 511 |
490 <div> | 512 <div> |
503 <div> | 525 <div> |
504 <h1>mongoDBとの比較</h1> | 526 <h1>mongoDBとの比較</h1> |
505 <font size=5> | 527 <font size=5> |
506 <p>Jungleのデータの読み込みは以下のように行った</p> | 528 <p>Jungleのデータの読み込みは以下のように行った</p> |
507 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> | 529 <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> |
508 InterfaceTraverser traverser = tree.getTraverser(true); | 530 InterfaceTraverser traverser = tree.getTraverser(true);<br> |
509 Iterator<TreeNode> it = traverser.find((TreeNode node) -> {<br> | 531 Iterator<TreeNode> it = traverser.find((TreeNode node) -> {<br> |
510 String nodeId = node.getAttributes().getString("Person-id");<br> | 532 String nodeId = node.getAttributes().getString("Person-id");<br> |
511 if (nodeId.equals("p:9"))<br> | 533 if (nodeId.equals("p:9"))<br> |
512 return true;<br> | 534 return true;<br> |
513 return false;<br> | 535 return false;<br> |
514 }, "Person-id", "r:9");<br> | 536 }, "Person-id", "p:9");<br> |
515 if (it.hasNext()) {<br> | 537 if (it.hasNext()) {<br> |
516 TreeNode targetNode = it.next();<br> | 538 TreeNode targetNode = it.next();<br> |
517 String targetRoleId = targetNode.getAttributes().getString("roleId");<br> | 539 String targetRoleId = targetNode.getAttributes().getString("roleId");<br> |
518 }<br> | 540 }<br> |
519 </div><br> | 541 </div><br> |
539 | 561 |
540 <div> | 562 <div> |
541 <h1>マルチプロセッサー上でのJungleの読み書き性能</h1> | 563 <h1>マルチプロセッサー上でのJungleの読み書き性能</h1> |
542 <font size=5> | 564 <font size=5> |
543 <p>Jungleがマルチプロセッサ上で性能が出るか測定を行った</p> | 565 <p>Jungleがマルチプロセッサ上で性能が出るか測定を行った</p> |
544 <p>複数スレッドからJungleに読み込みだけを行った場合と、1スレッドだけ書き込みを行い続け、<br>残りのスレッドで読み込み行った場合で測定を行った。</p> | 566 <p>複数スレッドからJungleに読み込みだけを行った場合と、1スレッドだけ書き込みを行い続け、<br>残りのスレッドで読み込み行った場合で測定を行った</p> |
567 <p>Jungleに格納したデータはmaTrixで実際に使われているユーザーデータ400人分</p> | |
545 <p>読み込みではmaTrixで実際に使われている検索関数isActive(personId , version)を用いた</p> | 568 <p>読み込みではmaTrixで実際に使われている検索関数isActive(personId , version)を用いた</p> |
546 <p>この関数引数で与えた人が、maTrixにアカウントを持っているか調べる関数である</p> | 569 <p>この関数引数で与えた人が、maTrixにアカウントを持っているか調べる関数である</p> |
547 </font> | 570 </font> |
548 </div> | 571 </div> |
549 | 572 |
550 <div> | 573 <div> |
551 <h1>マルチプロセッサー上でのJungleの読み書き性能</h1> | 574 <h1>マルチプロセッサー上でのJungleの読み書き性能</h1> |
552 <font size=5> | 575 <font size=5> |
553 <embed src="images/transactionPersecond.svg" width="700" height="700"align="left"/> | 576 <embed src="images/transactionPersecond.svg" width="700" height="700"align="left"/> |
554 <br> | 577 <br> |
555 <p>Jungleでは、書き込みと読み込みを同時に行っても<br>性能低下はおこらなかった</p> | 578 <p>Jungleでは、書き込みと読み込みを同時に行っても<br>ほぼ性能低下はおこらなかった</p> |
556 <p>ハイパースレッディングに引っかかるまでは<br>リニアに性能が出ている</p> | 579 <p>ハイパースレッディングに引っかかるまでは<br>リニアに性能が出ている</p> |
557 <p>書き込みと読み込みを同時に行った場合、<br>読み込みのCPUCOUNTが2の時だけ性能が出ていない</p> | 580 <p>書き込みと読み込みを同時に行った場合、<br>読み込みのCPUCOUNTが2の時だけ性能が出ていない</p> |
558 <p>これは、書き込みを連続で行っているため<br>読み込みと書き込みで競合が起きている</p> | 581 <p>これは、書き込みを連続で行っているため<br>読み込みと書き込みで競合が起きている</p> |
559 <p>しかし読み込みのスレッドが増えると<br>読み込みが優先されるので性能が出るようになっている</p> | 582 <p>しかし読み込みのスレッドが増えると<br>読み込みが優先されるので性能が出るようになっている</p> |
560 <p>読み込みと書き込み同時に行っている方が<br>CPUCOUNT11で性能上昇が止まっているのは<br>書き込みに1スレッド使用しているからである</p> | 583 <p>読み込みと書き込み同時に行っている方が<br>CPUCOUNT11で性能上昇が止まっているのは<br>書き込みに1スレッド使用しているからである</p> |
562 </div> | 585 </div> |
563 | 586 |
564 <div> | 587 <div> |
565 <h1>考察</h1> | 588 <h1>考察</h1> |
566 <font size=5> | 589 <font size=5> |
567 <p>性能評価では、JungleのほうがMongoDBより高速に動いたが、全てのアプリケーションでJungleの方が早いわけではない</p> | 590 <p>マルチプロセッサ上でもJungleは並列に動作する</p> |
591 <p>性能比較では、JungleのほうがMongoDBより高速に動いたが、全てのアプリケーションでJungleの方が早いわけではない</p> | |
568 <p>Jungleは、木構造の形と使われ方がアルゴリズム的に一致している場合に性能が出る</p> | 592 <p>Jungleは、木構造の形と使われ方がアルゴリズム的に一致している場合に性能が出る</p> |
569 </font> | 593 </font> |
570 </div> | 594 </div> |
571 | 595 |
572 <div> | 596 <div> |
573 <h1>Jungleに向いているアプリケーション</h1> | 597 <h1>Jungleに向いているアプリケーション</h1> |
574 <font size=5> | 598 <font size=5> |
575 <p>Jungleは、書き込み時の処理が木の大きさで変わる</p> | 599 <p>Jungleは、書き込み時の処理が木の大きさで変わる</p> |
576 <p>そのため、比較的小さな木にデータがたくさんあり、木の深い部分に対し変更があまり行われないアプリケーションが得意</p> | 600 <p>そのため、比較的小さな木がたくさんあり、木の深い部分に対し変更があまり行われないアプリケーションが得意</p> |
577 <p>また、書き込みより読み込みを重視したDBであるため、読み込みが多いアプリケーションが性能が出る</p> | 601 <p>また、書き込みより読み込みを重視したDBであるため、読み込みが多いアプリケーションが性能が出る</p> |
578 <p>そのため、Jungleの上に構築するアプリケーション例としてBBSやWEBページなどがある</p> | 602 <p>そのため、Jungleの上に構築するアプリケーション例としてBBSやWEBページなどがある</p> |
579 </font> | 603 </font> |
580 </div> | 604 </div> |
581 | 605 |
595 <p>1. RDBとの比較</p> | 619 <p>1. RDBとの比較</p> |
596 <p> もともとmaTrixはRDB上で動いているアプリケーションなので、RDB版maTrixとの性能測定を行いたい</p> | 620 <p> もともとmaTrixはRDB上で動いているアプリケーションなので、RDB版maTrixとの性能測定を行いたい</p> |
597 <p>2.データの書き出し部分の改良</p> | 621 <p>2.データの書き出し部分の改良</p> |
598 <p> Jungleはデータをディスクに書き出すことが可能である</p> | 622 <p> Jungleはデータをディスクに書き出すことが可能である</p> |
599 <p> 書きだしたデータを読み込む機能もあるのでトラブルが発生し、Jungleが強制終了されても元の状態に復旧できる</p> | 623 <p> 書きだしたデータを読み込む機能もあるのでトラブルが発生し、Jungleが強制終了されても元の状態に復旧できる</p> |
600 <p> 今の実装は、データの書き出しはcommit時に毎回行っているため書き出しが非効率的である</p> | 624 <p> 今の実装は、データの書き出しは、変更が加わる度に行われるので、非効率的である</p> |
601 <p> できれば複数回分の変更をバッファリングしておいて一気に書き出しを行いたい</p> | 625 <p> できれば複数回分の変更をバッファリングしておいて一気に書き出しを行いたい</p> |
602 <p> ある値を行ったり来たりするような、書き出す必要が無いデータもあるため、書き出す部分の最適化を行う必要がある</p> | 626 <p> ある値を行ったり来たりするような、書き出す必要が無いデータもあるため、書き出す部分の最適化を行う必要がある</p> |
603 </font> | 627 </font> |
604 </div> | 628 </div> |
605 | 629 |
606 <div> | 630 <div> |
607 <h1>今後の課題</h1> | 631 <h1>今後の課題</h1> |
608 <font size=5> | 632 <font size=5> |
609 <p>3.過去のデータの掃除</p> | 633 <p>3.メモリの効率的な利用</p> |
610 <p> Jungleは非破壊でデータを保持し続けるため、非常に多くのメモリを消費する</p> | 634 <p> Jungleは非破壊でデータを保持し続けるため、非常に多くのメモリを消費する</p> |
611 <p> ある程度のタイミングで過去のデータをメモリから掃除する必要がある</p> | 635 <p> ある程度のタイミングで過去のデータをメモリから解放する必要がある</p> |
612 <p> しかし、データを掃除するタイミングは、Jungle上に実装するアプリケーションによって変わる</p> | 636 <p> しかし、データを解放するタイミングは、Jungle上に実装するアプリケーションによって変わる</p> |
613 <p> そこを含め、データを掃除するAPIの設計を行う必要がある</p> | 637 <p> そこを含め、データを解放するAPIの設計を行う必要がある</p> |
614 <p>4.分散環境でのmaTrixの構築</p> | 638 <p>4.分散環境でのmaTrixの構築</p> |
615 <p> Jungleはもともと分散データベースである</p> | 639 <p> Jungleはもともと分散データベースである</p> |
616 <p> 分散版Jungle上にmaTrixを構築し、性能測定を行いたい</p> | 640 <p> 分散版Jungle上にmaTrixを構築し、性能測定を行いたい</p> |
617 </font> | 641 </font> |
618 </div> | 642 </div> |
624 <p>5.設計手法の確立</p> | 648 <p>5.設計手法の確立</p> |
625 <p> Jungleは木構造のデータをそのまま格納できる</p> | 649 <p> Jungleは木構造のデータをそのまま格納できる</p> |
626 <p> 木のサイズが大きいと、データ更新の負荷が大きくなるため分割を行う必要がある</p> | 650 <p> 木のサイズが大きいと、データ更新の負荷が大きくなるため分割を行う必要がある</p> |
627 <p> 分割を行った木同士の参照はIdを用いた間接的なものになる</p> | 651 <p> 分割を行った木同士の参照はIdを用いた間接的なものになる</p> |
628 <p> このようにJungleはRDBと異なり格納するデータの自由度が大きい</p> | 652 <p> このようにJungleはRDBと異なり格納するデータの自由度が大きい</p> |
629 <p> なのでJungleの設計手法を確立させる必要がある</p> | 653 <p> Jungleの設計手法を確立させる必要がある</p> |
630 </font> | 654 </font> |
631 </div> | 655 </div> |
632 | 656 |
633 <div> | 657 <div> |
634 <h1>まとめ</h1> | 658 <h1>まとめ</h1> |
635 <font size=5> | 659 <font size=5> |
636 <p>当研究室で開発している非破壊的木構造データベースJungle上に許認可管理アプリケーションmaTrixを実装した</p> | 660 <p>当研究室で開発している非破壊的木構造データベースJungle上に許認可管理アプリケーションmaTrixを実装した</p> |
637 <p>その際必要になった検索APIやIndexの実装を行った</p> | 661 <p>その際必要になった検索APIやIndexの実装を行った</p> |
638 <p>またFunctionalJavaは性能が出なかったので、非破壊TreeMapを自作した</p> | 662 <p>またFunctionalJavaのTreeMapでは性能が出なかったので、非破壊TreeMapを自作した</p> |
639 <p>その結果Jungleの性能は劇的に上昇した</p> | |
640 <p>性能測定ではmongoDBより高速に動き、マルチプロセッサ上でも並列に動作した</p> | 663 <p>性能測定ではmongoDBより高速に動き、マルチプロセッサ上でも並列に動作した</p> |
641 </font> | 664 </font> |
642 </div> | 665 </div> |
643 </div> <!-- presentation --> | 666 </div> <!-- presentation --> |
644 </body> | 667 </body> |