changeset 70:0b1a059c49fa

fix
author kono
date Thu, 13 Feb 2014 12:08:24 +0900
parents 5e39ab004ae0
children 98a55a935619
files slides/master.html
diffstat 1 files changed, 65 insertions(+), 209 deletions(-) [+]
line wrap: on
line diff
--- a/slides/master.html	Thu Feb 13 11:17:15 2014 +0900
+++ b/slides/master.html	Thu Feb 13 12:08:24 2014 +0900
@@ -38,9 +38,7 @@
 				slides below. -->
 
 			<article>
-				<h1>
-					関数型言語 Haskell による並列データベースの実装
-				</h1>
+				<h1> 関数型言語 Haskell による並列データベースの実装 </h1>
 				<p>
 					Daichi TOMA
 					<br>
@@ -48,141 +46,69 @@
 				</p>
 			</article>
 
-			<article>
-				<h3>
-          研究概要
-				</h3>
-        <p>
-        Haskell を用いて並列データベースを実装した
-        </p>
-        <p>
-        読み込みに関して 12 コアで実行した場合、10.37 倍 という性能向上率が確認できた
-        </p>
-        <p>
-        また、Web 掲示板サービスを開発し、Java と比較して読み込みで 3.25 倍、書き込みで 3.78 倍の性能差が確認できた
-        </p>
-			</article>
-
-			<article>
-				<h3>
-          研究背景
-				</h3>
-        <p>
-        Web サービスの脆弱性を悪用されると多大な被害がでる
-        </p>
-        <p>
-        Haskell は型検査でバッファオーバーフローや、クロスサイトスクリプティング、SQL インジェクションを防げる
-        </p>
-        <p>
-        Haskell を用いることで信頼性の高いデータベースとWebサービスを開発できる
-        </p>
-			</article>
+<article>
+        <h3> 研究概要 </h3>
+        <p> Haskell を用いて信頼性の高い並列データベースを実装した </p>
+        <p> Haskell は rseq により並列実行を指示し、STMにより共有データを実現する</p>
+        <p> Haskellの並列処理は、最新のコンパイラで性能がでることがわかった</p>
+        <p> 読み込みに関して 12 コアで実行した場合、10.37 倍 という性能向上率が確認できた </p>
+        <p> Web 掲示板サービスを開発し、Java と比較して読み込みで 3.25 倍、書き込みで 3.78 倍の性能差が確認できた </p>
+        <p> Network および IO の並列性能はあまり出てないことがわかった</p>
+</article>
 
-			<article>
-				<h3>
-          型による区別
-				</h3>
-        <p>
-        Haskellは、全てに型がある
-        </p>
-        <p>
-        文字列やHTMLを型として定義し、別の型として扱うことができる
-        </p>
-        <p>
-        入力として受け取った文字列が、HTML型に自動変換されたりしない<br>
-         - &gt; クロスサイトスクリプティングが防げる
-        </p>
-			</article>
+<article>
+        <h3> Haskellによる信頼性の高いサービスの構築</h3>
+        <p> Web サービスの脆弱性を悪用されると多大な被害がでる </p>
+        <p> 脆弱性の大半はBuffer Overflowや、Cross site scripting、SQL injection </p>
+        <p> これらは型エラー。Haskell は、これらをコンパイル時にチェック</p>
+        <p> 入力として受け取った文字列が、HTML型に実行時に自動変換されたりしない<br>
+         ⇒ クロスサイトスクリプティングが防げる </p>
+</article>
 
-			<article>
-				<h3>
-          実行時型エラーがない
-				</h3>
-        <p>
-        Haskellは、実行時に型に起因するエラーが起きない
-        </p>
-        <p>
-        [1,2,3]のリストに文字'a'を追加することや、['a','b','c']のリストに 1 を追加することはできない
-        </p>
-        <p>
-        コンパイル時にエラーになる
-        </p>
+<article>
+	<h3> Haskellの型検査の例(list) </h3>
+      :
+     / \
+    1   []
 <pre>
-abc = 'a' : [1,2,3] -- error
-cde =  1  : ['a','b','c'] -- error
+let a = 0 : [1,2,3] -- [0,1,2,3]
+let b = 'a' : [1,2,3] -- error
+let c =  1  : ['a','b','c'] -- error
 </pre>
-        <p>
-        Haskell 自体が型の不整合を防ぐ
-        </p>
-			</article>
+</article>
 
-			<article>
-				<h3>
-          型推論
-				</h3>
-        <p>
-        型エラーを検出するために全ての式や関数に型を書いていくのは大変
-        </p>
-        <p>
-        Haskell は 型を推論してくれる
-        </p>
-			</article>
-
-			<article>
-				<h3>
-          型推論
-				</h3>
-        <p>
-        前提として関数に以下のような型が定義されている
-        </p>
+<article>
+	<h3> 型推論 </h3>
+        <p> 前提として関数に以下のような型が定義されているとする </p>
 <pre>
 getNode :: Node -&gt; Path -&gt; Node
 elems :: Map k a -&gt; [a]
 children :: Node -&gt; Map Int Node
 </pre>
-        <p>
-        新しくgetChildrenという関数を定義するとき型を自動で導出できる
-        </p>
+        <p> 新しくgetChildrenという関数を定義する</p>
 <pre>
 getChildren node path = elems (children (getNode node path))
 </pre>
-        <p>
-        Haskell が推論した型を確認する
-        </p>
+        <p> 型をHaskellが自動で導出する </p>
 <pre>
 *Jungle&gt; :type getChildren
 getChildren :: Node -&gt; Path -&gt; [Node]
 </pre>
 			</article>
 
-			<article>
-				<h3>
-          実用的なデータベースの開発
-				</h3>
-        <p>
-        現在、CPU はマルチコア化がすすんでいる
-        </p>
-        <p>
-        実用的なデータベースとするためにはマルチコアに対応させる必要性がある
-        </p>
-        <p>
-        並列に処理できればマルチコアで性能が出る
-        </p>
-			</article>
+<article>
+	<h3> 実用的なデータベースには並列実行が必須 </h3>
+        <p> 現在、CPU はマルチコア化がすすんでいる </p>
+        <p> 実用的なデータベースとするためにはマルチコアに対応させる必要性がある </p>
+        <p> 並列に処理できればマルチコアで性能が出る </p>
+        <p> Haskell は Eval モナド(rpar)といったモナドで並列実行の機能を提供</p>
+        <p> モナドは、Haskellでメタ計算を提供する構文あるいはAPI</p>
+        <p> システムコールのようなものと考えてよい</p>
+        <p> モナドの例:IOモナド、エラーモナド、STMモナド </p>
+</article>
 
-			<article>
-				<h3>
-          Haskell での並列実行
-				</h3>
-        <p>
-        Eval モナドといったモナドで並列実行の機能を提供
-        </p>
-        <p>
-        Haskell では様々な目的にモナドを使う<br>
-        I/O 処理を行うための IO モナドはよく使われる
-        </p>
-			</article>
-
+          Haskell の並列処理
+rparの例
 			<article>
 				<h3>
           Haskell の遅延評価
@@ -248,57 +174,19 @@
         </div>
 			</article>
 
-			<article>
-				<h3>
-          非破壊的木構造 - ルートノード
-				</h3>
-        <p>
-        非破壊的木構造の並列実行のネックとなるものがルートノード
-        </p>
-        <p>
-        ルートノードは、どの木構造が最新なのかを表す情報
-        </p>
-        <p>
-        スレッド間で共有する状態を持つため、並列度を高めるにはルートノードの設計が重要
-        </p>
-        <div align="center">
-          <img src="images/rootnode.png" width="350px">
-        </div>
-			</article>
+<article>
+	<h3> Haskell でのRoot Node の管理 </h3>
 
-			<article>
-				<h3>
-          Haskell でのルートノードの管理
-				</h3>
-        <p>
-        ソフトウェア・トランザクショナル・メモリ (STM) を使う
-        </p>
-        <p>
-        STM は、ノンブロッキングで共有データを扱える
-        </p>
-        <p>
-        共有データの変更は以下の様に行われる
-        </p>
+        <p> Root Node は最新のNode →  状態を持つ</p>
+        <p> 共有された状態を作るには Software Transactional Memory (STM) を使う </p>
+        <p> STM は、ノンブロッキングで共有データを扱える </p>
+        <p> 共有データの変更は以下の様に行われる </p>
         <ul>
           <li>他から変更がなければそのまま適用
           <li>変更している間に、他から変更されれば変更処理をやり直し
         </ul>
-			</article>
+</article>
 
-			<article>
-				<h3>
-          STM のメリット
-				</h3>
-        <p>
-        共有データにアクセスする時に待ちがない
-        </p>
-        <p>
-        読み込みは他の変更を気にせず並列に行える
-        </p>
-        <p>
-        高速に読み込める
-        </p>
-			</article>
 
 			<article>
 				<h3>
@@ -339,22 +227,6 @@
         </div>
 			</article>
 
-			<article>
-				<h3>
-          Jungle に新しい木を作成
-				</h3>
-<pre>
-data Tree = Tree (TVar Node) String
-</pre>
-        <p>
-        Tree は最新のルートノードの情報と木の名前を持っている
-        </p>
-        <br>
-        <br>
-        <div align="center">
-          <img src="images/get_root_node.png" width="500px">
-        </div>
-			</article>
 
 			<article>
 				<h3>
@@ -371,42 +243,26 @@
         </p>
 			</article>
 
-			<article>
-				<h3>
-          ノード
-				</h3>
-        <p>
-        Jungle で最も基本的な構成要素
-        </p>
-        <p>
-        Jungle の参照や変更の関数は全てノードに対して行う
-        </p>
-<pre>
-data Node = Node (Map Int Node) (Map String ByteString)
-</pre>
+<article>
+        <h3> ノード </h3>
+        <p> Node はChildren(Node)とattributesを持つ </p>
+        <p> Jungle の参照や変更の関数は全てノードに対して行う </p>
         <div align="center">
           <img src="images/node_component.png" width="500px">
         </div>
-			</article>
+</article>
 
-			<article>
-				<h3>
-          ノードを編集し、木の最新のルートノードを更新する
-				</h3>
-        <p>
-        updateRootNodeやupdateRootNodeWithで更新できる
-        </p>
+<article>
+	<h3> ノードを編集し、木の最新のルートノードを更新する </h3>
+        <p> updateRootNodeやupdateRootNodeWithで更新できる </p>
+        <p> 内部でSTMを使っているのでIOモナドを返す</p>
 <pre>
 updateRootNode :: Jungle -&gt; String -&gt; Node -&gt; IO ()
 updateRootNodeWith :: (Node -&gt; Node) -&gt; Jungle -&gt; String -&gt; IO ()
 </pre>
-        <p>
-        updateRootNodeには編集したNodeを渡すことで木の最新のルートノードを更新できる
-        </p>
-        <p>
-        updateRootNodeWithにはNodeを編集する関数を渡すことで木の最新のルートノードを更新できる
-        </p>
-			</article>
+        <p> updateRootNodeには編集したNodeを渡すことで木の最新のルートノードを更新できる </p>
+        <p> updateRootNodeWithにはNodeを編集する関数を渡すことで木の最新のルートノードを更新できる </p>
+</article>
 
 			<article>
 				<h3>
@@ -456,13 +312,13 @@
         現在の GHC の安定版 7.6.3 は並列時にIOマネージャーがスケールしないという問題がある
         </p>
         <p>
-        リリース候補版である 7.8 を用いる
+        リリース候補版である 7.8 を用いることにより、よりよい性能を得ることができた
         </p>
 			</article>
 
 			<article>
 				<h3>
-          親和性機能を利用する
+          親和性機能(affinity)を利用する
 				</h3>
         <p>
         親和性機能とは OS スレッドをCPUコアに固定する機能