view presen/sample.html @ 30:3f7064e09310

change tree figure
author Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
date Sun, 29 May 2016 18:10:35 +0900
parents 296df25feb76
children b729ee3a8f72
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-29 18:07:15 +0900 with Markdown engine kramdown (1.5.0)
                  using options {}
  -->
<p>Topology Managerをもっとかっこよくアピール
前半もっとクリーンナップ</p>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="section">目次</h1>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="section-1">研究目的(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-2">研究目的(2/3)</h1>
<ul>
  <li>Aliceでは、処理をComputationとMetaComputationに階層化し、コアな仕様と複雑な例外処理に分離する。//コアな仕様の例</li>
  <li>分散環境構築などの複雑な処理はAliceがMeta Computationとして提供する</li>
  <li>仕様を大きく変更することなくプログラムの挙動が変えられる//分散処理とかの拡張なら指定だけで良い</li>
  <li>変更前の信頼性を保ったまま拡張可能にする</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="section-3">研究目的(3/3)</h1>
<ul>
  <li>Aliceでは分散トポロジー管理の Meta Computation である Topology Manager</li>
  <li>本研究では、 Topology Managerに NAT越えを実現するための設計を行う</li>
  <li>そしてその設計が Alice アプリケーション同士の接続も可能にすることを示す
↑逆?
Topologyの課題をかく</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="50%" /></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="./images/KeyDS.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="./images/remote_datasegment.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を用いて実装されている。
<img src="./pictures/topologynode.svg" alt="right" width="40%" />//変更</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>
<p># Static Topology Manager
* ファイルを読み込んだTopology Managerを立ち上げる
* 各Topology NodeはTopology Managerに参加表明をし接続すべきノードの情報を要求する<br />
<img src="./pictures/tree1.svg" alt="opt" width="70%" /></p>


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


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="static-topology-manager-2">Static Topology Manager</h1>
<ul>
  <li>Topology Nodeが受け取った情報をもとにRemote DSMを立ちあげ接続し合うことでTree型のオーバーレイネットワーク作られる<br />
<img src="./pictures/tree3.svg" alt="opt" width="70%" /></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>一定時間内にノードから応答がない場合、そのノードとの接続を切断し、再接続すべきノードの情報をTopologyManagerに要求する</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="section-5">障害発生時の対応</h1>
<ul>
  <li>Closed Event ManagerというMeta Computationは切断・再接続時に指定されたCSを実行する</li>
  <li>再接続時に特定の処理を行いたい場合はCSを書いてClosed Event Managerに登録する</li>
  <li>これらのMeta ComputationはTopology Manager内でも使用されるため、Meta Meta Computationとも言える</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="treevnc">TreeVNC</h1>
<ul>
  <li>当研究室で開発したノードを木構造に配置して負荷分散を行う授業向け画面共有システム</li>
  <li>TightVNCを拡張して作られている
<img src="./images/treeVNC.svg" alt="right" width="40%" /></li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="alicevncalicechat">AliceVNCとAliceChatの接続</h1>
<ul>
  <li>AliceVNC:Alice上に実装したTreeVNC(Tree Topology)</li>
  <li>AliceChat:Alice上に実装したチャット(Star Topology)</li>
  <li>既存のAliceVNCとAliceChatをコードの変更を抑えつつ連携させたい
    <ul>
      <li>画面のスナップショットをチャットに載せる</li>
      <li>チャットの内容を画面にコメントとして流す</li>
    </ul>
  </li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="treevncnat">TreeVNCのNAT越え</h1>
<ul>
  <li>TreeVNCを学外からも画面共有ができるよう拡張したい</li>
  <li>ソースコードが膨大で複雜であったためNAT越えの実装には至らなかった</li>
  <li>グローバルIPを持っていることを前提としたノードに直接IPを指定して直下の子になるDirect Connectionを実装
<img src="./images/directConnection.svg" alt="right" width="40%" /></li>
</ul>


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


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="alice">Aliceの課題まとめ</h1>
<ul>
  <li>別トポロジー、別ネットワークのアプリケーションに接続したい</li>
  <li>コード変更を抑えつつトポロジーの拡張をサポートする機能がTopology Managerに必要</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager----">Topology Managerの拡張設計 -  別トポロジーへの接続</h1>
<ol>
  <li>接続を要求する側のいずれかの Node が接続先 Topology Manager(A)のIPアドレスを自身を管理するTopology Manager(B)のDSMに保存。<br />
<em>ここでTopology Managerに保存することでRootNodeが落ちてもトポロジーの再構成時にまた接続要求が出せる</em><br />
<img src="./pictures/private1.svg" alt="opt" width="70%" />//変更</li>
</ol>


</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) と接 続し、自身の接続先ノードの情報を取得
<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 />
<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 Managerは各ノードにnodeNameを割り当て管理</li>
  <li>Topology Nodeは割り当てられたnodeNameをDSとして保持しTopology Managerと通信</li>
  <li>Topology Nodeが各Topology Managerに対応する複数のnodeNameを持つようにする<br />
<img src="./pictures/somehostname.svg" alt="opt" width="40%" />//変更</li>
</ul>


</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のコードを大きく変えずにTopology Managerの複数対応が可能<br />
<img src="./pictures/somehostname2.svg" alt="right" width="40%" /></li>
</ul>


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


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----4">Topology Managerの拡張設計 -  別ネットワークへの接続</h1>
<ul>
  <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="40%" /></li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----5">Topology Managerの拡張設計 -  別ネットワークへの接続</h1>
<ul>
  <li>各プライベートネットワークのRootNodeをGlobal Topology Managerが木構造に接続</li>
  <li>Global Topology Manager foresutoに木を構成</li>
  <li>1つのノードへの接続数は最大4
<img src="./pictures/3Dtree.svg" alt="right" width="40%" />//変更</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----6">Topology Managerの拡張設計 -  別ネットワークへの接続</h1>
<ul>
  <li>Topology Managerの「参加表明のあったノードで木を構成」仕様は変わらない</li>
  <li>NAT越えはTopology ManagerのMeta Meta Computationと言える  </li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----7">Topology Managerの拡張設計 -  別ネットワークへの接続</h1>
<ol>
  <li>接続を要求する側のいずれかのノードがGlobal Topology ManagerのIPアドレスを自身を管理するTopology ManagerのDSMに保存
<img src="./pictures/global1.svg" alt="opt" width="40%" /></li>
</ol>


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


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="topology-manager-----9">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="40%" /></li>
</ol>


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


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


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="alice1---erlang">Aliceと他言語等との比較(1) - Erlang</h1>
<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>
<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-6">まとめ</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 を取り除かなければならず、それは容易ではなかった。</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="section-7">今後の課題</h1>
<ul>
  <li>DSMのレイヤー分け
    <ul>
      <li>staticのないコードで再設計し、Local DSMをメタレイヤー、トポロジーごとのレイヤーなどに分ける</li>
    </ul>
  </li>
  <li>APIの再設計
    <ul>
      <li>put/updateに対しtake/peekがcreate()・setKey()の操作はわかりにくい</li>
    </ul>
  </li>
  <li>DSの型情報のマネジメント
    <ul>
      <li>型情報がないのでpeek/takeする際にわかりにくい</li>
    </ul>
  </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>