14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 <!DOCTYPE html>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 <html>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 <head>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 <meta http-equiv="content-type" content="text/html;charset=utf-8">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 <title>GearsOSの分散ファイルシステムの設計</title>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 <meta name="generator" content="Slide Show (S9) v4.1.0 on Ruby 2.6.8 (2021-07-07) [universal.x86_64-darwin21]">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 <meta name="author" content="Takahiro Ikki, Shinji Kono" >
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 <!-- style sheet links -->
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 <link rel="stylesheet" href="s6/themes/screen.css" media="screen">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 <link rel="stylesheet" href="s6/themes/print.css" media="print">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 <link rel="stylesheet" href="s6/themes/blank.css" media="screen,projection">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 <!-- JS -->
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 <script src="s6/js/jquery-1.11.3.min.js"></script>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 <script src="s6/js/jquery.slideshow.js"></script>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 <script src="s6/js/jquery.slideshow.counter.js"></script>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 <script src="s6/js/jquery.slideshow.controls.js"></script>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 <script src="s6/js/jquery.slideshow.footer.js"></script>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 <script src="s6/js/jquery.slideshow.autoplay.js"></script>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 <!-- prettify -->
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 <link rel="stylesheet" href="scripts/prettify.css">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 <script src="scripts/prettify.js"></script>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 <style>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 .slide {page-break-after: always;}
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 </style>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 </head>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 <body>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 <div class="layout">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 <div id="header"></div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 <div id="footer">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 <div align="right">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 <img src="s6/images/logo.svg" width="200px">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 <div class="presentation">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 <div class='slide cover'>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 <table width="90%" height="90%" border="0" align="center">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 <tr>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 <td>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 <div align="center">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 <h1><font color="#808db5">GearsOSの分散ファイルシステムの設計</font></h1>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60 </td>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 </tr>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 <tr>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 <td>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 <div align="left">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
65 Takahiro Ikki, Shinji Kono
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
66 琉球大学
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 </td>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 </tr>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 </table>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
74
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 <div class='slide'>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
76
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
77 <!-- _S9SLIDE_ -->
|
22
|
78 <h2 id="gearsosのファイルシステムの設計方針">GearsOSのファイルシステムの設計方針</h2>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
79 <ul>
|
22
|
80 <li>GearsOSはGearという単位で記述が行われているOSプロジェクトである</li>
|
|
81 <li>GearsOSのファイルシステムも同様にDataGearの単位で構成したい</li>
|
20
|
82 <li>GearsOSのファイルシステムの設計と実装を行った</li>
|
22
|
83 <li>ファイルに取り扱うデータに対応した複数のストリームを持たせたい
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
84 <ul>
|
22
|
85 <li>従来では異なるデータでも単一のストリームから入力される</li>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
86 </ul>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
87 </li>
|
22
|
88 <li>GearsOSには将来的にアプリケーションが担う重要な機能をOSに取り込みたい
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
89 <ul>
|
24
|
90 <li>ファイルの型認識</li>
|
20
|
91 <li>バックアップ</li>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
92 </ul>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
93 </li>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
94 </ul>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
95
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
96
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
97
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
98 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
99
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
100 <div class='slide'>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
101 <!-- _S9SLIDE_ -->
|
22
|
102 <h2 id="gearsosのgear概念12">GearsOSのGear概念(1/2)</h2>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
103 <ul>
|
22
|
104 <li>関数でなくGearという単位を用いて記述する</li>
|
|
105 <li>Gearは関数と異なり、スタックを持たないため軽量継続と呼ぶ</li>
|
|
106 <li>CodeGear
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
107 <ul>
|
22
|
108 <li>従来のThreadにあたる</li>
|
|
109 <li>goto文(jump命令)を使って遷移する</li>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
110 </ul>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
111 </li>
|
22
|
112 <li>DataGear
|
|
113 <ul>
|
|
114 <li>従来の変数データにあたる</li>
|
|
115 </ul>
|
|
116 </li>
|
|
117 </ul>
|
|
118
|
|
119
|
|
120
|
|
121 </div>
|
|
122
|
|
123 <div class='slide'>
|
|
124 <!-- _S9SLIDE_ -->
|
|
125 <h2 id="gearsosのgear概念22">GearsOSのGear概念(2/2)</h2>
|
|
126 <ul>
|
20
|
127 <li>CodeGearは処理を行う際、DataGearを参照し処理を行う(InputDataGear)</li>
|
|
128 <li>CodeGearは処理の終了後、以降に必要なデータをDataGearとして出力する(OutputDataGear)</li>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
129 </ul>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
130 <div style="text-align: center;">
|
22
|
131 <img src="images/cg-dg.pdf" alt="cgdgの関係図" width="600" />
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
132 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
133
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
134
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
135
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
136 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
137
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
138 <div class='slide'>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
139 <!-- _S9SLIDE_ -->
|
20
|
140 <h2 id="gearsosのinterface">GearsOSのInterface</h2>
|
|
141 <ul>
|
22
|
142 <li>Object型指向の仕組み</li>
|
|
143 <li>APIとなるCodeGearとその参照するDataGearを宣言する</li>
|
|
144 <li>DataGear/CodeGearの一時的な置き場としての役割を持つ
|
|
145 <pre><code>typedef struct Tree<>{
|
|
146 union Data* tree;
|
|
147 struct Node* node;
|
|
148 __code put(Impl* tree,Type* node, __code next(...));
|
|
149 __code get(Impl* tree, Type* node, __code next(...));
|
|
150 __code remove(Impl* tree,Type* node, __code next(...));
|
|
151 __code next(...);
|
|
152 } Tree;
|
|
153 </code></pre>
|
|
154 </li>
|
|
155 </ul>
|
|
156
|
|
157
|
|
158
|
|
159 </div>
|
|
160
|
|
161 <div class='slide'>
|
|
162 <!-- _S9SLIDE_ -->
|
26
|
163 <h2 id="gearsosのimplement">GearsOSのImplement</h2>
|
|
164 <ul>
|
|
165 <li>Interfaceを継承した実装の型定義ファイルである</li>
|
|
166 <li>実装で使われるデータ構造を記述する
|
|
167 <pre><code> typedef struct SynchronizedQueue <> impl Queue {
|
|
168 struct Element* top;
|
|
169 struct Element* last;
|
|
170 struct Atomic* atomic;
|
|
171 } SynchronizedQueue;
|
|
172 </code></pre>
|
|
173 </li>
|
|
174 </ul>
|
|
175
|
|
176
|
|
177
|
|
178 </div>
|
|
179
|
|
180 <div class='slide'>
|
|
181 <!-- _S9SLIDE_ -->
|
|
182 <h2 id="interfaceの呼び出し">Interfaceの呼び出し</h2>
|
|
183 <ul>
|
|
184 <li>インターフェースは以下の記述で実装と呼び出しを行う
|
|
185 <pre><code>struct Queue* queue = new Queue();
|
|
186 queue = createSychronizedQueue(context);
|
|
187 </code></pre>
|
|
188 </li>
|
|
189 </ul>
|
|
190
|
|
191 <pre><code>goto queue->put(task, next(...));
|
|
192 </code></pre>
|
|
193
|
|
194
|
|
195
|
|
196 </div>
|
|
197
|
|
198 <div class='slide'>
|
|
199 <!-- _S9SLIDE_ -->
|
22
|
200 <h2 id="メタレベルのgear13">メタレベルのGear(1/3)</h2>
|
|
201 <ul>
|
|
202 <li>CodeGearとDataGearにはユーザーが記述しない、メタレベルのものが存在する
|
|
203 <ul>
|
|
204 <li>メタレベルな記述はトランスコンパイラにより自動生成される</li>
|
|
205 </ul>
|
|
206 </li>
|
|
207 </ul>
|
|
208 <div style="text-align: center;">
|
|
209 <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" />
|
|
210 </div>
|
|
211
|
|
212
|
|
213
|
|
214 </div>
|
|
215
|
|
216 <div class='slide'>
|
|
217 <!-- _S9SLIDE_ -->
|
|
218 <h2 id="メタレベルのgear23">メタレベルのGear(2/3)</h2>
|
|
219 <ul>
|
|
220 <li>MetaCodeGear
|
|
221 <ul>
|
|
222 <li>CodeGearの処理前と処理後に参照される</li>
|
|
223 <li>Input/OutputDataGearを引き渡す</li>
|
|
224 <li>CodeGear処理前に呼ばれるものを特にstubCodeGearと呼ぶ</li>
|
|
225 </ul>
|
|
226 </li>
|
|
227 </ul>
|
|
228 <div style="text-align: center;">
|
|
229 <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" />
|
|
230 </div>
|
|
231
|
|
232
|
|
233
|
|
234 </div>
|
|
235
|
|
236 <div class='slide'>
|
|
237 <!-- _S9SLIDE_ -->
|
|
238 <h2 id="メタレベルのgear33">メタレベルのGear(3/3)</h2>
|
|
239 <ul>
|
|
240 <li>MetaDataGear
|
|
241 <ul>
|
|
242 <li>MetaCodeGearにて参照されるDataGear</li>
|
|
243 </ul>
|
|
244 </li>
|
|
245 </ul>
|
|
246 <div style="text-align: center;">
|
|
247 <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" />
|
|
248 </div>
|
|
249
|
|
250
|
|
251
|
|
252 </div>
|
|
253
|
|
254 <div class='slide'>
|
|
255 <!-- _S9SLIDE_ -->
|
|
256 <h2 id="gearsosのファイルシステムの設計">GearsOSのファイルシステムの設計</h2>
|
|
257 <ul>
|
|
258 <li>DataGearの単位でデータを操作したい</li>
|
|
259 <li>通信データに対応した複数のストリームを持ちたい</li>
|
|
260 <li>Transaction(マクロレベル)で操作したい
|
|
261 <ul>
|
|
262 <li>従来のファイルシステムは一部の操作のみTransactionである</li>
|
|
263 </ul>
|
|
264 </li>
|
|
265 <li>ファイルそのものが通信を担当する
|
20
|
266 <ul>
|
22
|
267 <li>ChristieのDataGearManagerを参考にする</li>
|
|
268 </ul>
|
|
269 </li>
|
|
270 </ul>
|
|
271
|
|
272
|
|
273
|
|
274 </div>
|
|
275
|
|
276 <div class='slide'>
|
|
277 <!-- _S9SLIDE_ -->
|
|
278 <h2 id="gearsosのファイルデータ操作13">GearsOSのファイルデータ操作(1/3)</h2>
|
|
279 <ul>
|
|
280 <li>GearsOSはDataGearのやりとりでプログラムが構成される
|
|
281 <ul>
|
|
282 <li>ファイルシステムも同様の実装にしたい = DataGear単位で操作したい</li>
|
|
283 </ul>
|
|
284 </li>
|
|
285 </ul>
|
|
286 <div style="text-align: center;">
|
|
287 <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" />
|
|
288 </div>
|
|
289
|
|
290
|
|
291
|
|
292 </div>
|
|
293
|
|
294 <div class='slide'>
|
|
295 <!-- _S9SLIDE_ -->
|
|
296 <h2 id="gearsosのファイルデータ操作23">GearsOSのファイルデータ操作(2/3)</h2>
|
|
297 <ul>
|
|
298 <li>GearsOSのファイルデータは任意の型を持った構造体で実装される(ファイルレコード)</li>
|
|
299 <li>レコードは決められた順番で連続しており、Queueに保存される</li>
|
|
300 </ul>
|
|
301 <div style="text-align: center;">
|
|
302 <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" />
|
|
303 </div>
|
|
304
|
|
305
|
|
306
|
|
307 </div>
|
|
308
|
|
309 <div class='slide'>
|
|
310 <!-- _S9SLIDE_ -->
|
|
311 <h2 id="gearsosのファイルデータ操作33">GearsOSのファイルデータ操作(3/3)</h2>
|
|
312 <ul>
|
|
313 <li>構造体の型を判別することで処理の切り替えが行える</li>
|
|
314 </ul>
|
|
315 <div style="text-align: center;">
|
|
316 <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" />
|
|
317 </div>
|
|
318
|
|
319
|
|
320
|
|
321 </div>
|
|
322
|
|
323 <div class='slide'>
|
|
324 <!-- _S9SLIDE_ -->
|
|
325 <h2 id="gearsfsのトランザクション">GearsFSのトランザクション</h2>
|
|
326 <ul>
|
|
327 <li>GearsOSのDataGear操作はマクロな操作である
|
|
328 <ul>
|
|
329 <li>よってCodeGearはTransactionである</li>
|
|
330 </ul>
|
|
331 </li>
|
|
332 <li>ファイルシステム操作もCodeGearで記述されるためTransactionとなる</li>
|
|
333 <li>トランザクションな操作によってファイルシステムの整合性の保守が行いやすい</li>
|
|
334 </ul>
|
|
335
|
|
336
|
|
337
|
|
338 </div>
|
|
339
|
|
340 <div class='slide'>
|
|
341 <!-- _S9SLIDE_ -->
|
|
342 <h2 id="queueによるgearsosのファイル">QueueによるGearsOSのファイル</h2>
|
|
343 <ul>
|
|
344 <li>GearsOSのファイルはファイルレコードを保持するQueueとなる</li>
|
|
345 <li>デバイスへの保存はQueueを保存すればよい</li>
|
23
|
346 <li>ファイルはQueueなのでファイルのAPIは大きく二つとなる
|
|
347 <ul>
|
|
348 <li>Put</li>
|
|
349 <li>Take</li>
|
|
350 </ul>
|
|
351 </li>
|
22
|
352 </ul>
|
|
353
|
|
354
|
|
355
|
|
356 </div>
|
|
357
|
|
358 <div class='slide'>
|
|
359 <!-- _S9SLIDE_ -->
|
|
360 <h2 id="queueapi--put-">QueueAPI -Put-</h2>
|
|
361 <ul>
|
|
362 <li>Put
|
|
363 <ul>
|
|
364 <li>Queueに対してファイルレコードを入力する</li>
|
|
365 <li>ファイルの変更をレコードとして書き込む
|
|
366 <pre><code>__code putSingleLinkedQueue(struct SingleLinkedQueue* queue, union Data* data, __code next(...)) {
|
|
367 Element* element = new Element();
|
|
368 element->data = data;
|
|
369 element->next = NULL;
|
|
370 queue->last->next = element;
|
|
371 queue->last = element;
|
|
372 goto next(...);
|
|
373 }
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
374 </code></pre>
|
20
|
375 </li>
|
|
376 </ul>
|
|
377 </li>
|
|
378 </ul>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
379
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
380
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
381
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
382 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
383
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
384 <div class='slide'>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
385 <!-- _S9SLIDE_ -->
|
22
|
386 <h2 id="queueapi--take-">QueueAPI -Take-</h2>
|
16
|
387 <ul>
|
20
|
388 <li>Take
|
|
389 <ul>
|
|
390 <li>Queueからファイルレコードを取り出す</li>
|
|
391 <li>Queue内のレコードをループで全て取り出せば良い
|
22
|
392 <pre><code>__code takeSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) {
|
|
393 printf("take\n");
|
|
394 struct Element* top = queue->top;
|
|
395 struct Element* nextElement = top->next;
|
|
396 if (queue->top == queue->last) {
|
|
397 data = NULL;
|
|
398 } else {
|
|
399 queue->top = nextElement;
|
|
400 data = nextElement->data;
|
|
401 }
|
|
402 goto next(data, ...);
|
|
403 }
|
20
|
404 </code></pre>
|
|
405 </li>
|
19
|
406 </ul>
|
|
407 </li>
|
|
408 </ul>
|
|
409
|
|
410
|
|
411
|
|
412 </div>
|
|
413
|
|
414 <div class='slide'>
|
|
415 <!-- _S9SLIDE_ -->
|
23
|
416 <h2 id="ファイル通信の構成">ファイル通信の構成</h2>
|
|
417 <ul>
|
|
418 <li>GearsOSのファイルは大域的に解放された資源としたい
|
|
419 <ul>
|
|
420 <li>ファイル自信を通信そのものとして実装する</li>
|
|
421 <li>Streamに対しsocket接続により遠隔にアクセスする</li>
|
|
422 </ul>
|
|
423 </li>
|
|
424 <li>分散フレームワークChristieのDataGearManagerの仕組みを利用する</li>
|
17
|
425 </ul>
|
|
426
|
|
427
|
|
428
|
|
429 </div>
|
|
430
|
|
431 <div class='slide'>
|
|
432 <!-- _S9SLIDE_ -->
|
20
|
433 <h2 id="datagearmanager">DataGearManager</h2>
|
17
|
434 <ul>
|
23
|
435 <li>分散フレームワークChristieの仕組みの一つ</li>
|
20
|
436 <li>keyとvalueの組み合わせとなるDataGearを保持するデータプール</li>
|
|
437 <li>ChristieではCodeGearManagerと呼ばれるノードがCodeGearとDataGearを管理する</li>
|
|
438 <li>LocalDGMはノード本体に対応するデータプールである
|
|
439 <ul>
|
|
440 <li>CodeGearはLocalDGMに対してDataGearを参照する</li>
|
|
441 </ul>
|
|
442 </li>
|
22
|
443 <li>RemoteDGMは接続する相手ノードに対応するデータプールproxyである
|
20
|
444 <ul>
|
|
445 <li>RemoteDGMに対してDataGearを書き込むことで、対応するノードのLocalDGMにデータが書き込まれる</li>
|
|
446 </ul>
|
|
447 </li>
|
17
|
448 </ul>
|
|
449
|
20
|
450
|
|
451
|
|
452 </div>
|
|
453
|
|
454 <div class='slide'>
|
|
455 <!-- _S9SLIDE_ -->
|
24
|
456 <h2 id="datagearmanagerによる通信構成">DataGearManagerによる通信構成</h2>
|
23
|
457 <ul>
|
|
458 <li>任意の相手のRemoteDGMを作成することでTopologyが形成される</li>
|
|
459 </ul>
|
19
|
460 <div style="text-align: center;">
|
20
|
461 <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="800" />
|
19
|
462 </div>
|
|
463
|
17
|
464
|
|
465
|
|
466 </div>
|
|
467
|
|
468 <div class='slide'>
|
|
469 <!-- _S9SLIDE_ -->
|
23
|
470 <h2 id="gearsos上のsocket通信">GearsOS上のsocket通信</h2>
|
19
|
471 <ul>
|
24
|
472 <li>GearsOS上のsocket通信を実装したい</li>
|
23
|
473 <li>Queueをsocketに接続し、簡易的なAPIの記述をした
|
|
474 <ul>
|
24
|
475 <li>Localなqueueに対してRemoteのqueueがソケット接続を行う
|
23
|
476 <pre><code>typedef struct CQueue<>{
|
|
477 union Data* cQueue;
|
|
478 union Data* data;
|
|
479
|
|
480 __code whenEmpty(...);
|
|
481 __code whenEOF(...);
|
|
482 __code clear(Impl* cQueue, __code next(...));
|
|
483 __code put(Impl* cQueue, union Data* data, __code next(...));
|
|
484 __code take(Impl* cQueue, __code next(union Data* data, ...));
|
|
485 __code isEmpty(Impl* cQueue, __code next(...), __code whenEmpty(...));
|
|
486 __code getData(Impl* cQueue, __code next(...), __code whenEOF(...));
|
|
487 __code next(...);
|
|
488 } CQueue;
|
19
|
489 </code></pre>
|
23
|
490 </li>
|
|
491 </ul>
|
20
|
492 </li>
|
|
493 </ul>
|
19
|
494
|
|
495
|
|
496
|
|
497 </div>
|
|
498
|
|
499 <div class='slide'>
|
|
500 <!-- _S9SLIDE_ -->
|
24
|
501 <h2 id="senddata-codegear">sendData CodeGear</h2>
|
19
|
502 <ul>
|
24
|
503 <li>proxy側はQueueにputされたDataをsocketで送信する</li>
|
|
504 <li>送信されたDataはLocal側でgetDataAPIで取り出される
|
19
|
505 <pre><code>__code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){
|
20
|
506 char recv_buf;
|
|
507 int send_size, recv_size;
|
|
508
|
19
|
509 send_size = send(cQueue->socket, data, sizeof(union Data), 0);
|
|
510 recv_size = recv(cQueue->socket, &recv_buf, 1, 0);
|
20
|
511 //error処理は省略
|
19
|
512 goto next(...);
|
|
513 }
|
|
514 </code></pre>
|
|
515 </li>
|
|
516 </ul>
|
18
|
517
|
|
518
|
|
519
|
|
520 </div>
|
|
521
|
|
522 <div class='slide'>
|
|
523 <!-- _S9SLIDE_ -->
|
24
|
524 <h2 id="getdata-codegear">getData CodeGear</h2>
|
20
|
525 <ul>
|
24
|
526 <li>ファイル本体(Local側)はsocketからDataを取り出す</li>
|
|
527 <li>取り出されたデータはQueueにputされる
|
20
|
528 <pre><code>__code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenError(...)){
|
|
529 int recv_size, send_size;
|
|
530 char send_buf;
|
|
531
|
|
532 union Data* recv_data;
|
|
533 recv_size = recv(cQueue->socket, recv_data, sizeof(union Data), 0);
|
|
534
|
|
535 //error処理は省略
|
|
536 Gearef(context, cQueue)->data = recv_data;
|
|
537 goto putLocalDGMQueue(recv_data, next);
|
|
538 }
|
|
539 </code></pre>
|
|
540 </li>
|
|
541 </ul>
|
|
542
|
|
543
|
|
544
|
|
545 </div>
|
|
546
|
|
547 <div class='slide'>
|
|
548 <!-- _S9SLIDE_ -->
|
24
|
549 <h2 id="複数のストリームから構成されるファイル">複数のストリームから構成されるファイル</h2>
|
17
|
550 <ul>
|
24
|
551 <li>入力されるデータに応じた個別のstreamを備えたい
|
20
|
552 <ul>
|
24
|
553 <li>streamと入力されたデータの処理を直接結びつけたい</li>
|
20
|
554 </ul>
|
|
555 </li>
|
24
|
556 <li>最低でもInput/OutputStreamの二つが必要となる</li>
|
|
557 <li>ファイルは複数のStreamを持ったリストとして実装する</li>
|
|
558 <li>Streamはkey nameを持ち、keyでアクセスを行う</li>
|
|
559 </ul>
|
|
560
|
|
561
|
|
562
|
|
563 </div>
|
|
564
|
|
565 <div class='slide'>
|
|
566 <!-- _S9SLIDE_ -->
|
|
567 <h2 id="複数のストリームを持つファイルの設計">複数のストリームを持つファイルの設計</h2>
|
|
568 <ul>
|
|
569 <li>Queueのリストとして赤黒木を用いる
|
|
570 <ul>
|
|
571 <li>key/value storeなアクセスを行うことができる</li>
|
|
572 <li>GearsOS上にすでに実装が行われている</li>
|
|
573 </ul>
|
|
574 </li>
|
|
575 <li>DataのTake/Put時には必ずkey nameの指定が必要となる</li>
|
|
576 </ul>
|
|
577
|
|
578
|
|
579
|
|
580 </div>
|
|
581
|
|
582 <div class='slide'>
|
|
583 <!-- _S9SLIDE_ -->
|
|
584 <h2 id="リスト単位の通信の構成">リスト単位の通信の構成</h2>
|
|
585 <ul>
|
|
586 <li>指定したkeyのQueueが探索で返される</li>
|
|
587 <li>proxyの場合、どのkeyに対してどんなDataを書き込んだかを通信で送信する</li>
|
17
|
588 </ul>
|
20
|
589 <div style="text-align: center;">
|
|
590 <img src="images/socketCom.pdf" alt="socketを通じたレコード送信" width="800" />
|
|
591 </div>
|
|
592
|
|
593
|
|
594
|
|
595 </div>
|
|
596
|
|
597 <div class='slide'>
|
|
598 <!-- _S9SLIDE_ -->
|
24
|
599 <h2 id="wordcount例題による通信apiの構築">wordCount例題による通信APIの構築</h2>
|
20
|
600 <ul>
|
|
601 <li>DataGearManagerによるファイル通信APIはWordCount例題を目指して設計した
|
|
602 <ul>
|
|
603 <li>ファイル内の文字列を1行づつ受け取り、文字列,行数をカウントする例題</li>
|
|
604 </ul>
|
|
605 </li>
|
|
606 <li>文字列送信側とCount側を別ノード上で行うことで、ファイルの呼び出しと通信処理が構成できる</li>
|
|
607 </ul>
|
|
608 <div style="text-align: center;">
|
27
|
609 <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="800" />
|
20
|
610 </div>
|
17
|
611
|
|
612
|
|
613
|
|
614 </div>
|
|
615
|
|
616 <div class='slide'>
|
|
617 <!-- _S9SLIDE_ -->
|
24
|
618 <h2 id="gearsfile-apiによるwordcount13">GearsFile APIによるWordCount(1/3)</h2>
|
17
|
619 <ul>
|
26
|
620 <li>FileOpen側(NodeA)とWordCount側(NodeB)でノードが別れる</li>
|
27
|
621 <li>(手順1)FileOpen側はFilePloxyにDataRecordをputする</li>
|
17
|
622 <li>(手順2)WordCount側は処理の後、ackを返信する</li>
|
24
|
623 </ul>
|
|
624 <div style="text-align: center;">
|
26
|
625 <img src="images/slideGearsWC.pdf" alt="ChristieAPIによるWordCount" width="800" />
|
24
|
626 </div>
|
|
627
|
|
628
|
|
629
|
|
630 </div>
|
|
631
|
|
632 <div class='slide'>
|
|
633 <!-- _S9SLIDE_ -->
|
|
634 <h2 id="gearsfile-apiによるwordcount23">GearsFile APIによるWordCount(2/3)</h2>
|
|
635 <ul>
|
17
|
636 <li>(手順3)1,2をループし、FileOpen側はEoFならフラグを送信する</li>
|
24
|
637 </ul>
|
|
638 <div style="text-align: center;">
|
26
|
639 <img src="images/slideGearsWC.pdf" alt="ChristieAPIによるWordCount" width="800" />
|
24
|
640 </div>
|
|
641
|
|
642
|
|
643
|
|
644 </div>
|
|
645
|
|
646 <div class='slide'>
|
|
647 <!-- _S9SLIDE_ -->
|
|
648 <h2 id="gearsfile-apiによるwordcount33">GearsFile APIによるWordCount(3/3)</h2>
|
|
649 <ul>
|
17
|
650 <li>(手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる</li>
|
|
651 </ul>
|
|
652 <div style="text-align: center;">
|
26
|
653 <img src="images/slideGearsWC.pdf" alt="ChristieAPIによるWordCount" width="800" />
|
17
|
654 </div>
|
|
655
|
|
656
|
|
657
|
|
658 </div>
|
|
659
|
|
660 <div class='slide'>
|
|
661 <!-- _S9SLIDE_ -->
|
24
|
662 <h2 id="現在のgearsfile-apiの開発状況">現在のGearsFile APIの開発状況</h2>
|
18
|
663 <ul>
|
24
|
664 <li>実装ずみ
|
20
|
665 <ul>
|
24
|
666 <li>keyアクセスに対応したファイル通信
|
|
667 <ul>
|
|
668 <li>単一のQueueによる通信の記述</li>
|
|
669 </ul>
|
|
670 </li>
|
|
671 <li>リストとなるTree
|
|
672 <ul>
|
|
673 <li>赤黒木</li>
|
|
674 </ul>
|
|
675 </li>
|
|
676 <li>atomicな操作が行えるQueue
|
|
677 <ul>
|
|
678 <li>複数からのアクセス時にデータ整合を保つ</li>
|
|
679 </ul>
|
|
680 </li>
|
20
|
681 </ul>
|
|
682 </li>
|
24
|
683 <li>実装中
|
|
684 <ul>
|
|
685 <li>keyアクセスが行えるQueueのリスト</li>
|
|
686 <li>リスト単位での通信の記述</li>
|
|
687 </ul>
|
|
688 </li>
|
18
|
689 </ul>
|
|
690
|
|
691
|
|
692
|
|
693 </div>
|
|
694
|
|
695 <div class='slide'>
|
|
696 <!-- _S9SLIDE_ -->
|
24
|
697 <h2 id="gearsosの生成形の問題点">GearsOSの生成形の問題点</h2>
|
18
|
698 <ul>
|
20
|
699 <li>GearsOSのメタレベルの処理の記述はトランスコンパイラにより行われる</li>
|
|
700 <li>場合によりメタレベルの記述を行わなくてはならない
|
18
|
701 <ul>
|
20
|
702 <li>他のInterfaceを継承したオブジェクトからのDataGear継承
|
|
703 <ul>
|
|
704 <li>例)Queueからのデータ取り出し</li>
|
26
|
705 <li>トランスコンパイラはどのInterfaceに記述されたDataGearを参照するべきか判断が難しい</li>
|
20
|
706 </ul>
|
|
707 </li>
|
18
|
708 </ul>
|
|
709 </li>
|
|
710 </ul>
|
|
711
|
20
|
712 <pre><code>__code Task2(TQueue* localDGMQueue){
|
|
713 goto localDGMQueue->take(Task3);
|
|
714 }
|
18
|
715
|
20
|
716 __code Task3(TQueue* localDGMQueue, FileString* string){
|
|
717 printf("take[%s] [num:%d]\n", string->str, string->size);
|
|
718 goto getData();
|
|
719 }
|
18
|
720
|
20
|
721 //プログラマが実装したいstub
|
|
722 __code Task3_stub(struct Context* context){
|
|
723 TQueue* localDGMQueue = (struct TQueue*)Gearef(context, TQueue)->tQueue;
|
|
724 FileString* string = Gearef(context, TQueue)->data;
|
|
725 goto Task3(context, localDGMQueue, string);
|
|
726 }
|
|
727
|
|
728 //自動生成されたErrorなstub
|
|
729 __code Task3_stub(struct Context* context) {
|
|
730 TQueue* localDGMQueue = Gearef(context, TQueue);
|
|
731 FileString* string = Gearef(context, FileString);
|
|
732 goto Task3(context, localDGMQueue, string);
|
|
733 }
|
|
734 </code></pre>
|
18
|
735
|
|
736
|
|
737
|
|
738 </div>
|
|
739
|
|
740 <div class='slide'>
|
|
741 <!-- _S9SLIDE_ -->
|
20
|
742 <h2 id="並列処理構文par-gotoが持つ問題">並列処理構文par gotoが持つ問題</h2>
|
18
|
743 <ul>
|
20
|
744 <li>par gotoとはGearsOSに実装された並列処理構文である</li>
|
24
|
745 <li>StreamQueueに対するput/takeの並列処理の実装をpar goto構文で試みた</li>
|
20
|
746 <li>par gotoはトランスコンパイラへの依存性が高い
|
18
|
747 <ul>
|
20
|
748 <li>stubCodeGearのように任意な書き換えが行えない</li>
|
18
|
749 </ul>
|
|
750 </li>
|
20
|
751 <li>特定のCodeGearの宣言のみでしか正常な処理が生成されない
|
18
|
752 <ul>
|
20
|
753 <li>Interfaceに記述されたAPICodeGearではバグが生じる</li>
|
|
754 <li>par gotoでの使用を前提としたCodeGearを書かなくてはならない</li>
|
18
|
755 </ul>
|
|
756 </li>
|
20
|
757 <li>処理が重いという問題点も存在する</li>
|
18
|
758 </ul>
|
|
759
|
|
760
|
|
761
|
|
762 </div>
|
|
763
|
|
764 <div class='slide'>
|
|
765 <!-- _S9SLIDE_ -->
|
19
|
766 <h2 id="結論">結論</h2>
|
18
|
767 <ul>
|
20
|
768 <li>GearsOSのファイルの設計を行った
|
18
|
769 <ul>
|
24
|
770 <li>ファイルの構造の設計
|
|
771 <ul>
|
|
772 <li>DataGear単位での操作が行える</li>
|
|
773 </ul>
|
|
774 </li>
|
|
775 <li>socketによる通信部分の実装
|
|
776 <ul>
|
|
777 <li>GearsOS上でのソケット通信の記述</li>
|
|
778 </ul>
|
|
779 </li>
|
|
780 <li>APIの段階的な設計記述
|
|
781 <ul>
|
|
782 <li>Proxyによるファイル通信</li>
|
|
783 </ul>
|
|
784 </li>
|
20
|
785 <li>GearsOSの調査</li>
|
|
786 </ul>
|
|
787 </li>
|
24
|
788 <li>Streamのリスト単位での通信の完成</li>
|
20
|
789 </ul>
|
|
790
|
|
791
|
|
792
|
|
793 </div>
|
|
794
|
|
795 <div class='slide'>
|
|
796 <!-- _S9SLIDE_ -->
|
24
|
797 <h2 id="将来的な課題">将来的な課題</h2>
|
20
|
798 <ul>
|
|
799 <li>TopoplogyManagerの設計
|
|
800 <ul>
|
|
801 <li>参加したノードを任意の形のTopologyに接続する機能</li>
|
|
802 <li>ファイルシステム向けの機能を追加したい
|
18
|
803 <ul>
|
20
|
804 <li>DNS</li>
|
|
805 <li>中枢としてのTopologyのノード監視</li>
|
18
|
806 </ul>
|
|
807 </li>
|
20
|
808 </ul>
|
|
809 </li>
|
|
810 <li>Securityシステムの追加
|
|
811 <ul>
|
|
812 <li>証明書などによるファイル操作制限</li>
|
|
813 <li>不正な分散ファイルシステムへのアクセス</li>
|
18
|
814 </ul>
|
|
815 </li>
|
|
816 </ul>
|
|
817
|
|
818
|
17
|
819
|
|
820 </div>
|
|
821
|
|
822 <div class='slide'>
|
|
823 <!-- _S9SLIDE_ -->
|
20
|
824 <h2 id="この先保留">この先保留</h2>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
825
|
19
|
826
|
|
827
|
|
828 </div>
|
|
829
|
|
830 <div class='slide'>
|
|
831 <!-- _S9SLIDE_ -->
|
24
|
832 <h2 id="gearsosのディレクトリとバックアップ">GearsOSのディレクトリとバックアップ</h2>
|
|
833 <ul>
|
|
834 <li>又吉雄斗による並行研究にて、inodeによるファイルシステムが開発されている</li>
|
|
835 <li>赤黒木の非破壊な編集により、ディレクトリの履歴を残すことができる</li>
|
|
836 </ul>
|
|
837 <div style="text-align: center;">
|
|
838 <img src="images/nonDestroyTreeEdit.pdf" alt="非破壊的なツリー編集" width="800" />
|
|
839 </div>
|
|
840
|
|
841
|
|
842
|
|
843 </div>
|
|
844
|
|
845 <div class='slide'>
|
|
846 <!-- _S9SLIDE_ -->
|
20
|
847 <h2 id="ファイルqueueに対するapi--peek-">ファイルQueueに対するAPI -Peek-</h2>
|
17
|
848 <ul>
|
20
|
849 <li>Peek
|
19
|
850 <ul>
|
20
|
851 <li>QueueのElementを参照するが、削除は行わない</li>
|
|
852 <li>現時点での実装は行っていない</li>
|
|
853 <li>QueueのTopのレコードを変更せずに出力すれば良い
|
|
854 <!–</li>
|
19
|
855 </ul>
|
|
856 </li>
|
20
|
857 <li>RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。
|
|
858 –></li>
|
17
|
859 </ul>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
860
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
861 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
862
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
863
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
864 </div><!-- presentation -->
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
865 </body>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
866 </html>
|