SlideShare a Scribd company logo
1 of 67
TechTalk:
Yesod を支える技術
     石井 大海
自己紹介
• 石井 大海
• 早稲田大学基幹理工学部
 数学科三年(四月より)

• Twitter Crawler などを書いている
• Haskell Lover
Haskell Lover
• Haskell :純粋関数型言語
 • 型クラスによる強力な抽象化能力
 • 純粋性に由来するモジュラリティ
• 今日の発表は Haskell 製Web Framework
 Yesod について
Haskell のWeb開発

• 既にたなかさんが発表済みでは?
• Yesod は Haskell の技術の結晶
 • Yesod から Haskell の “今” を知ろう!
Yesod の特徴
Yesod の特徴
•   セキュア、XSS/SQL injection に強い
Yesod の特徴
•   セキュア、XSS/SQL injection に強い

•   抽象度の高いデータベースアクセス
Yesod の特徴
•   セキュア、XSS/SQL injection に強い

•   抽象度の高いデータベースアクセス

•   型付きURL
Yesod の特徴
•   セキュア、XSS/SQL injection に強い

•   抽象度の高いデータベースアクセス

•   型付きURL

•   柔軟なテンプレートシステム
Yesod の特徴
•   セキュア、XSS/SQL injection に強い

•   抽象度の高いデータベースアクセス

•   型付きURL

•   柔軟なテンプレートシステム

•   継続ビルド
Yesod の特徴
•   セキュア、XSS/SQL injection に強い

•   抽象度の高いデータベースアクセス

•   型付きURL

•   柔軟なテンプレートシステム

•   継続ビルド

•   高速
Yesod の特徴
•   セキュア、XSS/SQL injection に強い

•   抽象度の高いデータベースアクセス

•   型付きURL

•   柔軟なテンプレートシステム

•   継続ビルド

•   高速

•   柔軟なバックエンド(Standalone、CGI、FCGI)
XSS / SQL injection に強い
XSS / SQL injection に強い

•   型による区別
XSS / SQL injection に強い

•   型による区別

    •   String, Text: 文字列型を埋め込む際は必ずエス
        ケープされる
XSS / SQL injection に強い

•   型による区別

    •   String, Text: 文字列型を埋め込む際は必ずエス
        ケープされる

    •   生HTMLを埋め込むには手動で Html 型に変
        換してやる必要がある
XSS / SQL injection に強い

•   型による区別

    •   String, Text: 文字列型を埋め込む際は必ずエス
        ケープされる

    •   生HTMLを埋め込むには手動で Html 型に変
        換してやる必要がある

    •   漏れにくい、何処で漏れているか判りやすい
SQL injection に強い
• 抽象度の高いレイヤによって生の部分
 は隠

• そもそも non-relational な使い方を前提
 としているので低レベルを叩く必要性
 が殆んどない

 • 一応用意されてはいる
抽象度の高いDBアクセス
•   使用出来るバックエンド

    •   PostgreSQL, Sqlite3, MongoDB
    •   MySQL, CouchDB も試験的に使用可能

•   殆んど共通のAPIを利用可能

    •   non-relational なモデルを前提としている

    •   型クラスによる高度な抽象化
抽象度の高いDBアクセス
class PersistStore b m where
  insert :: PersistEntity val => val → b m (Key b val)
  insertKey :: PersistEntity val => Key b val → val → b m ()
  repsert :: PersistEntity val => Key b val → val → b m ()
  replace :: PersistEntity val => Key b val → val → b m ()
  delete :: PersistEntity val => Key b val → b m ()
  get :: PersistEntity val => Key b val → b m (Maybe val)



   • DBバックエンドの型クラス。
   • 函数の意味を型が雄弁に物語っている
抽象度の高いDBアクセス
•   データベースに格納出来る値のクラス

•   関連型の機能を使っている

    •    型クラスに付随する函数のようなもの

    •    識別子やバックエンド、フィールドを表現する型など

class PersistEntity val where
    data EntityField val :: * → *
    type PersistEntityBackend val :: ((* → *) → * → *)
    data Unique val :: ((* → *) → * → *) → *

        persistFieldDef :: EntityField val typ → FieldDef
        entityDef :: val → EntityDef
        toPersistFields :: val → [SomePersistField]
        fromPersistValues :: [PersistValue] → Either T.Text val
全部記述するの?


  User
      ident UserName
      password Text
      salt     Text Maybe
      UniqueUser ident
  Email
      email Text
      user UserId Maybe
      verkey Text Maybe
      UniqueEmail email
全部記述するの?
•   コンパイル時に自動生成!




           User
               ident UserName
               password Text
               salt     Text Maybe
               UniqueUser ident
           Email
               email Text
               user UserId Maybe
               verkey Text Maybe
               UniqueEmail email
全部記述するの?
•   コンパイル時に自動生成!

    •   Template Haskell / Quasi Quote の威力



                   User
                       ident UserName
                       password Text
                       salt     Text Maybe
                       UniqueUser ident
                   Email
                       email Text
                       user UserId Maybe
                       verkey Text Maybe
                       UniqueEmail email
全部記述するの?
•   コンパイル時に自動生成!

    •   Template Haskell / Quasi Quote の威力

        •   Haskell のコンパイルタイムプログラムの手法・リーダマクロ

                   User
                       ident UserName
                       password Text
                       salt     Text Maybe
                       UniqueUser ident
                   Email
                       email Text
                       user UserId Maybe
                       verkey Text Maybe
                       UniqueEmail email
全部記述するの?
•   コンパイル時に自動生成!

    •   Template Haskell / Quasi Quote の威力

        •   Haskell のコンパイルタイムプログラムの手法・リーダマクロ

                   User
                       ident UserName
                       password Text
                       salt     Text Maybe
                       UniqueUser ident
                   Email
                       email Text
                       user UserId Maybe
                       verkey Text Maybe
                       UniqueEmail email


• 一意識別子やクェリの種類(Eq, Lt, Gt)なども指定
全部記述するの?
•   コンパイル時に自動生成!

    •   Template Haskell / Quasi Quote の威力

        •   Haskell のコンパイルタイムプログラムの手法・リーダマクロ

                   User
                       ident UserName
                       password Text
                       salt     Text Maybe
                       UniqueUser ident
                   Email
                       email Text
                       user UserId Maybe
                       verkey Text Maybe
                       UniqueEmail email


• 一意識別子やクェリの種類(Eq, Lt, Gt)なども指定
• これがおよそ300行程度(!!)に展開される
型付きURL
•   関連型・Template Haskell の利用例。

•   リンク切れや不正リンクを型レベルで防止!
    /static StaticR Static getStatic
    /auth AuthR Auth getAuth
    /favicon.ico FaviconR GET
    /robots.txt RobotsR GET

    /repo/#String/tree/*ObjPiece    TreeR GET
    /repo/#String/blob/*ObjPiece    BlobR GET
    /repo/#String/commits/*ObjPiece CommitsR GET


    • Method も指定可能(REST APIが作りやすい)
    • リンク用の関連型も自動生成
    • あとは各routeに対する処理函数を書くだけ
    • 静的ファイルへのリンク函数も生成してくれる
処理函数
    getTreeR :: String ! ObjPiece ! Handler RepHtml
    getTreeR repon op@(ObjPiece com xs) =
     withRepoObj repon op $ git repo obj ! do
      unless (isTree obj) $ notFound
      let src    = getReadmeFromGitObj obj
          readme = writeHtml defaultWriterOptions $
                     readMarkdown defaultParserState <$> src
      entries ← liftIO $ getGitTree git repo
      repoLayout repon op $ do
        setTitle $ fromString $ repon ++ " - Gitolist"
        $(widgetFile "tree")



•   レスポンスの種類を型レベルで限定

•   外部テンプレート群からソースをコンパイ
    ル時生成

•   IO処理なども(エラー処理込みで)行える
テンプレートシステム
• Shakespeare Template
 • Hamlet / Cassius / Lucius / Julius /
    CoffeeScript などなど

  • 型安全かつ効率的な Template Language
   • 簡単な式の埋め込み、URLと
      Widget、文字列などの区別
テンプレート
    <ul>
      $forall ent <- entries
         $if isRegularFile ent
           <li><a href=@{BlobR repon (mkP ent)}>#{fileName ent}
         $elseif isDirectory ent
           <li><a href=@{TreeR repon (mkP ent)}>#{fileName ent}
         $else
           <li>#{fileName ent}

    $maybe rm <- readme
      <h3>
        README
      <article>
        #{rm}


•    HTML の終了タグをomitした形

    •   インデントで親子関係

•    @{..}で型付URL、#{..}で文字やHtmlの埋め込み
補足
• Html型:blaze-html ライブラリ由来の型
 • 効率的な文字列処理ライブラリ
 • 先程の例ではMarkdownを自動で整形
  して表示していたりする(!!!)

• CSS や JSのテンプレートと合わせて巧
 いことやってくれる
継続ビルド
継続ビルド

• コンパイラ言語でWeb開発
継続ビルド

• コンパイラ言語でWeb開発
 • 書き換える度に recompile は面倒
継続ビルド

• コンパイラ言語でWeb開発
 • 書き換える度に recompile は面倒
 • Yesod なら自動再コンパイル!
継続ビルド

• コンパイラ言語でWeb開発
 • 書き換える度に recompile は面倒
 • Yesod なら自動再コンパイル!
•   コードやテンプレートの書き換えを自動感知
継続ビルド
継続ビルド

• GHC API を利用
継続ビルド

• GHC API を利用
 • ……していた。
継続ビルド

• GHC API を利用
 • ……していた。
 • 現在はファイルを監視して、外部コマ
  ンドを呼び出し再コンパイルしている
悔しいのでGHC API
悔しいのでGHC API
•   GHC (Haskell のコンパイラ) の機能を埋め
    込める
悔しいのでGHC API
•   GHC (Haskell のコンパイラ) の機能を埋め
    込める

    •   通常 hint と云うラッパを挟んで使用
悔しいのでGHC API
•   GHC (Haskell のコンパイラ) の機能を埋め
    込める

    •   通常 hint と云うラッパを挟んで使用

    •   Haskelインタプリタを仕込める
悔しいのでGHC API
•   GHC (Haskell のコンパイラ) の機能を埋め
    込める

    •   通常 hint と云うラッパを挟んで使用

    •   Haskelインタプリタを仕込める

        •   プラグインなどの動的ロードができる
悔しいのでGHC API
•   GHC (Haskell のコンパイラ) の機能を埋め
    込める

    •   通常 hint と云うラッパを挟んで使用

    •   Haskelインタプリタを仕込める

        •   プラグインなどの動的ロードができる

        •   勿論型安全
高速・高効率

• What make it possible?
 • ByteString / Text
 • blaze
 • Conduit
ByteString / Text
ByteString / Text
• 「Haskell の文字列処理は遅い」
ByteString / Text
• 「Haskell の文字列処理は遅い」
 • String 型……ただの文字の「リスト」
ByteString / Text
• 「Haskell の文字列処理は遅い」
 • String 型……ただの文字の「リスト」
• (本物の)文字列型を使おう!
ByteString / Text
• 「Haskell の文字列処理は遅い」
 • String 型……ただの文字の「リスト」
• (本物の)文字列型を使おう!
 • ByteString:Byteの配列
ByteString / Text
• 「Haskell の文字列処理は遅い」
 • String 型……ただの文字の「リスト」
• (本物の)文字列型を使おう!
 • ByteString:Byteの配列
 • Text:Unicode 対応版。BSより若干効
  率が下がるが String より遥かに高効率
blaze
• blaze-builder
 • ByteString 合成用のライブラリ。
  差分リストを用いて効率を上げてい
  る、らしい。

 • Text にも類似の機能がある。
• blaze-html が元々の発祥だった。
benchmark
• 10000 個の文字列片を連結
     String


                                              binary
 ByteString                                   blaze


      Text


              0ms   4ms   8ms   12ms   16ms
Conduit
• 遅延I / Oに代わる Functional な IO 手法
 • Source:入力源
 • Conduit:入力を加工するパイプ
 • Sink:出力先
 • ストリーム処理のような形になる。
Conduit
• ResourceT
 • リソースの解放処理を担当するモナド
 • lifted-base を利用し例外安全
   • 先進的な例外ライブラリ。詳細は
   たなかさんの発表資料を参照。
Conduit
•   Iteratee パターンに対する代替案

    •   例外処理が超面倒

    •   入力源を引き回せない

    •   Iteratee では出力先の資源を割り当てられ
        ないと云う問題があった

        •   Push から Pull 型へ。モナドの種類も制限
Conduit


• Conduit とは結局何か?
 • 入力と出力、中間処理の抽象化!
柔軟なバックエンド
•   Yesod アプリは……

    •   Standalone なサーバ

        •   Warp, Snap, ...
    •   CGI
    •   FastCGI
    •   (開発用継続ビルドサーバ)

•   などなど様々な形で動かせる。
柔軟なバックエンド
• WAI: Web Application Interface
 • ウェブアプリを抽象化するインター
     フェース。

 • Ruby の rack、Python の WSGI に相当
 •   type Application = Request → ResourceT IO Response
     type Middleware = Application → Application
     •   一目瞭然!

     •   Conduit のお陰でこの様な抽象化が可能に。
バックエンド

• Warp:爆速HTTPサーバ
• Snap:ミニマルなウェブフレームワーク
• CGI, Fast-CGI:普通のサーバ上でも動く
• 開発用サーバ:自動コンパイルとかの奴
Benchmark
• Pong benchmark (Yesod公式より)
 • Higher is Faster
       90000

       67500

       45000

       22500

             0
   goliath       tornado   php         winstone
   node          snap      happstack   warp+yesod
   warp
結論
• Web アプリ向き技術が Haskell には沢山
• Web アプリが Haskell の技術を必要とし
  ているとも云える

• Haskell はライブラリも言語機能もアツ
  い!

• Write Your Web App by Haskell!
Any Questions?
御清聴
ありがとうございました。

More Related Content

What's hot

SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews, Inc.
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すTakaya Saeki
 
Scalaでプログラムを作りました
Scalaでプログラムを作りましたScalaでプログラムを作りました
Scalaでプログラムを作りましたTomoharu ASAMI
 
Sbtのマルチプロジェクトはいいぞ
SbtのマルチプロジェクトはいいぞSbtのマルチプロジェクトはいいぞ
SbtのマルチプロジェクトはいいぞYoshitaka Fujii
 
Closure Compiler Updates for ES6
Closure Compiler Updates for ES6Closure Compiler Updates for ES6
Closure Compiler Updates for ES6Teppei Sato
 
SQLによるDynamoDBの操作
SQLによるDynamoDBの操作SQLによるDynamoDBの操作
SQLによるDynamoDBの操作Sugawara Genki
 
Build Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.jsBuild Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.jsmganeko
 
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略Teppei Sato
 
Scala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jsScala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jstakezoe
 
AWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguroAWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguroKenta Suzuki
 
081108huge_data.ppt
081108huge_data.ppt081108huge_data.ppt
081108huge_data.pptNaoya Ito
 
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知るPHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知るMasashi Shinbara
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテストYoichiro Sakurai
 
Scala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaScala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaKazuhiro Sera
 
Service worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたちService worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたちKinuko Yasuda
 
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)Eugene Yokota
 
Jenkinsとhadoopを利用した継続的データ解析環境の構築
Jenkinsとhadoopを利用した継続的データ解析環境の構築Jenkinsとhadoopを利用した継続的データ解析環境の構築
Jenkinsとhadoopを利用した継続的データ解析環境の構築Kenta Suzuki
 
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12Ryuji Yamashita
 
PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編
PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編
PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編Yoshihiro Ohsuka
 

What's hot (20)

SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
 
Scalaでプログラムを作りました
Scalaでプログラムを作りましたScalaでプログラムを作りました
Scalaでプログラムを作りました
 
Sbtのマルチプロジェクトはいいぞ
SbtのマルチプロジェクトはいいぞSbtのマルチプロジェクトはいいぞ
Sbtのマルチプロジェクトはいいぞ
 
Closure Compiler Updates for ES6
Closure Compiler Updates for ES6Closure Compiler Updates for ES6
Closure Compiler Updates for ES6
 
SQLによるDynamoDBの操作
SQLによるDynamoDBの操作SQLによるDynamoDBの操作
SQLによるDynamoDBの操作
 
Build Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.jsBuild Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.js
 
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
 
Scala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jsScala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.js
 
AWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguroAWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguro
 
081108huge_data.ppt
081108huge_data.ppt081108huge_data.ppt
081108huge_data.ppt
 
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知るPHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知る
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテスト
 
Scala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaScala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscala
 
Service worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたちService worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたち
 
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
 
200k/sec
200k/sec200k/sec
200k/sec
 
Jenkinsとhadoopを利用した継続的データ解析環境の構築
Jenkinsとhadoopを利用した継続的データ解析環境の構築Jenkinsとhadoopを利用した継続的データ解析環境の構築
Jenkinsとhadoopを利用した継続的データ解析環境の構築
 
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
 
PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編
PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編
PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編
 

Similar to Yesodを支える技術

現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについてNobukazu Hanada
 
Flowtype Introduction
Flowtype IntroductionFlowtype Introduction
Flowtype IntroductionTeppei Sato
 
Vim scriptとJavaとHaskell
Vim scriptとJavaとHaskellVim scriptとJavaとHaskell
Vim scriptとJavaとHaskellaiya000
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional ProgrammingTomoharu ASAMI
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and designTomoharu ASAMI
 
スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介
スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介
スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介Sotaro Kimura
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
シェル芸勉強会へようこそ
シェル芸勉強会へようこそシェル芸勉強会へようこそ
シェル芸勉強会へようこそKatsuya Tashiro
 
Msgpack cli-tech-aid-2013
Msgpack cli-tech-aid-2013Msgpack cli-tech-aid-2013
Msgpack cli-tech-aid-2013Yusuke Fujiwara
 
Scalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive ProgrammingScalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive ProgrammingTomoharu ASAMI
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3Masahiro Wakame
 
演習:プログラミング言語処理をやってみよう (ver.1.01)
演習:プログラミング言語処理をやってみよう (ver.1.01)演習:プログラミング言語処理をやってみよう (ver.1.01)
演習:プログラミング言語処理をやってみよう (ver.1.01)Takashi Ishio
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesNoritada Shimizu
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみようTakashi Ishio
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
スクリプト言語入門 - シェル芸のすすめ - 第2回クラウド勉強会
スクリプト言語入門 - シェル芸のすすめ - 第2回クラウド勉強会スクリプト言語入門 - シェル芸のすすめ - 第2回クラウド勉強会
スクリプト言語入門 - シェル芸のすすめ - 第2回クラウド勉強会Makoto SAKAI
 
Object-Functional Analysis and Design and Programming温泉
Object-Functional Analysis and Design and Programming温泉Object-Functional Analysis and Design and Programming温泉
Object-Functional Analysis and Design and Programming温泉Tomoharu ASAMI
 

Similar to Yesodを支える技術 (20)

現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
 
Flowtype Introduction
Flowtype IntroductionFlowtype Introduction
Flowtype Introduction
 
Vim scriptとJavaとHaskell
Vim scriptとJavaとHaskellVim scriptとJavaとHaskell
Vim scriptとJavaとHaskell
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and design
 
スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介
スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介
スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
シェル芸勉強会へようこそ
シェル芸勉強会へようこそシェル芸勉強会へようこそ
シェル芸勉強会へようこそ
 
Msgpack cli-tech-aid-2013
Msgpack cli-tech-aid-2013Msgpack cli-tech-aid-2013
Msgpack cli-tech-aid-2013
 
Scalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive ProgrammingScalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive Programming
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
 
演習:プログラミング言語処理をやってみよう (ver.1.01)
演習:プログラミング言語処理をやってみよう (ver.1.01)演習:プログラミング言語処理をやってみよう (ver.1.01)
演習:プログラミング言語処理をやってみよう (ver.1.01)
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
SocketStream入門
SocketStream入門SocketStream入門
SocketStream入門
 
演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
スクリプト言語入門 - シェル芸のすすめ - 第2回クラウド勉強会
スクリプト言語入門 - シェル芸のすすめ - 第2回クラウド勉強会スクリプト言語入門 - シェル芸のすすめ - 第2回クラウド勉強会
スクリプト言語入門 - シェル芸のすすめ - 第2回クラウド勉強会
 
Sphinx/reST
Sphinx/reSTSphinx/reST
Sphinx/reST
 
Object-Functional Analysis and Design and Programming温泉
Object-Functional Analysis and Design and Programming温泉Object-Functional Analysis and Design and Programming温泉
Object-Functional Analysis and Design and Programming温泉
 

More from Hiromi Ishii

ものまね鳥を愛でる 結合子論理と計算
ものまね鳥を愛でる 結合子論理と計算ものまね鳥を愛でる 結合子論理と計算
ものまね鳥を愛でる 結合子論理と計算Hiromi Ishii
 
Freer Monads, More Extensible Effects
Freer Monads, More Extensible EffectsFreer Monads, More Extensible Effects
Freer Monads, More Extensible EffectsHiromi Ishii
 
Lebesgue可測性に関するSoloayの定理と実数の集合の正則性
Lebesgue可測性に関するSoloayの定理と実数の集合の正則性Lebesgue可測性に関するSoloayの定理と実数の集合の正則性
Lebesgue可測性に関するSoloayの定理と実数の集合の正則性Hiromi Ishii
 
実数の集合はどこまで可測になれるか?
実数の集合はどこまで可測になれるか?実数の集合はどこまで可測になれるか?
実数の集合はどこまで可測になれるか?Hiromi Ishii
 
(数式の入った)本をつくる
(数式の入った)本をつくる(数式の入った)本をつくる
(数式の入った)本をつくるHiromi Ishii
 
御清聴ありがとうございました
御清聴ありがとうございました御清聴ありがとうございました
御清聴ありがとうございましたHiromi Ishii
 
Lebesgue 可測性に関する Solovay-Shelah の結果に必要な記述集合論のごく基本的な事項
Lebesgue 可測性に関する Solovay-Shelah の結果に必要な記述集合論のごく基本的な事項Lebesgue 可測性に関する Solovay-Shelah の結果に必要な記述集合論のごく基本的な事項
Lebesgue 可測性に関する Solovay-Shelah の結果に必要な記述集合論のごく基本的な事項Hiromi Ishii
 
技術者が知るべき Gröbner 基底
技術者が知るべき Gröbner 基底技術者が知るべき Gröbner 基底
技術者が知るべき Gröbner 基底Hiromi Ishii
 
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由Hiromi Ishii
 
Algebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすくAlgebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすくHiromi Ishii
 
Yesod でブログエンジンをつくってみた
Yesod でブログエンジンをつくってみたYesod でブログエンジンをつくってみた
Yesod でブログエンジンをつくってみたHiromi Ishii
 
Alloy Analyzer のこと
Alloy Analyzer のことAlloy Analyzer のこと
Alloy Analyzer のことHiromi Ishii
 
Invertible-syntax 入門
Invertible-syntax 入門Invertible-syntax 入門
Invertible-syntax 入門Hiromi Ishii
 
Metaprogramming in Haskell
Metaprogramming in HaskellMetaprogramming in Haskell
Metaprogramming in HaskellHiromi Ishii
 
Template Haskell とか
Template Haskell とかTemplate Haskell とか
Template Haskell とかHiromi Ishii
 
実践・完全犯罪のつくり方
実践・完全犯罪のつくり方実践・完全犯罪のつくり方
実践・完全犯罪のつくり方Hiromi Ishii
 

More from Hiromi Ishii (17)

ものまね鳥を愛でる 結合子論理と計算
ものまね鳥を愛でる 結合子論理と計算ものまね鳥を愛でる 結合子論理と計算
ものまね鳥を愛でる 結合子論理と計算
 
Freer Monads, More Extensible Effects
Freer Monads, More Extensible EffectsFreer Monads, More Extensible Effects
Freer Monads, More Extensible Effects
 
Lebesgue可測性に関するSoloayの定理と実数の集合の正則性
Lebesgue可測性に関するSoloayの定理と実数の集合の正則性Lebesgue可測性に関するSoloayの定理と実数の集合の正則性
Lebesgue可測性に関するSoloayの定理と実数の集合の正則性
 
実数の集合はどこまで可測になれるか?
実数の集合はどこまで可測になれるか?実数の集合はどこまで可測になれるか?
実数の集合はどこまで可測になれるか?
 
(数式の入った)本をつくる
(数式の入った)本をつくる(数式の入った)本をつくる
(数式の入った)本をつくる
 
御清聴ありがとうございました
御清聴ありがとうございました御清聴ありがとうございました
御清聴ありがとうございました
 
Lebesgue 可測性に関する Solovay-Shelah の結果に必要な記述集合論のごく基本的な事項
Lebesgue 可測性に関する Solovay-Shelah の結果に必要な記述集合論のごく基本的な事項Lebesgue 可測性に関する Solovay-Shelah の結果に必要な記述集合論のごく基本的な事項
Lebesgue 可測性に関する Solovay-Shelah の結果に必要な記述集合論のごく基本的な事項
 
技術者が知るべき Gröbner 基底
技術者が知るべき Gröbner 基底技術者が知るべき Gröbner 基底
技術者が知るべき Gröbner 基底
 
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
 
Algebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすくAlgebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすく
 
Yesod でブログエンジンをつくってみた
Yesod でブログエンジンをつくってみたYesod でブログエンジンをつくってみた
Yesod でブログエンジンをつくってみた
 
Alloy Analyzer のこと
Alloy Analyzer のことAlloy Analyzer のこと
Alloy Analyzer のこと
 
Invertible-syntax 入門
Invertible-syntax 入門Invertible-syntax 入門
Invertible-syntax 入門
 
最終発表
最終発表最終発表
最終発表
 
Metaprogramming in Haskell
Metaprogramming in HaskellMetaprogramming in Haskell
Metaprogramming in Haskell
 
Template Haskell とか
Template Haskell とかTemplate Haskell とか
Template Haskell とか
 
実践・完全犯罪のつくり方
実践・完全犯罪のつくり方実践・完全犯罪のつくり方
実践・完全犯罪のつくり方
 

Recently uploaded

UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Recently uploaded (7)

UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

Yesodを支える技術

  • 2. 自己紹介 • 石井 大海 • 早稲田大学基幹理工学部 数学科三年(四月より) • Twitter Crawler などを書いている • Haskell Lover
  • 3. Haskell Lover • Haskell :純粋関数型言語 • 型クラスによる強力な抽象化能力 • 純粋性に由来するモジュラリティ • 今日の発表は Haskell 製Web Framework Yesod について
  • 4. Haskell のWeb開発 • 既にたなかさんが発表済みでは? • Yesod は Haskell の技術の結晶 • Yesod から Haskell の “今” を知ろう!
  • 6. Yesod の特徴 • セキュア、XSS/SQL injection に強い
  • 7. Yesod の特徴 • セキュア、XSS/SQL injection に強い • 抽象度の高いデータベースアクセス
  • 8. Yesod の特徴 • セキュア、XSS/SQL injection に強い • 抽象度の高いデータベースアクセス • 型付きURL
  • 9. Yesod の特徴 • セキュア、XSS/SQL injection に強い • 抽象度の高いデータベースアクセス • 型付きURL • 柔軟なテンプレートシステム
  • 10. Yesod の特徴 • セキュア、XSS/SQL injection に強い • 抽象度の高いデータベースアクセス • 型付きURL • 柔軟なテンプレートシステム • 継続ビルド
  • 11. Yesod の特徴 • セキュア、XSS/SQL injection に強い • 抽象度の高いデータベースアクセス • 型付きURL • 柔軟なテンプレートシステム • 継続ビルド • 高速
  • 12. Yesod の特徴 • セキュア、XSS/SQL injection に強い • 抽象度の高いデータベースアクセス • 型付きURL • 柔軟なテンプレートシステム • 継続ビルド • 高速 • 柔軟なバックエンド(Standalone、CGI、FCGI)
  • 13. XSS / SQL injection に強い
  • 14. XSS / SQL injection に強い • 型による区別
  • 15. XSS / SQL injection に強い • 型による区別 • String, Text: 文字列型を埋め込む際は必ずエス ケープされる
  • 16. XSS / SQL injection に強い • 型による区別 • String, Text: 文字列型を埋め込む際は必ずエス ケープされる • 生HTMLを埋め込むには手動で Html 型に変 換してやる必要がある
  • 17. XSS / SQL injection に強い • 型による区別 • String, Text: 文字列型を埋め込む際は必ずエス ケープされる • 生HTMLを埋め込むには手動で Html 型に変 換してやる必要がある • 漏れにくい、何処で漏れているか判りやすい
  • 18. SQL injection に強い • 抽象度の高いレイヤによって生の部分 は隠 • そもそも non-relational な使い方を前提 としているので低レベルを叩く必要性 が殆んどない • 一応用意されてはいる
  • 19. 抽象度の高いDBアクセス • 使用出来るバックエンド • PostgreSQL, Sqlite3, MongoDB • MySQL, CouchDB も試験的に使用可能 • 殆んど共通のAPIを利用可能 • non-relational なモデルを前提としている • 型クラスによる高度な抽象化
  • 20. 抽象度の高いDBアクセス class PersistStore b m where insert :: PersistEntity val => val → b m (Key b val) insertKey :: PersistEntity val => Key b val → val → b m () repsert :: PersistEntity val => Key b val → val → b m () replace :: PersistEntity val => Key b val → val → b m () delete :: PersistEntity val => Key b val → b m () get :: PersistEntity val => Key b val → b m (Maybe val) • DBバックエンドの型クラス。 • 函数の意味を型が雄弁に物語っている
  • 21. 抽象度の高いDBアクセス • データベースに格納出来る値のクラス • 関連型の機能を使っている • 型クラスに付随する函数のようなもの • 識別子やバックエンド、フィールドを表現する型など class PersistEntity val where data EntityField val :: * → * type PersistEntityBackend val :: ((* → *) → * → *) data Unique val :: ((* → *) → * → *) → * persistFieldDef :: EntityField val typ → FieldDef entityDef :: val → EntityDef toPersistFields :: val → [SomePersistField] fromPersistValues :: [PersistValue] → Either T.Text val
  • 22. 全部記述するの? User ident UserName password Text salt Text Maybe UniqueUser ident Email email Text user UserId Maybe verkey Text Maybe UniqueEmail email
  • 23. 全部記述するの? • コンパイル時に自動生成! User ident UserName password Text salt Text Maybe UniqueUser ident Email email Text user UserId Maybe verkey Text Maybe UniqueEmail email
  • 24. 全部記述するの? • コンパイル時に自動生成! • Template Haskell / Quasi Quote の威力 User ident UserName password Text salt Text Maybe UniqueUser ident Email email Text user UserId Maybe verkey Text Maybe UniqueEmail email
  • 25. 全部記述するの? • コンパイル時に自動生成! • Template Haskell / Quasi Quote の威力 • Haskell のコンパイルタイムプログラムの手法・リーダマクロ User ident UserName password Text salt Text Maybe UniqueUser ident Email email Text user UserId Maybe verkey Text Maybe UniqueEmail email
  • 26. 全部記述するの? • コンパイル時に自動生成! • Template Haskell / Quasi Quote の威力 • Haskell のコンパイルタイムプログラムの手法・リーダマクロ User ident UserName password Text salt Text Maybe UniqueUser ident Email email Text user UserId Maybe verkey Text Maybe UniqueEmail email • 一意識別子やクェリの種類(Eq, Lt, Gt)なども指定
  • 27. 全部記述するの? • コンパイル時に自動生成! • Template Haskell / Quasi Quote の威力 • Haskell のコンパイルタイムプログラムの手法・リーダマクロ User ident UserName password Text salt Text Maybe UniqueUser ident Email email Text user UserId Maybe verkey Text Maybe UniqueEmail email • 一意識別子やクェリの種類(Eq, Lt, Gt)なども指定 • これがおよそ300行程度(!!)に展開される
  • 28. 型付きURL • 関連型・Template Haskell の利用例。 • リンク切れや不正リンクを型レベルで防止! /static StaticR Static getStatic /auth AuthR Auth getAuth /favicon.ico FaviconR GET /robots.txt RobotsR GET /repo/#String/tree/*ObjPiece TreeR GET /repo/#String/blob/*ObjPiece BlobR GET /repo/#String/commits/*ObjPiece CommitsR GET • Method も指定可能(REST APIが作りやすい) • リンク用の関連型も自動生成 • あとは各routeに対する処理函数を書くだけ • 静的ファイルへのリンク函数も生成してくれる
  • 29. 処理函数 getTreeR :: String ! ObjPiece ! Handler RepHtml getTreeR repon op@(ObjPiece com xs) = withRepoObj repon op $ git repo obj ! do unless (isTree obj) $ notFound let src = getReadmeFromGitObj obj readme = writeHtml defaultWriterOptions $ readMarkdown defaultParserState <$> src entries ← liftIO $ getGitTree git repo repoLayout repon op $ do setTitle $ fromString $ repon ++ " - Gitolist" $(widgetFile "tree") • レスポンスの種類を型レベルで限定 • 外部テンプレート群からソースをコンパイ ル時生成 • IO処理なども(エラー処理込みで)行える
  • 30. テンプレートシステム • Shakespeare Template • Hamlet / Cassius / Lucius / Julius / CoffeeScript などなど • 型安全かつ効率的な Template Language • 簡単な式の埋め込み、URLと Widget、文字列などの区別
  • 31. テンプレート <ul> $forall ent <- entries $if isRegularFile ent <li><a href=@{BlobR repon (mkP ent)}>#{fileName ent} $elseif isDirectory ent <li><a href=@{TreeR repon (mkP ent)}>#{fileName ent} $else <li>#{fileName ent} $maybe rm <- readme <h3> README <article> #{rm} • HTML の終了タグをomitした形 • インデントで親子関係 • @{..}で型付URL、#{..}で文字やHtmlの埋め込み
  • 32. 補足 • Html型:blaze-html ライブラリ由来の型 • 効率的な文字列処理ライブラリ • 先程の例ではMarkdownを自動で整形 して表示していたりする(!!!) • CSS や JSのテンプレートと合わせて巧 いことやってくれる
  • 35. 継続ビルド • コンパイラ言語でWeb開発 • 書き換える度に recompile は面倒
  • 36. 継続ビルド • コンパイラ言語でWeb開発 • 書き換える度に recompile は面倒 • Yesod なら自動再コンパイル!
  • 37. 継続ビルド • コンパイラ言語でWeb開発 • 書き換える度に recompile は面倒 • Yesod なら自動再コンパイル! • コードやテンプレートの書き換えを自動感知
  • 40. 継続ビルド • GHC API を利用 • ……していた。
  • 41. 継続ビルド • GHC API を利用 • ……していた。 • 現在はファイルを監視して、外部コマ ンドを呼び出し再コンパイルしている
  • 43. 悔しいのでGHC API • GHC (Haskell のコンパイラ) の機能を埋め 込める
  • 44. 悔しいのでGHC API • GHC (Haskell のコンパイラ) の機能を埋め 込める • 通常 hint と云うラッパを挟んで使用
  • 45. 悔しいのでGHC API • GHC (Haskell のコンパイラ) の機能を埋め 込める • 通常 hint と云うラッパを挟んで使用 • Haskelインタプリタを仕込める
  • 46. 悔しいのでGHC API • GHC (Haskell のコンパイラ) の機能を埋め 込める • 通常 hint と云うラッパを挟んで使用 • Haskelインタプリタを仕込める • プラグインなどの動的ロードができる
  • 47. 悔しいのでGHC API • GHC (Haskell のコンパイラ) の機能を埋め 込める • 通常 hint と云うラッパを挟んで使用 • Haskelインタプリタを仕込める • プラグインなどの動的ロードができる • 勿論型安全
  • 48. 高速・高効率 • What make it possible? • ByteString / Text • blaze • Conduit
  • 50. ByteString / Text • 「Haskell の文字列処理は遅い」
  • 51. ByteString / Text • 「Haskell の文字列処理は遅い」 • String 型……ただの文字の「リスト」
  • 52. ByteString / Text • 「Haskell の文字列処理は遅い」 • String 型……ただの文字の「リスト」 • (本物の)文字列型を使おう!
  • 53. ByteString / Text • 「Haskell の文字列処理は遅い」 • String 型……ただの文字の「リスト」 • (本物の)文字列型を使おう! • ByteString:Byteの配列
  • 54. ByteString / Text • 「Haskell の文字列処理は遅い」 • String 型……ただの文字の「リスト」 • (本物の)文字列型を使おう! • ByteString:Byteの配列 • Text:Unicode 対応版。BSより若干効 率が下がるが String より遥かに高効率
  • 55. blaze • blaze-builder • ByteString 合成用のライブラリ。 差分リストを用いて効率を上げてい る、らしい。 • Text にも類似の機能がある。 • blaze-html が元々の発祥だった。
  • 56. benchmark • 10000 個の文字列片を連結 String binary ByteString blaze Text 0ms 4ms 8ms 12ms 16ms
  • 57. Conduit • 遅延I / Oに代わる Functional な IO 手法 • Source:入力源 • Conduit:入力を加工するパイプ • Sink:出力先 • ストリーム処理のような形になる。
  • 58. Conduit • ResourceT • リソースの解放処理を担当するモナド • lifted-base を利用し例外安全 • 先進的な例外ライブラリ。詳細は たなかさんの発表資料を参照。
  • 59. Conduit • Iteratee パターンに対する代替案 • 例外処理が超面倒 • 入力源を引き回せない • Iteratee では出力先の資源を割り当てられ ないと云う問題があった • Push から Pull 型へ。モナドの種類も制限
  • 60. Conduit • Conduit とは結局何か? • 入力と出力、中間処理の抽象化!
  • 61. 柔軟なバックエンド • Yesod アプリは…… • Standalone なサーバ • Warp, Snap, ... • CGI • FastCGI • (開発用継続ビルドサーバ) • などなど様々な形で動かせる。
  • 62. 柔軟なバックエンド • WAI: Web Application Interface • ウェブアプリを抽象化するインター フェース。 • Ruby の rack、Python の WSGI に相当 • type Application = Request → ResourceT IO Response type Middleware = Application → Application • 一目瞭然! • Conduit のお陰でこの様な抽象化が可能に。
  • 63. バックエンド • Warp:爆速HTTPサーバ • Snap:ミニマルなウェブフレームワーク • CGI, Fast-CGI:普通のサーバ上でも動く • 開発用サーバ:自動コンパイルとかの奴
  • 64. Benchmark • Pong benchmark (Yesod公式より) • Higher is Faster 90000 67500 45000 22500 0 goliath tornado php winstone node snap happstack warp+yesod warp
  • 65. 結論 • Web アプリ向き技術が Haskell には沢山 • Web アプリが Haskell の技術を必要とし ているとも云える • Haskell はライブラリも言語機能もアツ い! • Write Your Web App by Haskell!

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n