changeset 11:ccdc3d3faafd

modify index.html
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Fri, 09 Sep 2011 15:54:08 +0900
parents eaf3f3d169fe
children d2cd412a0032
files OpenSourceConference/index.html~
diffstat 1 files changed, 495 insertions(+), 203 deletions(-) [+]
line wrap: on
line diff
--- a/OpenSourceConference/index.html~	Thu Sep 08 17:23:58 2011 +0900
+++ b/OpenSourceConference/index.html~	Fri Sep 09 15:54:08 2011 +0900
@@ -8,7 +8,12 @@
 .center {
 margin-left: auto;
 margin-right: auto;
+text-align: center;
 }
+.textcenter {
+text-align: center;
+}
+
 </style>
 <title>2011/9/6</title>
 <!-- metadata -->
@@ -92,118 +97,134 @@
 	</div>
       <!-- PAGE -->
       <div class="slide">
-	<h1>VNCによる画面共有の問題点</h1>
-	<li>一極集中型の為、VNC Server(VNCされる側)の負荷が重い。</li>
-	<li>1本のEthernetからデータを配信するため、クライアントが増えれば通信速度が落ちてしまう。</li>
-	<p style="text-align: center;">
-	  <img src="./pix/NormalVNC2.png" width="450">
-	</p>
+	<h1>通常のVNCの問題点</h1>
+	<table class="center">
+	  <tr>
+	    <td width=50% >
+	      <p style="text-aline: center;" >
+	      <img clas="scale" src="./pix/NormalVNC3.png" width="450">
+	      </p>
+	      </td>
+	    <td width=50% style="text-align: left;">
+	      <li><small>VNC Serverの負荷が重い。</small></li>
+	      <li><small>Server側の通信網1本への通信負荷が高い。</small></li>
+	  </td>
+	</tr>
+	</table>
 	</div>
       <!-- PAGE -->
-<!--
       <div class="slide">
-	<h1>VNCによる画面共有の問題点</h1>
+	<h1>通常のVNCの問題点</h1>
 	<p style="text-align: center;">
-	通常のVNC
+	  <li>
+	  <samll>1台と48台でVNCをかけた時のスループットとサーバ側のCPU使用率</small>
+	  </li>
 	</p>
-	<table class="center" width=80% style="text-align: center;">
+	<table class="center" class="incremental" border=1>
 	  <tr>
-	    <td><small>一極集中</small></td>
-	    <td><small>実際の接続</small></td>
+	    <td></td>
+	    <td>スループット(単位:Byte)</td>
+	    <td>CPU使用率</td>
 	  </tr>
+
 	  <tr>
-	    <td>
-		<img class="scale" src="./pix/NormalVNC0.png" width="450">
-	      </td>
-	    <td>
-	      <img src="./pix/NormalVNC2.png" width="450">
-	    </td>
+	    <td>1台</td>
+	    <td>20M</td>
+	    <td>55%</td>
 	  </tr>
-	    </p>
+
+	  <tr>
+	    <td>48台</td>
+	    <td>4M</td>
+	    <td>100%</td>
+	  </tr>
 	</table>
-	</div>
--->
+	<li>VNCに使われるCPUの使用率が100%になり、スループットが5分の1まで下がっている。</li>
+
+      </div>
       <!-- PAGE -->
       <div class="slide">
 	<h1>VNCの問題点の解決策</h1>
-	<li>クライアントからクライアントへ描画データを転送することで問題を解決させるTree VNCの設計と実装を行った。</li>
 	<p style="text-align: center;">
+	<small>クライアントを木構造で接続させる</samll><br>
 	<img class="scale" src="./pix/TreeVNC0.png" width="500" heigth="500"><br>
-	  <small>クライアント同士を接続させる</small>
 	</p>
 	</div>
       <!-- PAGE -->
       <div class="slide">
 	<h1>TreeVNCの利点</h1>
-	<li>クライアントが増えても負荷がある程度以上は掛からない。</li>
-	<li>1本のEthernetへの負荷が減り、安定した通信できる。</li>
-	<table class="center" width=80% style="text-align: center;">
+	<table class="center" width=100% style="text-align: center;">
 	  <tr>
 	    <td><small>通常のVNC</small></td>
 	    <td><small>TreeVNC</small></td>
 	  </tr>
 	  <tr>
 	    <td>
-		<img class="scale" src="./pix/NormalVNC2.png" width="450">
+		<img class="scale" src="./pix/NormalVNC3.png" width="300">
 	      </td>
 	    <td>
-	      <img src="./pix/TreeVNC1.png" width="450">
+	      <img src="./pix/TreeVNC3.png" width="300">
 	    </td>
 	  </tr>
 	    </p>
 	</table>
+	<li>クライアントが増えてもかかる負荷一定。</li>
+	<li>通信網1本に対する負荷が減り、安定した通信ができる(有線)。</li>
+	</div>
+      </div>
+      <!-- PAGE -->
+      <div class="slide">
+	<h1>TreeVNCの利点</h1>
+	<table class="center" width=100% style="text-align: center;">
+	  <tr>
+	    <td><small>通常のVNC</small></td>
+	    <td><small>TreeVNC</small></td>
+	  </tr>
+	  <tr>
+	    <td>
+		<img class="scale" src="./pix/NormalVNC3.png" width="300">
+	      </td>
+	    <td>
+	      <img src="./pix/TreeVNC3.png" width="300">
+	    </td>
+	  </tr>
+	    </p>
+	</table>
+	<table class="center" border=1 cellspacing="0" width=80%>
+	  <tr>
+	    <td></td>
+	    <td>通常のVNC</td>
+	    <td>TreeVNC</td>
+	  </tr>
+	  <tr>
+	    <td>最大負荷</td>
+	    <td> N * データ量 (クライアントの数に比例) </td>
+	    <td> (M+1) * データ量</td>
+	  </tr>
+	</table>
+	<p style="text-align: center;"><small>クライアントの数をN、木構造の子供の数をMとする</small> </p>
 	</div>
       </div>
       <!-- PAGE -->
       <div class="slide">
 	<h1>TreeVNCの設計</h1>
-	<li>クライアント同士を木構造で接続させ、描画データをクライアントからクライアントへ転送させる。</li>
-	<li>木構造を管理するTop Proxy(TreeVNC Proxy)が一台あり、このTop ProxyだけがVCN Serverへ接続する。</li>
 	<li>TreeVNCのクライアントは最初にTop Proxyに接続を行う。</li>
-<!--
-	<li>TreeVNCのクライアントは初めTop Proxyへ接続を行い、接続を行うクライアントを教えてもらう。</li>
--->
+	<li>データは木の下へと流れていく。</li>
 	<li>tightVNC ViewerのJava版(ver 1.3)を元にTreeVNCの実装を行う。</li>
-	</div>
-      <!-- PAGE -->
-<!--
-      <div class="slide">
-	<h1>TreeVNCの利点</h1>
 	<p style="text-align: center;">
-	TreeVNC
-	</p>
-	<table width=100% style="text-align: center; ">
-	  <tr>
-	    <p style="text-align: center;">
-	    <td width=50%><small>クライアント同士を<br>木構造で接続 </small></td>
-	    <td width=50%><small> 実際の接続</small></td>
+	  <img class="scale" src="./pix/TreeVNC0.png" width="500" heigth="500">
 	    </p>
-	  </tr>
-	  <tr>
-	    <td>
-	      <p style="text-align: center;">
-		<img class="scale" src="./pix/TreeVNC0.png" width="450">
-		</p>
-	      </td>
-	    <td>
-	      <p style="text-align: center;">
-		<img class="scale" src="./pix/TreeVNC1.png" width="450">
-		</p>
-	    </td>
-	  </tr>
-	</table>
 	</div>
--->
       <!-- PAGE -->
       <div class="slide">
 	<h1>発表内容</h1>
 	<ul>
 	  <li>RFB Protocol</li>
-	  <li>データ量の見積もり</li>
+	  <li>データ転送量</li>
+	  <li>ZRLE Encodingの問題</li>
 	  <li>データ転送に用いたMulticastQueueについての説明</li>
-	  <li>TreeVNCのデモ</li>
+<!--	  <li>TreeVNCのデモ</li> -->
 	  <li>木構造の再構築</li>
-	  <li>ZRLE Encodingの問題</li>
 	</ul>
 	</div>
       <!-- PAGE -->
@@ -211,7 +232,22 @@
 	<h1>RFB protocol</h1>
 	<li>Remote Frame Buffer Protocol : <br>GUI操作によるリモートアクセス用の通信プロトコル。VNCで用いられる。</li>
 	<li>転送される画面(フレームバッファ)のデータは変更があった部分(差分)だけが矩形単位で送られる。</li>
-	<li>キーイベントやマウスイベントも扱っている。</li>
+	<table class="center" width=100%>
+	  <tr>
+	    <td>
+	      <img src="./pix/hadesScreen1.png">
+	      </td>
+	    <td>
+	      <img src="./pix/rightArrow.png">
+	      </td>
+	    <td>
+	      <img src="./pix/hadesScreen2.png">
+	      </td>
+	    </tr>
+	    </table>
+	    <small>
+	    <p style="text-align: center;"><font color=red>□ </font>で囲まれている矩形のデータだけが送られてくる。 </p>
+	    </small>
 	</div>
       <!-- PAGE -->
       <div class="slide">
@@ -219,33 +255,26 @@
        <table class="scale" width=100% >
 	 <tr>
 	   <td width=50%>
-	     <img class="scale" src="./pix/VNC_Sequence_.png"  height=80%>
+	     <img class="scale" src="./pix/VNC-Sequence-.png"  height=80%>
 	     </td>
 	     <td width=50% align="left">
-<small>
-<li>1~5までは使用するプロトコルのバージョン、認証方法、エンコーディング等の決定を行う。</li>
-<li>6からフレームバッファや、リモート操作の為キーボード・マウスの入力情報を行う通信が行われる。</li>
-</small>
+	       <small>
+	       <li><font color=blue>1~5</font>まではinitial seaquenceとなる。</li>
+	       <li><font color=orange>6</font>以降は繰り返し行われる処理。画面のデータが転送されてくる。</li>
+	       </small>
 	     </td>
 	 </tr>
 	 </table>
 	</div>
       <!-- PAGE -->
       <div class="slide">
-	<h1>RFB protocol</h1>
-	<li>FramebufferUpdateが描画のデータを転送する部分となる。</li>
-	<li>クライアントはFramebufferUpdateRequestで、VNC Serverへ関心のある領域についてリクエストを出す。</li>
-	<li>リクエストに対してのサーバの返信がFramebufferUpdateとなる。</li>
-	<li>Requestを出してupdateを受け取るということを繰り返し行い画面の共有を行っている。</li>
-	</div>
-      <!-- PAGE -->
-      <div class="slide">
 	<h1>RFB Protocol</h1>
-	<li>FramebufferUpdateRequestの内容</li>
+	<li>FramebufferUpdateRequest:</li>
+	<li><small>画面に差分が発生したらサーバから教えて貰うためのリクエスト</small></li>
 <small>
-<table >
+<table>
 <td width=50%>
-<table>
+<table border=1 cellspacing="0">
   <tr>
     <td>バイト数</td>
    <td><pre>型   [値]</pre></td>
@@ -290,32 +319,17 @@
 
 </table>
 </td>
-<td>
-<table>
-
-<tr>
-<font color=blue >
-incrementalについて
-</font>
-</tr>
-<tr>
-<li>0の場合、VNC Serverは指定された領域の矩形データを送ってくる。</li>
-<li>0以外の場合はその領域内で差分が発生した時に矩形データを送る。</li>
-</tr>
 </table>
-</td>
-
-</table>
+<li>このリクエストはTop Proxyだけが行う。 </li>
 </small>
 	</div>
       <!-- PAGE -->
       <div class="slide">
 	<h1>RFB Protocol</h1>
-	<li>FramebufferUpdate</li>
+	<li>FramebufferUpdate: <small>画面の更新データ</small></li>
+	
 <small>
-<table>
-<td width=100%>
-<table>
+<table border=1 cellspacing="0" >
     <tr>
     <td>バイト数</td>
    <td><pre>型   [値]</pre></td>
@@ -324,7 +338,7 @@
 
   <tr>
     <td>1</td>
-    <td><pre>U8         0</pre></td>
+    <td><pre>U8          0</pre></td>
     <td>message-type </td>
   </tr>
 
@@ -342,8 +356,15 @@
 
 </table>
    <li>以下number-of-rectanglesの数だけ矩形のデータが続く</li>
+
 <table width=100%>
-  <tr>
+<td>
+<table border=1 cellspacing="0" width=50%>
+    <tr>
+    <td>バイト数</td>
+   <td><pre>型   </pre></td>
+    <td>説明 </td>
+  </tr>
 
   <tr>
     <td>2</td>
@@ -375,169 +396,444 @@
     <td>encoding-type</td>
   </tr>
 
+  <tr>
+    <td>...</td>
+    <td><pre>...<pre></td> 
+    <td>PIXEL DATA</td>
+  </tr>
+
+
 </table>
 </td>
+<td>
+</td>
 
 </table>
+
+
 </small>
 	</div>
       <!-- PAGE -->
-      <!-- PAGE -->
-      <div class="slide">
-	<h1>RFB Protocol</h1>
-	<li>図を入れる</li>
-	<li>指定された領域の矩形を更新しているのが分かる図 </li>
-	</div>
-      <!-- PAGE -->
       <div class="slide">
 	<h1>RFB Protocol</h1>
-	<li>RFB ProtocolにはFramebufferUpdateRequestだけではなく、キーボード・マウスポインタの入力を伝えるkeyEventやPointerEvent等もある。</li>
-	<li>TreeVNCでは画面の共有を行いたいのでそれらのイベントに対しての実装は行っていない。</li>
-	</div>
+	<li style="text-align: center;"><small>例:FramebufferUpdate</small></li>
+<table class="center" border=1 cellspacing="0" width=50%>
+  <tr>
+    <td>x-position</td>
+    <td>336</td>
+  </tr>
+
+  <tr>
+    <td>y-position</td>
+    <td>388</td>
+  </tr>
+
+  <tr>
+    <td>width</td>
+    <td>724</td>
+  </tr>
+
+  <tr>
+    <td>height</td>
+    <td>449</td>
+  </tr>
+
+  <tr>
+    <td>encoding-type</td>
+    <td>16(ZRLE)</td>
+  </tr>
+
+  <tr>
+    <td>ZRLE</td>
+    <td>...</td>
+  </tr>
+</table>
+
+	<table class="center">
+	  <tr>
+	    <td>
+	      <img src="./pix/hadesScreen1.png">
+	      </td>
+	    <td>
+	      <img src="./pix/rightArrow.png">
+	      </td>
+	    <td>
+	      <img src="./pix/hadesScreen2.png">
+	      </td>
+	    </tr>
+	    </table>
+
+	  </div>
       <!-- PAGE -->
       <div class="slide">
-	<h1>負荷分散</h1>
-	<li>負荷分散を行う上で重要: -> 転送するデータ量を見積もること </li>
-	<li>ネットワークの帯域やswtichにかかる負荷を把握するため。負荷を把握していないと負荷分散できているかどうかも解らない。</li>
-	<li>RFB Protocolで送られてくるデータ量: -> 先頭の20バイトを読むことで見積もることができる。 </li>
+	<h1>データ転送量</h1>
+	<p style="text-align: center;">
+	  <small>矩形の大きさと描画に必要なデータ量(単位:Byte)</small>
+	</p>
+	  <table class="center"  border=1 cellspacing="0" width=80%>
+	    <tr>
+	      <td>矩形の大きさ \ エンコード</td>
+	      <td>RAW</td>
+	      <td>ZRLE</td>
+	    </tr>
+
+	    <tr>
+	      <td>724 * 449</td>
+	      <!--
+	      <td>1300304</td> 
+	      <td>796642</td> 
+	      -->
+	      <td>1.3M</td>
+	      <td>0.8M</td>
+	    </tr>
+
+	    <tr>
+	      <td>1920 * 64</td>
+	      <!--
+	      <td>491520</td>
+	      <td>309602</td>
+	      -->
+	      <td>0.5M</td>
+	      <td>0.15M</td>
+	    </tr>
+
+	    <tr>
+	      <td>1920 * 1080</td>
+	      <!--
+	      <td>8294400</td>
+	      <td>3472780</td>
+	      -->
+	      <td>8.2M</td>
+	      <td>3.4M</td>
+	    </tr>
+
+	  </table>
+
+	<p style="text-align: center;">
+	  <img src="./pix/dataLength.png" width="450" heigth="325"> <br>
+	    <small>RAW、ZRLE、ZRLEEエンコードのデータ量の比較</small>
+	</p>
 	</div>
       <!-- PAGE -->
       <div class="slide">
-	<h1>データ量の見積もり</h1>
-	<li>FramebufferUpdate(以下update)毎にデータを扱うためには、update1回分で送られてくるバイト量を知る必要がある
-	  <br>(どこまで読みこめば終わりなのか知る必要がある)。 </li>
-	<li>先頭の20バイトを読むことでupdate1回分のバイト量を知ることができる(厳密にはエンコード次第だが...)。 </li>
-	<li>updateは最初に送られてくる情報に矩形の横と縦幅(width,height)が含まれていてそれと扱われるエンコードによって全体のデータ量を計算することができる。</li>
+	<h1>データ転送量</h1>
+	<li>クライアントが60台の時の通常のVNCと、2分木構成にしたTreeVNCの通信網への負荷の理論値を考える。</li>
+	<table class="center" border=1 cellspacing="0" width=80%>
+	  <tr>
+	    <td></td>
+	    <td>通常のVNC</td>
+	    <td>TreeVNC</td>
+	  </tr>
+	  <tr>
+	    <td>最大負荷</td>
+	    <td> N * データ量(クライアントの数に比例) </td>
+	    <td> (M+1) * データ量</td>
+	  </tr>
+	</table>
+	<p style="text-align: center;"><small>クライアントの数をN、木構造の子供の数をMとする</small> </p>
+	<li>N = 60、 M = 1 となる。</li>
+	<li>724 * 449 の画面分のデータ(0.8M)を送信するとする。 </li>
+	
 	</div>
+	<!-- PAGE -->
+	<div class="slide">
+	  <h1>データ転送量</h1>
+	<p style="text-align: center;"> <small>理論値</small>
+	<table class="center" border=1 cellspacing="0" width=80%>
+	  <tr>
+	    <td></td>
+	    <td>通常のVNC</td>
+	    <td>TreeVNC</td>
+	  </tr>
+	  <tr>
+	    <td>最大負荷</td>
+	    <td>48M</td>
+	    <td>2.4M</td>
+	  </tr>
+	</table>
+	<table class="center" width=100% style="text-align: center;">
+	  <tr>
+	    <td><small>通常のVNC</small></td>
+	    <td><small>TreeVNC</small></td>
+	  </tr>
+	  <tr>
+	    <td width=50%>
+		<img class="scale" src="./pix/NormalVNC4.png">
+	      </td>
+	    <td>
+	      <img src="./pix/TreeVNC5.png">
+	    </td>
+	  </tr>
+	    </p>
+	  </table>
+	  <small>	  
+	  <p style="text-align: center">クライアント:60台 TreeVNCは2分木でTreeを構成 </p>
+	  </small>
+      </div>
       <!-- PAGE -->
       <div class="slide">
-	<h1>データ量の見積もり</h1>
-	<li>ZRLEエンコードの場合</li>
-	  <li>最初の4bitにどれだけのデータ量が送られてくるのかという情報が送られてくる。</li>
+	<h1>エンコード</h1>
+	<li>MacintoshでVNCを行うとZRLEを使うことができる。</li>
+	<li>データ量がRAWデータの約4分の1ですむ。</li>
+	<li class="incremental">TreeVNCではこのZRLEを扱っている。</li>
+      </div>
+      <!-- PAGE -->
+      <div class="slide">
+	<h1>ZRLE</h1>
+	<li>ZRLE : Zlib Run-Length Encoding </li>
+	<ul>
+	  <li>Zlib圧縮(gzip)されたデータ扱うエンコーディング。</li>
+	</ul>
+	  <li>最初の4バイトにはZlibのデータの長さが、続いてZlibのデータが送られてくる。</li>
 	  <small>
-	  <table border=1 width=50%>
+	  <table border=1 width=50% cellspacing="0">
 	    <tr>	
       <td>バイト数</td>
-	      <td><pre>型   [値]</pre></td>
+	      <td><pre>型 </pre></td>
 	      <td>説明 </td>
 	    </tr>
-	    
 	    <tr>
 	      <td>4</td>
 	      <td>U32</td>
 	      <td>length</td>
 	    </tr>
-	    
 	    <tr>
 	      <td>length</td>
 	      <td>U8 array</td>
 	      <td>zlibData</td>
 	    </tr>
-
 	  </table>
 	  </small>
-	  <small>
-	<ul>
-	  <li>ZlibDataはgzipされたデータのこと</li>
-	  <li></li>
+
+	  <li>Zlibデータ</li>
+	  <ul>
+	    <li>Zlibデータは辞書を元にデータの解凍を行う</li>
 	</ul>
-	</small>
+	<li class="incremental">辞書がなければデータを正しく解凍できない</li>
+	</div>
+      <!-- PAGE -->
+      <div class="slide">
+	<h1>ZRLEの問題</h1>
+	<li>辞書はZlibデータの最初に送られてくる。</li>
+	<li>ZRLEのデータを最初から送ることができれば、辞書も送ることができる。</li>
+	<li>データの途中から送ると辞書は送られず、正しく解凍を行うことができない。</li>
+	<table class="textcenter" width=100%>
+	  <tr>
+	    <td>
+	  <img src="./pix/ZRLE.png" width="600" >
+	  </td>
+	<td>
+	    <img src="./pix/ZRLE2.png" width="600" >
+	  </td>
+	</tr>
+	  </table>
 	</div>
       <!-- PAGE -->
       <div class="slide">
-	<h1>データ量の見積もり</h1>
-	<li>先頭20バイトを読みupdate一回分のデータ量を調べる。</li>
-	<li>update1回分のデータを読み込み次のクライアントに送信する。</li>
-	<li>また、描画データを送信すると同時に画面の更新を行うようにする。</li>
-	<li class="incremental">描画データの管理はMulticastQueueで行った。 </li>
+	<h1>ZRLEE</h1>
+	<li>そこで、Top ProxyにZRLEのデータを再度圧縮し直すことで辞書を付けてもらうことにした。以下はその部分のソースである。</li>
+<small>	
+	<pre>
+Deflater nDeflater = deflater; // new Deflater();
+LinkedList<ByteBuffer> out = new LinkedList<ByteBuffer>();
+unzip(inflater, inputs, 0 , out, INFLATE_BUFSIZE);
+// dump32(inputs);
+int len2 = zip(nDeflater, out, 0, bufs);
+</pre>
+</small>
+<li>このエンコードはZRLEEと名付けた。</li>
+	<table class="textcenter" width=100%>
+	  <tr>
+	    <td>
+	      <img src="./pix/ZRLEE2.png" width="600">
+		</td>
+	      <td>
+	      <img src="./pix/ZRLEE3.png" width="600">
+		</td>
+	      </tr>
+	    </table>
+	</div>
+      <!-- PAGE -->
+      <div class="slide">
+	<h1>ZRLEE</h1>
+	  <li>クライアント側は毎回新しいZRLEのストリームを使うようにする。</li>
+	  <pre>
+	    if (rfb.updateRectEncoding==RfbProto.EncodingZRLEE) 
+   	       zrleInStream = null;
+	    if (zrleInStream == null)
+	       zrleInStream = new ZlibInStream();
+	  </pre>
+	  <li>JavaではZlibの辞書の取り出しが実装されていなかった為、このような方法をとることになった。</li>
+	<li class="incremental">ZRLEに比べるとデータ量は増えないのか...?</li>
+	</div>
+      <!-- PAGE -->
+      <div class="slide">
+	<h1>ZRLEEのデータ量</h1>
+	<table class="textcenter" >
+	  <tr>
+	    <td>
+	      <img src="./pix/ZRLEE2.png" width="600">
+	    </td>
+	    <td style="text-align: left;">
+	      毎回辞書が付与される分データ量が増えるのではないか?
+	    </td>
+	  </tr>
+	</table>
+      </div>
+      <!-- PAGE -->
+      <div class="slide">
+	<h1>圧縮したデータの転送</h1>
+	<li>一度ZRLEEに圧縮してしまえば、データはそのまま流すことができる。</li>
+	<li>また、データの転送は複数いる子へ並列に行われる。</li>
+	<p class="textcenter">
+	  <img  src="./pix/MulticastQueue3.png">
+	  </p>
+	<li class="incremental">MulticastQueueクラスを用いてデータの転送を行った。</li>
       </div>
       <!-- PAGE -->
       <div class="slide">
 	<h1>MulticastQueue</h1>
-	<li>MulticastQueueはjava.util.CountDownLatchを用いて実装されたクラスである。 </li>
-	<li>クライアントから接続されると、データ転送用のスレッド(sender)が走る。 </li>
-	<li>このスレッドは次に流すデータが来るまでは待機して置かなければならない。そして流すべきデータがくるとまた動き始めなければならない。</li>
-	<li>このスレッドの待機・解放を行うのがMulticastQueueとなる。 </li>
+	<li>データを順序よく読み込ませるクラス:MulticastQueue</li>
+	  <table class="textcenter" border=1 cellspacing="0" width=100%>
+	    <tr>
+	      <td width=50%>
+		<img src="./pix/MulticastQueue2.png">
+		</td>
+	      <td>
+		<img src="./pix/MulticastQueue.png">
+	      </td>
+	      </tr>
+
+	      <tr>
+		<td>
+		  次のデータがなければwaitする
+		</td>
+		<td>
+		  データがputされ次第読み込みを再開する
+		</td>
+	      </tr>
+	    </table>
+	      <p><small>
+		  MulticastQueueは、java.util.CountDownnLatchにより実装されている。
+	      </small></p>
+	</div>
+      <!-- PAGE -->
 <!--
-	<small>
-	  <li>CountDownLatchはカウントを用いてスレッドの待機と解放を行えるクラスである。</li>
-	</small>
+      <div class="slide">
+	<h1>MulticastQueue</h1>
+	<li>MulticastQueueからデータを取り出し子供に送っている部分のソース</li>
+	<pre>
+LinkedList<ByteBuffer> bufs = c.poll();
+int inputIndex = 0;
+ByteBuffer header = bufs.get(inputIndex);
+if (header==null) continue;
+writeToClient(os, bufs, inputIndex);
+</pre>
+<li>c.poll(inputIndex) 内部では次の処理を行っている。</li>
+<pre>
+latch.await();
+return next;
+</pre>
+<li>次のデータが用意できるまでawait()で待つのである。</li>
+	</div>
 -->
-	</div>
+      <!-- PAGE -->
+<!--
+      <div class="slide">
+	<h1>MulticastQueue</h1>
+	<li>データは作られるとMulticastQueueにputされる。</li>
+	<p><small>put内部ではつぎの処理が行われる。</small></p>
+	<pre>
+Node<T> next = new Node<T>(item);
+tail.set(next);
+tail = next;
+	  </pre>
+
+<small>
+<p>
+set()内部ではlatchがcountDown()され、await()で止まっていたスレッドが動き出す。
+</small>
+      </div>
+-->
       <!-- PAGE -->
       <div class="slide">
 	<h1>MulticastQueue</h1>
-	<li>MulticastQueueの図を入れる。 </li>
-	<p style="text-align: center;">
-	<small>
-	  接続されてきた時点からデータの送信が始まる。データは読み込まれるまでメモリ上に残っている。
-	</small>
-	</p>
-	</div>
+	<table class="textcenter" style="margin-top: 50px" width=100% >
+	  <tr>
+	    <td>
+	  <img src="./pix/MulticastQueue_proxy2.png" width="600">
+	    </td>
+	  <td  style="text-align: left;" width=50%>
+	    <li>putでデータの入力</li>
+	    <li>pollでデータの取り出し</li>
+	    <li>Proxyは常に最新のデータだけを保持</li>
+	    </td>
+	  </tr>
+	    <tr>
+	      <td width=50%>
+		<img src="./pix/MulticastQueue_proxy3.png" width="600">		
+	      </td>
+	      <td style="text-align: left;">
+		<li>クライアントは最新のデータから読み込み始める。</li>
+	      </td>
+	    </tr>
+	</table>
+	      <p class="textcenter">実際のソースでみてみる</p>
+      </div>
       <!-- PAGE -->
       <div class="slide">
 	<h1>MulticastQueueの問題点</h1>
-	<li>Clientがデータを読み込まないとデータが溜まりメモリを圧迫してしまう。 </li>
-	<p style="text-align: center;">
-	<img src="./pix/TimeOut1.png">
-	</p>
+	<li>クライアントがデータを読み込まない時...
+	<table class="textcenter" width=100% style="margin-top: 50px; margin-bottom: 50px;">
+	  <tr>
+	    <td width=50%>
+	      <img src="./pix/MCTimeOut1.png">
+	    </td>
+	    <td>
+	      <img src="./pix/MCTimeOut2.png">
+	    </td>
+	  </tr>
+	</table>
+	    <li>読み込まれないデータはProxyのメモリに残り続ける。</li>
 	</div>
       <!-- PAGE -->
       <div class="slide">
 	<h1>MulticastQueueの問題点</h1>
-	<li style="text-align: center;">解決策</li>
-	<p style="text-align: center;">
-	<img src="./pix/TimeOut2.png">
-	</p>
-	  <small>
-	  <li>TimeOut(TO)スレッドを走らせ、一定の時間データを読み込まなければ代わりにこのTOが読み込むようにする。</li>
-	  </small>
+	<li>TimeOut(TO)スレッドを走らせ、最新のデータから取得できるようする。</li>
+	<table class="textcenter" width=100% style="margin-top: 50px;  margin-bottom: 50px;">
+	  <tr>
+	    <td width=50%>
+	      <img src="./pix/MCTimeOut3.png">
+	    </td>
+	    <td>
+	      <img src="./pix/MCTimeOut4.png">
+	    </td>
+	  </tr>
+	</table>
+	  <li>どこからも参照されないデータはProxyのメモリから削除される。</li>
 	</div>
       <!-- PAGE -->
       <div class="slide">
-	<h1>TreeVNCのデモ</h1>
-	<li>では実際に動かしてみる。</li>
+	<h1>まとめ</h1>
 	<li></li>
 	</div>
       <!-- PAGE -->
       <div class="slide">
-	<h1>エンコードの問題 </h1>
-	<li>ZRLE : Zlib Run-Length Encoding </li><br>データをZlib圧縮扱うエンコーディング。
-	  <br><small>Macintoshでもこのエンコードは使うことができる。</small></li>
-	<li>Rawエンコードより約1/8倍少ないデータ量ですむ。</li>
-	<li>解凍器(Deflater)は辞書を持っていて、その辞書を元に解凍を行う。</li>
-	<li class="incremental">この辞書を吐き出す(flush)する機能がJavaにはなかった。</li>
-	</div>
-      <!-- PAGE -->
-      <div class="slide">
-	<h1>ZRLEの問題</h1>
-	<li>解凍に必要な辞書を取り出すことができないため、ZRLEのデータはそのまま投げるだけでは正しく解凍されない。</li>
-	<li>そこで、VNC Serverへ接続するTop ProxyはZRLEで送られてきたデータを毎回新しく圧縮し直すという方法をとった。</li>
-	<li>一度圧縮し直されたデータはそのまま流すことができる。よってクライアント側では圧縮し直す必要はない。 </li>
-     	<li>このエンコードはZRLEE(Economy)として扱うことにした。</li>
+	<h1>テスト環境の構築</h1>
+	<li>CUI版のVNCクライアントを作成</li>
+	<li>48台あるクラスタでCUI版のクライアントをはしらせてVNCをかけさせる。</li>
+	<li>最初の1台目と48台めをGUI版のクライアントで接続を行い見比べてみる。 </li>
 	</div>
       <!-- PAGE -->
       <div class="slide">
-	<h1>TreeVNCの利点と欠点</h1>
-	<ul>
-	  <li>ケーブル1本への負荷が減る。一極集中型よりスループットを維持できる。</li>
-	  <li>無線を使われると遅くなる。</li>
-	</ul>
+	<h1>TreeVNCの発端</h1>
+	<li>大学のB3でうける授業の1つ、programming4で作り始めたことがきっかけ。</li>
+	<li>programming4はグループで作りたいものを提案して作る授業。 </li>
+	<li>授業が終わっても改良を加えていた。</li>
+	<li>B4になりこの場で発表してみることになった。</li>
 	</div>
       <!-- PAGE -->
-      <div class="slide">
-	<h1>テスト環境について</h1>
-	<li>CUI版のVNCクライアントを作成</li>
-	<li>48台あるクラスタでCUI版のクライアントをはしらせてVNCをかけさせる。</li>
-	<li>最初の1台目と50台めをGUI版のクライアントで接続を行い見比べてみる。 </li>
-	</div>
-      <!-- PAGE -->
-      <div class="slide">
-	<h1></h1>
-	<li></li>
-	<li></li>
-	</div>
-      <!-- PAGE -->
+<!--
       <div class="slide">
 	<h1>既存のプログラムとの比較</h1>
 	<li>VNC Reflector</li>
@@ -546,11 +842,7 @@
 	  <li>VNC Reflecotrにクライアントが接続することでVNCを行うことができる</li>
 	</ul>
 	</div>
-      <!-- PAGE -->
-      <div class="slide">
-        <h1></h1>
-	<li></li>
-	</div>
+-->
       <!-- PAGE -->
 </div>
 </body>