2014年1月13日月曜日

[haskell][yesod] Hashkell and Yesod(Basics章)学習メモ

Yesod学習のためにオンラインで公開されているHaskell and Yesodを読んでいます。本エントリにはBasicsの章について自分の理解をまとめておきます。


Basics
  • Hello World
    • サンプルコード(helloworld.hs)を起動するにはコマンドラインから単に以下のコマンドを実行すればよい。
      • runhaskell helloworld.hs
      • {-# LANGUAGE QuasiQuotes           #-}
        {-# LANGUAGE TemplateHaskell       #-}
        {-# LANGUAGE TypeFamilies          #-}
        import           Yesod
        
        data HelloWorld = HelloWorld
        
        mkYesod "HelloWorld" [parseRoutes|
        / HomeR GET
        |]
        
        instance Yesod HelloWorld
        
        getHomeR :: Handler Html
        getHomeR = defaultLayout [whamlet|Hello World!|]
        
        main :: IO ()
        main = warp 3000 HelloWorld
    • コンパイル後ウェブサーバーが起動される。起動されたウェブサーバーにアクセスするには、ブラウザに以下のURLを入力する。
  • Routing
    • 以下のようなコードでrouteを定義する。
    • mkYesod "HelloWorld" [parseRoutes|
      / HomeR GET
      |]
    • 上記のコードは、次のことを意味している。
      • "HelloWorld"アプリケーションはrouteを1つ持つ
      • このrouteを"HomeR"と呼ぶ。
        • "R"はresourceを表すものに付与する接尾辞。従うべきconvention。
      • このruoteは"/"(アプリケーションのroot)に対する、GETリクエストに応答する
      • mkYesodはTemplate Haskell関数、parseRoutesはquasi-quote)
  • Handler Function
    • 上記のHomeRというrouteに対するGETリクエストにレスポンスを返すにはgetHomeRというHandler Functionを用意する。
      • "get"はrouteの"GET"に対応
      • HomeRはrouteの名前
    • helloworldサンプルではdoc type, tagなどを自動的に付与してレスポンスデータを生成してくれるdefaultLayout関数に[whamlet|Hello World!|]という引数を渡している。
      • whamletはhamlet syntaxをwidgetに変換するquqsi-quote
      • hamletはYesodのでフォルトHTMLテンプレートエンジン
  • The Foundation
    • 全てのYesodアプリケーションはfoundationデータ型を持つ。 このデータ型はYesod型クラスのインスタンスでなければならない。以下のような項目を制御する。
      • DBのコネクションプール
      • コンフィグファイルから読み込んだ設定値
      • HTTPコネクションマネージャ
      • rumdom number generator
    • Yesodはヘブライ語で"foundation"という意味らしい。
  • Running
    • YesodはWeb Application Interface(WAI)上でビルドされており、以下の環境で動作する
      • FastCGI
      • SCGI
      • Warp
      • Webkitライブラリを利用するデスクトップアプリケーション
  • Resources and type-safe URLs
    • 複数のページ(HomeR, Page1R, Page2R)を遷移するサンプル:
    • {-# LANGUAGE QuasiQuotes           #-}
      {-# LANGUAGE TemplateHaskell       #-}
      {-# LANGUAGE TypeFamilies          #-}
      import           Yesod
      
      data HelloWorld = HelloWorld
      
      mkYesod "HelloWorld" [parseRoutes|
      / HomeR GET
      |]
      
      instance Yesod HelloWorld
      
      getHomeR :: Handler Html
      getHomeR = defaultLayout [whamlet|Hello World!|]
      
      main :: IO ()
      main = warp 3000 HelloWorldI
    • 上記のサンプルではwhamletでtype-safe URLを用いている。"@{...}"で囲まれた部分はYesodが自動的に正しいURL文字列に変換した上でクライアントにレスポンスデータとして返される。
    • type-safe URLは非常に価値があるもの:
      • 開発時に何度URLを変更しても決してリンク切れになることはない 
      • コンパイル時にパラメタ込みで不整合が検知される

  • The scaffolded site
    • 本書ではscaffold site関連のツールは意図的に用いていないが、実際の開発ではscaffold siteを利用することを強く推奨する。
    • yesod init
      • いくつかの質問を入力すると、デフォルトのscaffold siteが格納されたディレクトリが生成される
    • cabal install --only-dependencies
      • yesod initで生成されたディレクトリの中で実行
      • DBなどの付加的な依存ライブラリをビルドする
    • yesod devel
      • サーバーを起動する
  • Development Server
    • yesod develを利用すると、
      • コードの変更に対して自動的にリビルド・リロードがかかり、インタープリタ言語の強みであるrapid prototypingに相当する恩恵がえられる。
      • production site用には最適化されたバイナリを生成でき、fast productionも実現できる



0 件のコメント:

コメントを投稿