Yesod勉強会
Upcoming SlideShare
Loading in...5
×
 

Yesod勉強会

on

  • 10,580 views

Yesod勉強会 http://partake.in/events/5f27d86f-0211-4af4-9a9e-5f123056e44e での発表資料です。

Yesod勉強会 http://partake.in/events/5f27d86f-0211-4af4-9a9e-5f123056e44e での発表資料です。

Statistics

Views

Total Views
10,580
Views on SlideShare
10,521
Embed Views
59

Actions

Likes
18
Downloads
62
Comments
0

6 Embeds 59

http://paper.li 28
https://twitter.com 16
http://localhost 6
http://twitter.com 4
https://si0.twimg.com 4
https://twimg0-a.akamaihd.net 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Yesod勉強会 Yesod勉強会 Presentation Transcript

  • HaskellとWeb開発
    田中英行 (@tanakh)
    tanaka.hideyuki@gmail.com
  • 本日の概要
    HaskellとWebアプリ
    HaskellのWebフレームワーク今昔
    ナウいHaskellのWebフレームワーク紹介
    Yesod入門
  • HaskellとWebアプリ
  • なぜ、HaskellでWebアプリを書くのか?
    速さ
    statically typed
    安全性
    type-safe, XSS/SQL injection
    記述力
    言わずもがな
    雇用対策(他人に保守できない)
  • なぜ、HaskellでWebアプリを書くのか?
  • なぜ、HaskellでWebアプリを書くのか?
  • なぜ、HaskellでWebアプリを書くのか?
  • なぜ、HaskellでWebアプリを書くのか?
  • 現在の世の中の情勢
    LAMP!
    RoR!
    Django!
    Node.js!
    これは潰したい
  • スクリプト言語の場合
    お手軽
    PHPとか
    書き換えると直ぐに反映
    優れたフレームワークの存在
    Ruby on Rails
    symfony
    Django
  • なぜコンパイル言語でWebアプリは流行らないか?
    毎度コンパイルするのが面倒
    Webフレームワークの不在
    Javaはそこそこ使われていたりする
    ScalaのLiftとか?
    ネイティブなのはあまり聞かない
  • Haskellでは…?
    Haskellインタプリタライブラリを用いた開発サーバの登場
    コンパイル不要
    書き換え即反映
    新世代Webフレームワークの台頭
    2010年あたりから
    高速文字列ライブラリ、UTFサポートの充実、Iterateeなど優れたI/Oライブラリの整備が後押しか?
  • これなら書ける!
  • HaskellでのWeb開発今昔
  • 昔々…
    Web開発はCGIが主流
    (環境変数)標準入力からの入力と、標準出力への出力が出来ればOK
    おおよそどんなプログラミング言語でも可能
    Web黎明期にはPerlがよく使われていた
  • CGI
    Haskellでは、かなり昔からCGIを書くためのライブラリが「標準に」入っていた
    現在はHaskell Platform
    モナディックライブラリ
    CGIモナドとしてプログラムを書くと、CGIとしてだけでなく、FCGI、SCGI、はたまたスタンドアロンサーバとしても動作可能
  • HTMLライブラリ
    Text.HTML
    これもかなり初期から標準搭載

  • import Network.CGI
    import Text.Html
    main :: IO ()
    main = runCGI (handleErrorscgiMain)
    cgiMain :: CGI CGIResult
    cgiMain = output $ renderHtml $ do
    thehtml <<
    [ header $ thetitle << "Test Page!"
    , body <<
    [ h1 << "Hoge-"
    , paragraph <<
    [ primHtml "Hello, World!" ]]]
  • 参考:pficommonのCGIライブラリ
    HaskellのCGI+HTMLを下敷きに作った
    class my_cgi : public xhtml_cgi{
    public:
    void run(){
    html__{
    head__{
    title__{
    text__("Test"); }}
    body__{
    h1__ text__("Hoge-");
    p__{
    text__("Hello, World!"); }}}}
    };
    int main(){
    run_cgi(my_cgi()).run();
    }
  • Functional Online Judge
    http://d.hatena.ne.jp/tanakh/20050919#p1
    拙作謎のオンラインジャッジ
    CGI+HTML+HaskellDB+Sqlite
  • こういうのの何がいいのか?
    コンパイルが通れば、ill-formedなHTMLが生成されない
    コンパイルが通れば、XSSされない
  • 何が問題なのか?
    必要なものが揃っていない
    Session
    永続データ
    パスルーティング
    などなど
    DBにアクセスするものはあったけど
    IOモナドを介する貧弱なインターフェース
  • 参考:HaskellDB
    SQLを生で書くのはいけない
    EDSL
    ill-formedなSQLの生成を防止
    型安全性
    SQLインジェクション防止
  • 参考:GHCの日本語対応
    HaskellのChar型は元々32bit
    HaskellのString = Charのリスト
    Unicodeが普通に扱えるはずだが…
    GHC 6.x から
    utf8文字列受付->utf8-string->IOレイヤでの自動エンコード・デコード
  • WASH
    http://www.informatik.uni-freiburg.de/~thiemann/WASH/
    Haskellの第一世代型Webフレームワーク
    状態を持てる(継続ベースっぽい)
    XMLを中に書ける(HSP)
  • HSP(Haskell Server Pages)
    EmbededなXMLコード
    page :: (?a :: Application, ?s :: Session) => Element
    page =
    <HTML>
    <TITLE>Counter</TITLE>
    <BODY>
    <P>
    This page has been accessed
    <%
    do{ n <- countPage
    ; return [ <IMG SRC=(i:".gif") /> | i <- show n ]
    }
    %>
    times.
    </P>
    <P>
    You have visited this page <% countSession %> times.
    </P>
    </BODY>
    </HTML>
  • Happs
    同世代のフルスタックWebフレームワーク
    DBを使わない独自の永続データ
    独自のマイグレーション
  • そして月日は流れて…
    第二世代型のフレームワークに
  • Haskellを取り巻く環境の変遷とHaskellのナウいWebフレームワーク
  • 最近のHaskell
    2009~2010年頃、突如としてHaskellのWebフレームワークが同時多発的に登場
    特に有望そうな物
    Happstack
    Happsの改良
    Snap
    ハイパフォーマンスを謳う
    Yesod
    フルスタック
  • 何が起こったか?
    Hackage(http://hackage.haskell.org/)の登場(2006~)
    HaskellのCPANのようなもの
    Hackageへの優れたライブラリの蓄積(2008~)
    既存のライブラリを置き換えるようなものの登場
    ByteString/Text
    Unicodeの扱い
    Iteratee
    Haskellコミュニティーの成長
  • Haskellの文字列処理の変遷
    String (=[Char])
    とても自明で、InductiveでRecursiveな定義
    Haskell標準に豊富にあるリスト操作関数がそのまま使える
    2008年頃まで、Haskellコミュニティーは何も疑問に思うことなく過ごしていた…
  • Stringの欠点
    メモリを大量に食う(4*ptr+32bit/char)
    遅い(一文字ごとにderef2回)
    ‘H’
    ‘E’
    ‘L’
  • ByteStringの登場
    単なるByte Arrayをメモリ表現として持つByteStringの登場
    爆速
    適当に書いたコードだとC++より速い
    Fusion
    map f (map g str) をmap (f.g) strに変換するなど
    かなりアグレッシブ
  • Textの登場
    ByteStringはエンコーディングを考慮しないバイト列だった
    HaskellのCharはUTF32
    そのままByteStringにできない
    UTF16でエンコードされた16ビット列を表すTextの登場
    先日リリースされたHaskell Platform 2011.2.0.0から標準に
  • Iteratee
    次世代I/O
    次のすべてを満たす夢のような手法
    高速
    composable
    安全
    リソースの速やかな開放
  • Iterateeの適当な説明
    Enumerator
    Enumeratee
    Iteratee
    入力データを生成
    入力データを変換
    入力データを消費
  • そんなこんなで
    新しいWebフレームワークの登場する土壌が整いまして…
  • Happs/Happstack
    http://happstack.com/
    結構昔からあるフレームワーク
    最近Happstackという名前に
    高速化
    Iteratee化など
    利用例
    happstack.com
    gitit (http://wiki.tanakh.jp/)
    patch-tag (http://patch-tag.com/)
  • Happstack
    フルスタックなWebフレームワーク
    サーバー (happstack-server)
    永続データ (happstack-state)
    テンプレーティング
  • Snap
    http://snapframework.com/
    2010年開発開始
    libevを用いた高速な実装
    Googleの人が開発?(CopyrightにGoogle Inc)
    利用例
    snapframework.com
    darcsden (http://darcsden.com/)
    barley (http://barley.tanakh.jp/)
  • Snapベンチマーク
    Pongベンチマーク
  • Snapの状況
    だが、最近は開発が停滞気味
    ひと通り完成か?
    フレームワークと言うには機能が少ない
    セッションない
    永続データない
    ファイルアップロード機能が最近付いた
    テストのカバレッジチェック等がきっちりと行われている
  • Snap周辺ライブラリ
    Heist
    テンプレーティングライブラリ
    xmlで記述
    特定のタグでHaskellコードを呼び出せる
    スニペットと呼ばれる
    xmlhtml
    既存のhtmlライブラリがしょぼいので、新しく作られた
    これは便利
  • Heiste例
    <bind tag="longname"> Einstein, Feynman, Heisenberg,
    and Newton Research Corporation Ltd.<sup>TM</sup></bind><p> We at <longname/> have research expertise in many
    areas of physics. Employment at <longname/> carries significant
    prestige. The rigorous hiring process developed by
    <longname/> is leading the industry.</p>
  • Yesod
    http://docs.yesodweb.com/
    フルスタックなWebフレームワーク
    HaskellのQuasiQuoteを積極的に用いた(おそらく)初めてのフレームワーク
    WAIを介して様々な方法で実行できる
    豊富な周辺ライブラリ
  • Yesodベンチマーク
    Pongベンチマーク
  • Yesodを利用したサイト
    http://docs.yesodweb.com/
    yackage
    http://www.haskellers.com/
    http://photos.snoyman.com/
    http://www.search-once.com/homepage/
  • WAI (Web Application Interface)
    Webアプリケーションのための近代的な汎用インターフェース
    Yesodの人による
    type Application = Request -> Iteratee ByteString IO Response
    type Middleware = Application -> Application
  • WAI(2)
    Yesodアプリ
    CGI
    FCGI
    Snapアプリ
    WAI
    Standalone
    その他アプリ
    devel
    webkit
  • Warp
    Yesod作者が作った、Iterateeベースの高性能WAIバックエンドHTTPサーバ
  • Yesod入門
  • インストール
    ghcをインストールする
    $ cabal update
    $ cabal install yesod
  • 最初のサンプル
    {-# LANGUAGE TypeFamilies, QuasiQuotes,
    MultiParamTypeClasses, TemplateHaskell #-}importYesoddataHelloWorld = HelloWorldmkYesod“HelloWorld” [parseRoutes|/ HomeR GET|]instanceYesodHelloWorldwhereapproot_ = ""getHomeR = defaultLayout[hamlet|HelloWorld!|]main = warpDebug 3000 HelloWorld
  • scaffold
    $ mkdir test
    $ cd test
    $ yesod
    質問に答える
    テンプレができる!
  • ビルド
    $ cabal configure
    $ cabal build
    dist/build/…/… を実行!
    ブラウザで見る
  • Hamlet/Cassius/Julius
    HTML/CSS/JSの各種DSL
    それぞれQuasiQuoteとして用いる
    !!!
    <html
    <head
    <title>#{pageTitle pc}
    ^{pageHead pc}
    <body
    $maybe msg <- mmsg
    <div #message>#{msg}
    ^{pageBody pc}
  • Hamlet/Cassius/Julius
    hamlet/default-lauout.hamlet
    テンプレ
    hamlet/homepage.hamlet
    各ページ
    Handler/Root.hs
    これらを読み込むコード
    これらのファイルは、“コンパイル時”に読まれ、パーズされ、型検査され、well-formedなHTML等しか生成されないことが保証される
  • Web Route Quasi
    <Foundation>.hs
    QuasiQuoteでパスを作成
    mkYesodData"Test" [$parseRoutes|
    /static StaticR Static getStatic
    /authAuthRAuthgetAuth
    /favicon.ico FaviconR GET
    /robots.txt RobotsRGET
    / RootR GET
    /user/#String/configConfigR GET POST
    /user/#String/post/#IntPostR POST
    |]
  • Type Safe URL
    ルートに対して、それぞれデータ型が生成される
    Hamletへのリンク挿入時、それを利用出来る
    404 error free!
    <ul
    <li
    <a href=@{PortR “Hoge” 123}>ポスト
    <a href=@{ConfigR “Hoge”}>設定
  • persistent
    永続データを扱うライブラリ
    Non Relational
    割り切った設計
    Sqlite, PostgresSQL, MongoDBなど、バックエンドのシームレスな切り替え
    QuasiQuoteによるレコード定義
    自動マイグレーション
  • persistent例
    share2 mkPersist (mkMigrate "migrateAll") [persist|
    User
    ident String
    name String Update
    password String Maybe Update
    longName String Update default=""
    desc Text Update default=""
    UniqueUserident
    UniqueUserName name
    Post
    user UserIdEq In
    content Text
    replyToPostId Maybe
    replyToUserUserId Maybe
    date UTCTimeDesc
    |]
  • devel-server
    wai-handler-develを使うと、ghc-apiを利用してコードをコンパイルせずに実行出来る
    コードの変更を監視して、自動リロードされる
    hamletの変更も監視
    スクリプト言語のような書き心地!
    本番運用はコンパイルして高速に実行
  • webkit-handler
    WebアプリをスタンドアロンGUIアプリのように実行出来る
  • i18n
    Yesod 0.8.1から追加
    http://www.yesodweb.com/blog/non-poly-hamlet-i18n
  • デモ
    ご期待ください!