Mercurial > hg > Papers > 2014 > nobuyasu-master
changeset 79:2e53de70f64e
Fixed slide
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 03 Feb 2014 10:38:28 +0900 |
parents | 04f63b011fee |
children | e889fc4dc925 |
files | slides/graffle/merge_impl1.graffle slides/graffle/merge_impl2.graffle slides/images/merge_impl1.png slides/images/merge_impl2.png slides/images/tree_conflict.png slides/images/tree_conflict2.png slides/images/tree_conflict3.png slides/index.html |
diffstat | 8 files changed, 418 insertions(+), 97 deletions(-) [+] |
line wrap: on
line diff
--- a/slides/graffle/merge_impl1.graffle Mon Feb 03 09:43:16 2014 +0900 +++ b/slides/graffle/merge_impl1.graffle Mon Feb 03 10:38:28 2014 +0900 @@ -53,6 +53,132 @@ <array> <dict> <key>Bounds</key> + <string>{{186, 220}, {69, 36}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>129</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 2A\'82\'f0\'92\'c7\'89\'c1}</string> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>128</integer> + <key>Points</key> + <array> + <string>{248, 248}</string> + <string>{193, 248}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>Legacy</key> + <true/> + <key>LineType</key> + <integer>1</integer> + <key>TailArrow</key> + <string>FilledArrow</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>127</integer> + <key>Points</key> + <array> + <string>{358, 248.69137573242188}</string> + <string>{303, 248.69137573242188}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>LineType</key> + <integer>1</integer> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{297, 220}, {69, 36}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>126</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 2B\'82\'f0\'92\'c7\'89\'c1}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> <string>{{38.2528076171875, 239}, {69, 36}}</string> <key>Class</key> <string>ShapedGraphic</string> @@ -141,8 +267,8 @@ <integer>122</integer> <key>Points</key> <array> - <string>{450, 260.04291712116543}</string> - <string>{426.49924119410218, 258.7097886371468}</string> + <string>{450, 260.05541113276905}</string> + <string>{426.49922249609187, 258.73079228333796}</string> </array> <key>Style</key> <dict> @@ -176,8 +302,8 @@ <integer>121</integer> <key>Points</key> <array> - <string>{107.2528076171875, 256.99997839274545}</string> - <string>{125.46880340576172, 256.99996698411769}</string> + <string>{107.2528076171875, 256.99998639009777}</string> + <string>{125.46880340576172, 256.99998639009777}</string> </array> <key>Style</key> <dict> @@ -211,8 +337,8 @@ <integer>120</integer> <key>Points</key> <array> - <string>{402.02946723861231, 329.15684189793234}</string> - <string>{410.64639842655112, 354.60612798829442}</string> + <string>{402.02941558804184, 329.15686304943409}</string> + <string>{410.64627854496194, 354.60617670803515}</string> </array> <key>Style</key> <dict> @@ -246,8 +372,8 @@ <integer>119</integer> <key>Points</key> <array> - <string>{161.52946362279454, 329.1568422179347}</string> - <string>{170.14639345951389, 354.60612762643075}</string> + <string>{161.52941197221759, 329.15686336943639}</string> + <string>{170.14627357791323, 354.60617634617159}</string> </array> <key>Style</key> <dict> @@ -434,8 +560,8 @@ <integer>113</integer> <key>Points</key> <array> - <string>{387.62236973629228, 328.54183262904701}</string> - <string>{375.97896183908267, 356.16803336448282}</string> + <string>{387.62253883761252, 328.54191891490035}</string> + <string>{375.97938100993071, 356.16824724912578}</string> </array> <key>Style</key> <dict> @@ -469,8 +595,8 @@ <integer>112</integer> <key>Points</key> <array> - <string>{380.66432492551081, 322.41374128893654}</string> - <string>{333.54337904264867, 362.29645895690038}</string> + <string>{380.66432871618662, 322.4137467226123}</string> + <string>{333.54339492351937, 362.29648161406601}</string> </array> <key>Style</key> <dict> @@ -722,8 +848,8 @@ <integer>102</integer> <key>Points</key> <array> - <string>{147.12236686160171, 328.54183262904706}</string> - <string>{135.47895896439221, 356.16803336448288}</string> + <string>{147.12253596292197, 328.54191891490041}</string> + <string>{135.47937813524018, 356.16824724912584}</string> </array> <key>Style</key> <dict> @@ -757,8 +883,8 @@ <integer>101</integer> <key>Points</key> <array> - <string>{140.16432205082012, 322.41374128893665}</string> - <string>{93.043376167957874, 362.29645895690038}</string> + <string>{140.16432584149609, 322.41374672261225}</string> + <string>{93.043392048828608, 362.29648161406601}</string> </array> <key>Style</key> <dict> @@ -973,7 +1099,7 @@ <key>MasterSheets</key> <array/> <key>ModificationDate</key> - <string>2014-02-02 18:16:57 +0000</string> + <string>2014-02-03 00:45:17 +0000</string> <key>Modifier</key> <string>Oshiro Nobuyasu</string> <key>NotesVisible</key>
--- a/slides/graffle/merge_impl2.graffle Mon Feb 03 09:43:16 2014 +0900 +++ b/slides/graffle/merge_impl2.graffle Mon Feb 03 10:38:28 2014 +0900 @@ -46,14 +46,162 @@ <key>Creator</key> <string>Oshiro Nobuyasu</string> <key>DisplayScale</key> - <string>1 0/72 in = 1 0/72 in</string> + <string>1 0/72 in = 1.0000 in</string> <key>GraphDocumentVersion</key> <integer>8</integer> <key>GraphicsList</key> <array> <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>125</integer> + </dict> + <key>ID</key> + <integer>135</integer> + <key>Points</key> + <array> + <string>{262.72256034511082, 354.76202392578125}</string> + <string>{261.5, 359.05178833007812}</string> + <string>{244.62945929128361, 366.64383849972063}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>LineType</key> + <integer>1</integer> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>134</integer> + </dict> + </dict> + <dict> <key>Bounds</key> - <string>{{183.10385588268571, 275}, {172, 38.070119395706797}}</string> + <string>{{231.5, 331.76202392578125}, {69, 23}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>134</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 2B\'82\'f0\'92\'c7\'89\'c1}</string> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>126</integer> + </dict> + <key>ID</key> + <integer>131</integer> + <key>Points</key> + <array> + <string>{500.59607486494139, 354.76202392578125}</string> + <string>{501, 359}</string> + <string>{488.94359478040002, 365.41500959028326}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>LineType</key> + <integer>1</integer> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>130</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{465, 331.76202392578125}, {69, 23}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>130</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 2A\'82\'f0\'92\'c7\'89\'c1}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{183.1038639889174, 269}, {172, 38.070119395706797}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> @@ -138,8 +286,8 @@ <integer>127</integer> <key>Points</key> <array> - <string>{169.41315739350551, 322.98349027875952}</string> - <string>{211.23798738352451, 361.05360967446632}</string> + <string>{169.41315739350554, 322.98349027875952}</string> + <string>{211.23798738352451, 361.05360967446626}</string> </array> <key>Style</key> <dict> @@ -261,8 +409,8 @@ <integer>120</integer> <key>Points</key> <array> - <string>{402.02946723861231, 329.15684189793234}</string> - <string>{410.64639842655112, 354.60612798829442}</string> + <string>{402.02941558804184, 329.15686304943409}</string> + <string>{410.64627854496194, 354.60617670803515}</string> </array> <key>Style</key> <dict> @@ -296,8 +444,8 @@ <integer>119</integer> <key>Points</key> <array> - <string>{161.52946362279454, 329.1568422179347}</string> - <string>{170.14639345951389, 354.60612762643075}</string> + <string>{161.52941197221759, 329.15686336943639}</string> + <string>{170.14627357791323, 354.60617634617159}</string> </array> <key>Style</key> <dict> @@ -445,8 +593,8 @@ <integer>113</integer> <key>Points</key> <array> - <string>{387.62236973629228, 328.54183262904701}</string> - <string>{375.97896183908267, 356.16803336448282}</string> + <string>{387.62253883761252, 328.54191891490035}</string> + <string>{375.97938100993071, 356.16824724912578}</string> </array> <key>Style</key> <dict> @@ -480,8 +628,8 @@ <integer>112</integer> <key>Points</key> <array> - <string>{380.66432492551081, 322.41374128893654}</string> - <string>{333.54337904264867, 362.29645895690038}</string> + <string>{380.66432871618662, 322.4137467226123}</string> + <string>{333.54339492351937, 362.29648161406601}</string> </array> <key>Style</key> <dict> @@ -733,8 +881,8 @@ <integer>102</integer> <key>Points</key> <array> - <string>{147.12236686160171, 328.54183262904706}</string> - <string>{135.47895896439221, 356.16803336448288}</string> + <string>{147.12253596292197, 328.54191891490041}</string> + <string>{135.47937813524018, 356.16824724912584}</string> </array> <key>Style</key> <dict> @@ -768,8 +916,8 @@ <integer>101</integer> <key>Points</key> <array> - <string>{140.16432205082012, 322.41374128893665}</string> - <string>{93.043376167957874, 362.29645895690038}</string> + <string>{140.16432584149609, 322.41374672261225}</string> + <string>{93.043392048828608, 362.29648161406601}</string> </array> <key>Style</key> <dict> @@ -922,7 +1070,7 @@ <key>MasterSheets</key> <array/> <key>ModificationDate</key> - <string>2014-02-02 18:24:21 +0000</string> + <string>2014-02-03 00:46:50 +0000</string> <key>Modifier</key> <string>Oshiro Nobuyasu</string> <key>NotesVisible</key>
--- a/slides/index.html Mon Feb 03 09:43:16 2014 +0900 +++ b/slides/index.html Mon Feb 03 10:38:28 2014 +0900 @@ -207,73 +207,20 @@ </article> <article> - <h3> - Jungleの分散設計:分散版管理システム - </h3> - <p>Jungleは分散設計を行うにあたってGitやMercurialといった分散版管理システムを意識している</p> - <p style="margin-top:-10px;">分散版管理システムとは多人数によるソフトウェア開発において変更履歴を管理するシステム</p> - <p style="margin-top:-10px;">分散版管理システムは次の特徴とAPIを持つ</p> - <ul> - <li>開発者それぞれがリポジトリのクローンしてローカルに持ち、開発はローカルのリポジトリを通すことで行われる</li> - <li>ローカルのリポジトリは独立に存在し、サーバ上にある他人のリポジトリから変更履歴をとることができる。また自身の変更履歴を伝えることもできる</li> - <li>データ更新時に先に別の更新が入っていた(衝突)場合はMergeによりデータの整合性をとる</li> - </ul> - </article> - - <article> - <h3> - Jungleの分散設計:分散版管理システム - </h3> - <p>分散版管理システムAPI</p> - <ul style="margin-top:-20px;"> - <li>commit:データに変更を加えたことをリポジトリに登録</li> - <li>push:ローカルのリポジトリで行った変更履歴を他のリポジトリへまとめて送る</li> - <li>pull:他のリポジトリからの変更履歴をまとめて受け取る</li> - </ul> - <p style="text-align:center;"> - <img style="height:200px;" src="./images/distributed_repository.png"> - </p> - <small> - <p>分版版管理システムはリポジトリが壊れても別のリポジトリよりデータを復旧できることと、push/pullそれとMergeによる整合性 - の確保で、高いスケーラビリティを持っている</p> - </small> + <h3> + Jungleの分散設計 + </h3> + <p>ここまでJungleに実装されている非破壊的木構造の利点について述べた。</p> + <p>次に、Jungleにおける分散設計について述べる。</p> + <p>データ分散を行うにあたり、まず考えることはトポロジーの形成と他のノードからデータの伝搬の仕方である。</p> + <p>Jungleはこの問題に対し、ツリートポロジーを形成し、データ編集の際に発生するcommit logを他のノードに流すことで解決する。</p> </article> <article> <h3> - Jungleの分散設計:分散版管理システム - </h3> - <p>Jungleと分散版管理システムには似通った点がある</p> - <li>どちらもデータのコピーが自由</li> - <li>データ更新しても過去のデータに影響を与えない</li> - <br/> - <p><font color="red">同じAPIを実装することで、分散版管理システムと同じく高いスケーラビリティが期待できる</font></p> - <p>具体的には</p> - <ul> - <li>pushやpullによる定期的なデータの更新</li> - <li>Mergeによる更新データ衝突の解決</li> - </ul> - </article> - - - <article> - <h3> - Jungleの分散実装 - </h3> - <p>ここまでJungleの分散設計について説明した。</p> - <br/> - <p>これらのシステムを実装する為にまずはJungleのノード同士でネットワークトポロジーを - 組み、その上でデータをやりとりする機構が必要になる。</p> - <p>そこで、ネットワートポロジーを組みログによるデータの分散を行う仕組みをJungleに実装した。</p> - <p>また、Mergeの例として掲示板プログラムにおけるMergeの実装も行った。</p> - </article> - - <article> - <h3> - Jungleの分散実装:ログによるデータ分散 + Jungleの分散設計:トポロジー形成とログによるデータ分散 </h3> <small> - <p>今回Jungleの分散実装は以下のように行った</p> <table> <tr> <th>ツリートポロジーを形成</th> @@ -293,8 +240,32 @@ </article> <article> + <h3> + データ更新衝突の解決 + </h3> + <p>トポロジー形成とデータ伝搬手段については述べた。</p> + <p>次に問題になることはデータの整合性をどのようにとるかである。</p> + <p>例えば、ノードの持つデータが全て同じ値にしなければならない場合は、データを持つノード全てにロックを掛けて + 変更を加える必要がある。この方法はスケールしない。</p> + <p>多少古い値を読んでも問題無く、結果整合性でよいというのなら幾つかのノードに書き込むだけで良い。こちらの方法はスケールする。</p> + </article> + + <article> + <h3> + 非破壊的木構造の利点を活かした分散設計 + </h3> + <p>Jungleで扱うつもりのデータは結果整合性でもよいCMSを想定していることを始めに説明した。</p> + <p>そこでJungleはMergeを使うことでデータの整合性をとることにした。</p> + <p>Mergeとは、2つ以上の変更を1つの変更にまとめることである。</p> + <p>分散システムにおいては、2つ以上のデータの更新が同じデータに対して行われていた場合、 + 更新を受け取って新しいデータを作ることを指す。</p> + <p>Mergeは自動で解決出来る場合とそうでない場合がある。</p> + </article> + + + <article> <h3> - Mergeによる更新の衝突の解決 + Mergeによる更新の衝突を自然に解決 </h3> <small> <table style="font-size: 0.7em; width:100%;" > @@ -310,9 +281,11 @@ </small> </article> + + <article> <h3> - Mergeによる更新の衝突の解決ができない場合 + Mergeによる更新の衝突が自然に解決できない場合 </h3> <table style="font-size: 0.7em; width:100%;" > <tr> @@ -327,6 +300,31 @@ <article> <h3> + JungleとMergeの相性 + </h3> + <p>Jungleは非破壊で過去のデータも保持しているため、更新時に過去のデータを参照して自然なMergeを行うことが可能。</p> + <p>自然にMergeできない場合においても、アプリケーション毎にMergeアルゴリズムを設計することで対応する。</p> + <p>Mergeが自動で行われるようになれば、Jungleで扱う木構造データは編集を自由に行うことができる。</p> + <p>木構造データが自由に行えるようになれば、Jungleはデータのリクエストに対して手元のデータを返すことができる。</p> + <p>古いデータを編集されたものが更新されても、いずれはMergeにより最新のデータと合わせられるから。</p> + <p></p> + </article> + + + <article> + <h3> + Jungleの分散実装 + </h3> + <p>以上がJungleにおける分散設計になる。</p> + <br/> + <p>この分散設計を元にJungleのサーバノード同士でツリトポロジーを構成し、ログによるデータ分散を実装した。</p> + <p>また、Mergeの例として掲示板プログラムにおけるMergeの実装も行った。</p> + </article> + + + + <article> + <h3> Jungleの分散実装:掲示板システムにおけるMerge </h3> <p>Jungleではアプリケーション毎にMergeアルゴリズムを設計</p> @@ -688,6 +686,55 @@ </article> + <article> + <h3> + Jungleの分散設計:分散版管理システム + </h3> + <p>Jungleは分散設計を行うにあたってGitやMercurialといった分散版管理システムを意識している</p> + <p style="margin-top:-10px;">分散版管理システムとは多人数によるソフトウェア開発において変更履歴を管理するシステム</p> + <p style="margin-top:-10px;">分散版管理システムは次の特徴とAPIを持つ</p> + <ul> + <li>開発者それぞれがリポジトリのクローンしてローカルに持ち、開発はローカルのリポジトリを通すことで行われる</li> + <li>ローカルのリポジトリは独立に存在し、サーバ上にある他人のリポジトリから変更履歴をとることができる。また自身の変更履歴を伝えることもできる</li> + <li>データ更新時に先に別の更新が入っていた(衝突)場合はMergeによりデータの整合性をとる</li> + </ul> + </article> + + <article> + <h3> + Jungleの分散設計:分散版管理システム + </h3> + <p>分散版管理システムAPI</p> + <ul style="margin-top:-20px;"> + <li>commit:データに変更を加えたことをリポジトリに登録</li> + <li>push:ローカルのリポジトリで行った変更履歴を他のリポジトリへまとめて送る</li> + <li>pull:他のリポジトリからの変更履歴をまとめて受け取る</li> + </ul> + <p style="text-align:center;"> + <img style="height:200px;" src="./images/distributed_repository.png"> + </p> + <small> + <p>分版版管理システムはリポジトリが壊れても別のリポジトリよりデータを復旧できることと、push/pullそれとMergeによる整合性 + の確保で、高いスケーラビリティを持っている</p> + </small> + </article> + + <article> + <h3> + Jungleの分散設計:分散版管理システム + </h3> + <p>Jungleと分散版管理システムには似通った点がある</p> + <li>どちらもデータのコピーが自由</li> + <li>データ更新しても過去のデータに影響を与えない</li> + <br/> + <p><font color="red">同じAPIを実装することで、分散版管理システムと同じく高いスケーラビリティが期待できる</font></p> + <p>具体的には</p> + <ul> + <li>pushやpullによる定期的なデータの更新</li> + <li>Mergeによる更新データ衝突の解決</li> + </ul> + </article> + </section>