view presen/sample.html @ 175:7e7fe5e28ba4

add presen directory
author Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
date Mon, 05 Feb 2018 17:54:31 +0900
parents
children 055266d62d84
line wrap: on
line source

<!DOCTYPE html>
<html>
<head>
   <meta http-equiv="content-type" content="text/html;charset=utf-8">
   <title>分散システム向けのTopology Managerの改良</title>

<meta name="generator" content="Slide Show (S9) v2.5.0 on Ruby 2.1.0 (2013-12-25) [x86_64-darwin13.0]">
<meta name="author"    content="照屋のぞみ  河野真治" >

<!-- style sheet links -->
<link rel="stylesheet" href="s6/themes/projection.css"   media="screen,projection">
<link rel="stylesheet" href="s6/themes/screen.css"       media="screen">
<link rel="stylesheet" href="s6/themes/print.css"        media="print">
<link rel="stylesheet" href="s6/themes/blank.css"        media="screen,projection">

<!-- JS -->
<script src="s6/js/jquery-1.11.3.min.js"></script>
<script src="s6/js/jquery.slideshow.js"></script>
<script src="s6/js/jquery.slideshow.counter.js"></script>
<script src="s6/js/jquery.slideshow.controls.js"></script>
<script src="s6/js/jquery.slideshow.footer.js"></script>
<script src="s6/js/jquery.slideshow.autoplay.js"></script>

<!-- prettify -->
<link rel="stylesheet" href="scripts/prettify.css">
<script src="scripts/prettify.js"></script>

<script>
  $(document).ready( function() {
    Slideshow.init();

    $('code').each(function(_, el) {
      if (!el.classList.contains('noprettyprint')) {
        el.classList.add('prettyprint');
        el.style.display = 'block';
      }
    });
    prettyPrint();
  } );

  
</script>

<!-- Better Browser Banner for Microsoft Internet Explorer (IE) -->
<!--[if IE]>
<script src="s6/js/jquery.microsoft.js"></script>
<![endif]-->



</head>
<body>

<div class="layout">
  <div id="header"></div>
  <div id="footer">
    <div align="right">
      <img src="s6/images/logo.svg" width="200px">
    </div>
  </div>
</div>

<div class="presentation">

  <div class='slide cover'>
    <table width="90%" height="90%" border="0" align="center">
      <tr>
        <td>
          <div align="center">
            <h1><font color="#808db5">分散システム向けのTopology Managerの改良</font></h1>
          </div>
        </td>
      </tr>
      <tr>
        <td>
          <div align="left">
            照屋のぞみ  河野真治
            琉球大学 工学部 情報工学科
            <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;">
          </div>
        </td>
      </tr>
    </table>
  </div>

<div class='slide '>
<!-- === begin markdown block ===

      generated by markdown/1.2.0 on Ruby 2.1.0 (2013-12-25) [x86_64-darwin13.0]
                on 2016-05-30 16:11:37 +0900 with Markdown engine kramdown (1.5.0)
                  using options {}
  -->

<!-- _S9SLIDE_ -->
<h1 id="section">研究目的(1/3)</h1>
<ul>
  <li>当研究室が開発している並列分散フレームワークAliceではスケーラブルな分散プログラムを信頼性高く記述できる環境を実現する。</li>
  <li>ここで言う信頼性とは定められた環境下で安定して仕様に従った動作を行うことを指す。  </li>
  <li>スケーラビリティと信頼性の向上のため、Aliceでは当研究室が提案しているデータを Data Segment、タスクを Code Segment という単位で分割して記述するプログラミング手法を採用している。</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="section-1">研究目的(2/3)</h1>
<ul>
  <li>さらに処理をComputationとMetaComputationに階層化し、コアな仕様とそれを支える複雑な例外処理に分離する。</li>
  <li>分散環境構築などの複雑な処理をAliceがMeta Computationとして提供するため、仕様の変更を抑えた拡張が可能となる。</li>
  <li>例えば、分散アプリケーションでNATを越えて通信するように拡張したい場合、コアな処理は変えずMeta Computationに指定する分散トポロジーを変更するだけで良い。</li>
  <li>拡張する際にメインのコードを破壊しないため変更前の信頼性を保つことができる。</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="section-2">研究目的(3/3)</h1>
<ul>
  <li>分散アプリケーションの例題の1つとして画面配信システムTreeVNCをAlice上で実装する中で、NATを介した別ネットワークや別トポロジー上のノードとの接続が必要であることがわかった</li>
  <li>本研究では、分散トポロジーの管理を行うMeta ComputationであるTopology Managerに対し、別ネットワーク・別トポロジーでのノード間接続を実現するための拡張設計を行う</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="section-3">目次</h1>
<ul>
  <li>Aliceの概要
    <ul>
      <li>Code Segment / Data Segment</li>
      <li>Data Segment Manager</li>
      <li>Computation / Meta Computation</li>
      <li>Topology Manager / Topology Node</li>
    </ul>
  </li>
  <li>Alice上にTreeVNCを実装する際の課題
    <ul>
      <li>VNCとChatを連携させる課題</li>
      <li>TreeVNCにおけるNATを越えた接続の課題</li>
    </ul>
  </li>
  <li>Topology Managerの拡張設計
    <ul>
      <li>別トポロジー間の接続のための設計
        <ul>
          <li>Topology Nodeの複数対応</li>
        </ul>
      </li>
      <li>別ネットワーク間の接続のための設計</li>
    </ul>
  </li>
  <li>他言語等との比較</li>
  <li>まとめ</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="data-segment--code-segment">Data Segment と Code Segment</h1>
<ul>
  <li>Aliceではデータを <strong>Data Segment(DS)</strong> 、タスクを <strong>Code Segment(CS)</strong> という単位に分割して依存関係を記述することでプログラミングを行う。</li>
  <li>CSはInput DS(入力されるDS)とOutput DS(出力されるDS)を持つ。</li>
  <li>CSはkeyで指定されたDSが揃うと実行されるという性質を持つ。
<img src="./images/dsandcs.svg" alt="opt" width="50%" /></li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="codesegment">CodeSegmentの依存関係</h1>
<ul>
  <li>データの依存関係にないCSは並列実行される</li>
  <li>データの依存関係がある場合は Input DS が揃うと順に実行される</li>
  <li>DSはCSに専有されるためロックの記述を必要としない
<img src="./images/dsandcs2.svg" alt="opt" width="60%" /></li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="data-segment--codesegment">Data Segment と CodeSegment</h1>
<ul>
  <li>AliceはJavaで実装されており、DSはJava-Object、CSはRunnableに相当する</li>
  <li>ユーザーが記述する際には CodeSegment.class を継承することでDSを操作するためのAPIを利用して依存関係を記述することができる。</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="data-segment-manager">Data Segment Manager</h1>
<ul>
  <li>DS の集合体であるデータベースを Alice では <strong>DS Manager(DSM)</strong> と呼ぶ。  </li>
  <li>DSM 内の DS には対応する一意の String型のkey が存在し、 DSM 名と key を指定しすることで DS の保存、取得を行う。
<img src="./pictures/key.svg" alt="opt" width="50%" /></li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="data-segment-manager-1">Data Segment Manager</h1>
<ul>
  <li>Local DSM … 各ノード固有のデータベース</li>
  <li>Remote DSM … 他のノードのLocal DSMのproxy。接続しているノードの数だけ存在する。</li>
  <li>Remote DSMに書き込むと対応するノードのLocalDSMに書き込まれる
<img src="./pictures/newDSM.svg" alt="opt" width="50%" /></li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="computation--meta-computation">Computation と Meta Computation</h1>
<ul>
  <li>Aliceでは、計算の本質的な処理をComputatin、Computationとは別のレベルでそれを支える処理をMeta Computationとして分けて考える。</li>
  <li>Alice のComputationは、keyによりDSを待ち合わせ、DSが揃ったCSを並列に実行する処理</li>
  <li>Meta Computationはそれを実現している処理
    <ul>
      <li>DSの待ち合わせ</li>
      <li>分散トポロジーの構成</li>
      <li>通信の切断・再接続時の処理</li>
      <li>データの表現形式の選択</li>
    </ul>
  </li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="computation--meta-computation-1">Computation と Meta Computation</h1>
<ul>
  <li>分散環境構築などの複雑な処理をAliceがMeta Computationとして提供する</li>
  <li>プログラマは目的の処理だけ記述し通信部分などはMeta Computationを指定する</li>
  <li>シンプルで見通しの良いコードを保つ</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-managertopology-node">Topology ManagerとTopology Node</h1>
<ul>
  <li>Topology Manager
    <ul>
      <li>ノード間の接続管理やトポロジーの構成管理行うMeta Computation</li>
      <li>Static Topology ManagerとDynamic Topology Managerがある  </li>
    </ul>
  </li>
  <li>Topology Node
    <ul>
      <li>各ノード側でTopology Managerとの通信を行うMeta Computation</li>
      <li>ノードアプリケーションを記述する際にTopology Nodeをnewしておけば以降のTopology Managerとの通信やノード間の接続を行う  </li>
    </ul>
  </li>
  <li>Topology Manager/NodeもCS/DSを用いて実装されている。</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="static-topology-manager">Static Topology Manager</h1>
<ul>
  <li>プログラマがdot形式のトポロジーファイルを用意し、Topology Managerに読み込ませる</li>
  <li>トポロジーファイルにはノードの接続関係と接続する際に指定するRemote DSM名を記す</li>
  <li>Graphvizを用いればトポロジーを描くだけでトポロジーファイルが自動出力されるため構成が容易</li>
</ul>

<pre lang="dot"><code>digraph test{
	node0 −&gt; node1[label=”right”]
	node0 −&gt; node2[label=”left”]
	node1 −&gt; node2[label=”right”]
	node1 −&gt; node0[label=”left”]
	node2 −&gt; node0[label=”right”]
	node2 −&gt; node1[label=”left”]
}
</code></pre>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="static-topology-manager-1">Static Topology Manager</h1>
<ul>
  <li>ファイルを読み込んだTopology Managerを立ち上げる</li>
  <li>各Topology NodeはTopology Managerに参加表明をし接続すべきノードの情報を要求する<br />
<img src="./pictures/tree1.svg" alt="opt" width="60%" /></li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="static-topology-manager-2">Static Topology Manager</h1>
<ul>
  <li>参加表明があった順に各ノードにnodeNameを割り当て、接続するべきノードのIPアドレス/ポート番号を送る
<img src="./pictures/tree2.svg" alt="opt" width="60%" /></li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="static-topology-manager-3">Static Topology Manager</h1>
<ul>
  <li>Topology Nodeが受け取った情報をもとにRemote DSMを立ちあげ接続し合うことでオーバーレイネットワークが作られる  </li>
  <li>Topology Managerは接続情報を管理し、実際の接続はTopology Nodeが行う
<img src="./pictures/tree3.svg" alt="opt" width="60%" /></li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="dynamic-topology-manager">Dynamic Topology Manager</h1>
<ul>
  <li>参加するノード数があらかじめ決まっているとは限らない</li>
  <li>Dynamic Topology Managerがノードを参加表明順にトポロジーに組み込む</li>
  <li>現在はTree TopologyとStar Topologyに対応</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="section-4">障害発生時の対応</h1>
<ul>
  <li>KeepAliveというMeta Computationがノードの生存確認を行う</li>
  <li>Closed Event ManagerというMeta Computationは切断・再接続時に指定されたCSを実行する</li>
  <li>これらのMeta ComputationはTopology Manager内でも使用されるため、Meta Meta Computationとも言える</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="alicetreevnc">Alice上にTreeVNCを実装する際の課題</h1>
<ul>
  <li>TreeVNC
    <ul>
      <li>当研究室で開発したノードを木構造に配置して負荷分散を行う授業向け画面共有システム</li>
      <li>TightVNCを拡張して作られている</li>
    </ul>
  </li>
  <li>AliceVNC
    <ul>
      <li>Alice上に実装したTreeVNC</li>
      <li>Dinamic Topology ManagerでTree Topologyを構成</li>
    </ul>
  </li>
</ul>

<p><img src="./images/treeVNC.svg" alt="opt" width="40%" /></p>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="alicevncalicechat">課題1 - AliceVNCとAliceChatの接続</h1>
<ul>
  <li>AliceChat
    <ul>
      <li>Alice上に実装したチャット</li>
      <li>Dinamic Topology ManagerでStar Topologyを構成</li>
    </ul>
  </li>
  <li>既存のAliceVNCとAliceChatをコードの変更を抑えつつ連携させたい
    <ul>
      <li>VNC画面のスナップショットをチャットに載せる</li>
      <li>チャットの内容をVNC画面にコメントとして流す</li>
    </ul>
  </li>
  <li>別トポロジーのアプリケーションへの接続をサポートする機能が必要</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="nat">課題2 - NATを越えた接続</h1>
<ul>
  <li>TreeVNCでは学外からも画面共有ができるよう拡張したいNAT越えの要求がある</li>
  <li>ソースコードが複雜で他のコードも大きく修正しならなかったため、NAT越えの実装には至らなかった</li>
  <li>グローバルIPを持っていることを前提としたノードに直接IPを指定して直下の子になるDirect Connectionを実装し受信のみを可能にしている</li>
</ul>

<p><img src="./pictures/directConnection.svg" alt="opt" width="60%" /></p>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="treevncnat">課題2 - TreeVNCのNAT越えの欠点</h1>
<ul>
  <li>複数の別ネットワークからの接続があるとルートノードにネットワーク数分の負荷がかかる</li>
  <li>どちらもプライベートネットワークだった場合に通信できない(中継サーバのプログラムを用意しなければならない)</li>
  <li>分散アプリケーションにおけるNATを越えた通信は重要だがプログラマが実装するのは容易ではない  </li>
  <li>別ネットワークのアプリケーションへの接続をサポートする機能が必要</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager----">Topology Managerの拡張設計 -  別トポロジーへの接続</h1>
<p>以降の機能をMeta Meta Computationとして実装<br />
1. 接続を要求する側のいずれかの Node が接続先 Topology Manager(A)のIPアドレスを自身を管理するTopology Manager(B)に保存。<br />
<img src="./pictures/private1.svg" alt="opt" width="70%" /></p>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----1">Topology Managerの拡張設計 -  別トポロジーへの接続</h1>
<ol>
  <li>Topology Manager(B)はRootNode(B)にTopology Manager(A) への接続をするよう要求
<img src="./pictures/private2.svg" alt="opt" width="70%" /></li>
</ol>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----2">Topology Managerの拡張設計 -  別トポロジーへの接続</h1>
<ol>
  <li>RootNode(B) が Topology Manager(A) と接続し、接続すべきRootNode(A)の情報を取得
<img src="./pictures/private3.svg" alt="opt" width="70%" /></li>
</ol>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----3">Topology Managerの拡張設計 -  別トポロジーへの接続</h1>
<ol>
  <li>取得した情報をもとに RootNode(A) に接続<br />
<em>※①でTopology Managerに保存することでRootNodeが落ちてもトポロジーの再構成時にまた接続要求が出せる</em><br />
<img src="./pictures/private4.svg" alt="opt" width="70%" /></li>
</ol>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager">複数のTopology Managerへの対応</h1>
<ul>
  <li>この機能を実現するにはTopology Nodeが各Topology Managerに対応する複数のnodeNameを持つようにする必要がある</li>
  <li>Topology Nodeは割り当てられたnodeNameをDSとして保持してTopology Managerと通信を行うため、nodeNameの衝突を避けなければならない</li>
</ul>

<p><img src="./pictures/somehostname.svg" alt="opt" width="50%" /></p>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="local-dsm">Local DSMの切り替えによる対応</h1>
<ul>
  <li>通常のLocal DSMとは別にTopology ManagerごとのLocal DSMを作成しnodeNameを管理</li>
  <li>Tpology Manager/Nodeの働きはそのままに、指定するLocal DSMを変えるだけでTopology Managerの複数対応が可能<br />
<img src="./pictures/somehostname2.svg" alt="opt" width="50%" /></li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="key">Keyの切り替えによる対応</h1>
<ul>
  <li>DSMを管理するclassがstaticのためLocal DSMが1つしか生成できない</li>
  <li>staticを抜くにはAliceのコードを大幅に変更しなければならない</li>
  <li>nodeNameのDSを管理するkeyにManagerごとの番号を付け加えKeyによって切り替えている<br />
<img src="./pictures/somehostname3.svg" alt="opt" width="50%" /></li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----4">Topology Managerの拡張設計 -  別ネットワークへの接続</h1>
<ul>
  <li>Aliceではトポロジー管理がアプリケーションから分離しているため、Topology Managerを増やすことでトポロジーの拡張が可能</li>
  <li>各プライベートネットワーク内を管理するPrivate Topology Manager</li>
  <li>グローバルIPアドレスを持ったGlobal Topology Managerを1つ立てる</li>
  <li>TopologyNodeが複数対応できるためPrivate/Global Topology Managerに接続<br />
<img src="./pictures/overNAT.svg" alt="opt" width="50%" /></li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----5">Topology Managerの拡張設計 -  別ネットワークへの接続</h1>
<ul>
  <li>Private Topology Managerがプライベートネットワーク内で木構造を構成</li>
  <li>各RootNodeをGlobal Topology Managerが木構造に接続(森構造)</li>
  <li>1つのノードへの接続数は最大4</li>
  <li>Topology Managerの「参加表明のあったノードで木を構成」仕様は変わらない<br />
<img src="./pictures/3Dtree.svg" alt="opt" width="50%" /></li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----6">Topology Managerの拡張設計 -  別ネットワークへの接続</h1>
<p>以降の機能をMeta Meta Computationとして実装<br />
1. 接続を要求する側のいずれかのノードがGlobal Topology ManagerのIPアドレスを自身を管理するTopology ManagerのDSMに保存
<img src="./pictures/global1.svg" alt="opt" width="70%" /></p>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----7">Topology Managerの拡張設計 -  別ネットワークへの接続</h1>
<ol>
  <li>Topology ManagerはRootNodeにGlobal Topology Managerへの接続をするよう要求
<img src="./pictures/global2.svg" alt="opt" width="70%" /></li>
</ol>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----8">Topology Managerの拡張設計 -  別ネットワークへの接続</h1>
<ol>
  <li>RootNodeがGrobal Topology Managerと接続し、自身のIPアドレスを送る。Global Topology Manager が受け取ったIPアドレスがプライベートアドレスであれば、ノードに対してNATの外側IPアドレス/ポート番号を要求される。RootNode はそれに返答。
<img src="./pictures/global3.svg" alt="opt" width="70%" /></li>
</ol>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----9">Topology Managerの拡張設計 -  別ネットワークへの接続</h1>
<ol>
  <li>UDP hole punching 行われ、Network1のRootNodeとNetwork2のRootNodeが接続される
<img src="./pictures/global4.svg" alt="opt" width="70%" /></li>
</ol>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----10">Topology Managerの拡張設計 -  別ネットワークへの接続</h1>
<ol>
  <li>もし接続が確立されなければ、Global Topology Manager がデータ中継用の CSを用意しデータを中継する
<img src="./pictures/global5.svg" alt="opt" width="70%" /></li>
</ol>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="alice1---erlang">Aliceと他言語等との比較(1) - Erlang</h1>
<p>Ericssonが開発した並列指向関数型プログラミング言語</p>

<ul>
  <li>共通点
    <ul>
      <li>タスクをプロセスと呼ばれるメモリを共有しないスレッドに分割</li>
      <li>共有メモリにアクセスするためのメモリロックの仕組みを必要としない</li>
    </ul>
  </li>
  <li>相違点
    <ul>
      <li>Topologyの構成等はユーザーが書く</li>
      <li>NAT越えをサポートするライブラリがありプログラマはそれを組み合わせてNAT越えを行う</li>
    </ul>
  </li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="alice2---akka">Aliceと他言語等との比較(2) - Akka</h1>
<p>アクターモデルのScalaおよびJava向けの並列および分散処理フレームワーク</p>

<ul>
  <li>共通点
    <ul>
      <li>通信部分等を子アクターで分離し階層化</li>
    </ul>
  </li>
  <li>相違点
    <ul>
      <li>Topologyの構成等はユーザーが書く</li>
      <li>外側IPアドレス/ポート番号を指定できるが、ポートマッピングはユーザーが記述しなければならない</li>
    </ul>
  </li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="section-5">まとめ</h1>
<ul>
  <li>別トポロジー・別ネットワークのアプリケーションとの接続を可能にするため、分散トポロジーの構成・管理をするMeta ComputationであるTopology Manager/Nodeの拡張設計を行った。</li>
  <li>DSM の切り替えにより Topology Node を複数の Topology Manager に対応させ、Meta Meta Computation として NAT 越えの機能を追加することで、Topology Manager/Node のコードを大きく変えず自由度の高い通信が可能になると期待される。</li>
  <li>しかし、それを実現するにはAliceのDSMを管理するclassのstaticを取り除かなければならず、それは容易ではなかったためAlice自体の再設計を行ったうえで実装を行いたい。</li>
</ul>

<style type="text/css">
<!--
*{
	font:nomal 100% 'PT Sans';
}

ul > li{
	list-style-type:disc;
}

.slide h1{
	text-align:left;
	color:#777777;
	font:bold 40px/1.13 'PT Sans', sans-serif;
	margin-bottom: 50px;
}

div#slide1 h1{
	text-align:left;
	color:#777777;
	font:bold 60px 'PT Sans', sans-serif;
	margin-bottom: 50px;
}

pre > code{
	font-family:'Droid Sans Mono', 'Courier New', monospace;
}

img[alt="opt"]{
	display: block;
	margin-left: auto;
	margin-right: auto;
}

img[alt="right"]{
	margin-right: 0;
}

table {
	margin-left: auto;
	margin-right: auto;
}

th {
    font-size: 120%;
}
-->
</style>

<!-- === end markdown block === -->
</div>


</div><!-- presentation -->
</body>
</html>