HaskellでWebアプリづくり
∼WebアプリケーションフレームワークYesod∼
    株式会社ワークスアプリケーションズ
        島崎 清山 (@seizans)
はじめに
• 今日使うプロジェクトを作成します
  • cd 
  • cat   .bash_profile >> .bashrc 
  •.   .bashrc 
            init
  • コマンド:yesod
  • 自分の名前は任意
  • プロジェクト名も任意
  • DBは     s (SQLite) を選択してください
• cd (プロジェクト名) で移動
• cabal-dev install で必要ライブラリのインストール
「関数型言語」でのプログラ
ミングをしたことの有無は?
「関数型言語」は純粋な処理
は得意だけど IO処理は苦手?
目的
• フレームワーク Yesod    を使うことで・・・
 • Haskell
     での Webアプリ開発が手軽に始められること
  を実感する
 • Haskell   で Webアプリが十分に実用的に開発できるこ
   とを実感する
 • Haskell で開発することでのメリットを実感する
自己紹介
• 勤務:ワークスアプリケーションズ         研究開発部門
 • 前職:エン・ジャパン      企画営業 (2009年5月まで2年)
• 職務内容:
 • Webアプリのセキュリティレビュー
 • Cloud基盤(AWS)の技術検証とサービス企画・運用
• 趣味:登山、楽器、ゲーム、甘いもの
• エンジニア歴:3年強(2009年6月∼)
• Haskell歴:1年半(2011年3月∼)
 • プログラミングできるようになるには?への回答
• Yesod歴:半年(2012年2月∼)
自己紹介
• Haskell   を始めたきっかけ
  • 元同僚への質問「何すればプログラミングできるよ
   うになりますか?」
• Yesod   を始めたきっかけ
  • Haskell
       で何か作って運用してみたかった
  • 期限が決まっているネタがあったので作ってみた
会社紹介
• 株式会社ワークスアプリケーションズ
• ERPパッケージ「COMPANY」(人事給与、会計、等)
の開発、販売、保守運用
• グループ社員数   2000 ~ 4000 の間くらい
• 研究開発部門では10人くらい趣味で       Haskell を読み書き
• 随時エンジニアを募集しています
Agenda
• Haskell   について
• Yesod について
• Yesod でプログラミング
• まとめ
Haskell で書くメリット(抜粋)
• 強力な型推論を含む静的型付け
  • 型に関わる実行時エラーはコンパイル時に防止
  • 型は必要最小限だけ書いても動いてくれる
• Null   をなくすことに成功
  • Null
      Pointer Exception は存在しない
  • 関数が null を返すかの確認が不要に
• IO   を分離することに成功
  • IO   は例外が起きる、非IO は例外はほぼ起きない
  • 書く場所によって何に注意すべきか考えられる
Haskell で書くメリット(抜粋)
• 関数が柔軟に使えるようになっています
• パターンは1つの関数にできます
• 関数を見た瞬間に把握できるので可読性が良いです



• 他にもいろいろなメリットがあります
• どのような問題解決をしてメリットを生み出したのか
という手法も面白いかもしれません

• この続きは   Haskell の入門書で
Haskell の入門書
• 左:「プログラミングHaskell」
• 右:「すごいHaskellたのしく学ぼう!」
Haskellアプリ:Monadius
• Haskellで書かれたグラディウス(ゲーム)
• 2005年制作(未確認)
• 村主さん(@nushio         さん、すごいHaskell訳者)制作
• http://www.geocities.jp/takascience/haskell/monadius_ja.html 
• 着想「関数型言語でゲームを書くと楽になるのでは」
 • でも「関数型言語はIOが苦手」?
Yesod overview
• フルスタックの Web        アプリケーション フレームワーク
• Haskell
     のメリットを活かせるように作られている
• 公式サイト:http://www.yesodweb.com/
• ソース:https://github.com/yesodweb/yesod
Yesod overview
• 型システムの恩恵
 • TypeSafe URL:サイト内はリンク切れ無し
 • XSS:文字列をhtmlに埋め込む際にエスケープされる
• DB   は選べる
 • PostgreSQL、MySQL、SQLite、MongoDB
• セキュリティが強い:デフォルトで防いでくれる
 • XSS、CSRF、SQLI   は普通にやると入らない
 • セッションハイジャックもデフォルトで防ぐ(IP見る)
Yesod overview
• パフォーマンス
 • 速いというベンチマークがある
 • スケーラブルなセッション機構
   • スティッキーではなく、適切に処理されCookie   に
• DSLで DRY
 • Model 定義、Routing 定義


• 他はさわってみてから
Yesod の始め方
• Haskell-Platform   をインストール:割愛
• Yesod をインストール:
  • cabal install yesod-platform 
• Yesod   プロジェクトを作成して build
  • yesod
       init 
  • ディレクトリを移動
  • cabal   install --only-dependencies 
  • yesod   devel 
•※  cabal-dev を使う方法を含めた解説は以下です
  • http://taketoncheir.hatenablog.com/entry/
    2012/08/14/020456
ハンズオンの目標
• ~/haskell/hello 
• http://localhost:3000 
• CRUD 処理を一通り書く
    • これができれば WebアプリはだいたいOK
    • Form
        で POST してデータ新規作成をするページ
    • データのリストビューを見れるページ
    • 今あるデータを変更するページ


• まずはコードを見つつ解説を少し
1.ページを作る
• 何を定義すればページができるか?
• URL 
• 処理     (Handler)
• View   (テンプレート)
1.ページを作る
• URL 
 • config/routes
             に例にならって書く
 • URL、Resource名、対応Method
• 処理     (Handler)
 • まずは    Handler/Home.hs につぎたす
 • $(widgetFile “some”) で template/some.hamlet を使う
 • defaultLayout     に widget を渡せば Handler RepHtml に
• View   (テンプレート)
 • hello   だけでよいので template/hello.hamlet を書く
2.hamlet と Widget で遊ぶ
• 参考URL
• https://github.com/seizans/yesod-tutorial/commits/master


• hamlet内のこと
  • <p> に対する閉じタグは不要
  • ^{someWidget}   で someWidget を差し込める
  • #{variable}   で variable を文字列として埋め込める
  • @{ResourceR args} で型付きURL
    • <a href=@{HomeR}> のように使う
3.Form を作る
• Form   の書き方を把握する
 • Formと関連付けるデータ型を決める
   • 無ければ作る、models をそのまま使うと楽




• 必須orNot  Field種類  ラベル名  デフォルト値
4.DB処理を書く
• データの     Insert を把握する
 • Form   からのデータを Insert するのはとても簡単
4.DB処理を書く
• データの   SELECT を把握する
 • 全件取得なら       runDB $ selectList [] [] と書けばいい
 • Key と Model の組になっていることに注意
4.DB処理を書く
• データの   SELECT を把握する
 • 全件取得なら       runDB $ selectList [] [] と書けばいい
 • Key と Model の組になっていることに注意
その他の話題
• REST   のサポート
 • 実は Json レスポンスを返すのが極めて簡単
   • (ほぼ)models に json と書くだけ
 • PUT   や DELETE の Handler も同様に作れる
 • Accept   ヘッダによって html か Json か自動で変える
• 例外
 • ケアが必要な境界領域は Yesod       がやってくれる
 • 一応    DB が落ちてて通信エラー、とかはありえる
その他の話題
• 認証
 • 実は既にそのアプリに認証機能が入っている
 • 必要な認証は一通りプラグインが既に作られている
 • 少し調整して使うだけ
• Subsite 
 • アプリをモジュール化して使いまわせる仕組み
 • 例:Auth    モジュール、Wiki モジュール
実用
• テスト
• CIツールの活用
• デプロイ
実用:テスト
• Hspec   (HUnit の代替品)
 • 仕様書ライクに書ける単体テスト
 • Ruby   由来
• QuickCheck 
 • 性質を書くとテストを自動生成してくれる仕組み
 • Haskell   由来 
• doctest 
 • ドキュメントに利用例や性質を書き、それを自動的
   にテストする仕組み
 • Python 由来
実用:テスト
• Webアプリケーションのテスト
• DB処理のテスト
• Handlerのテスト(HTTPリクエストを受けた結果)
• 画面系のテスト:JavaScript   の領域
実用:テスト
• yesod-test   パッケージがテストフレームワークを提供
  • tests/HomeTest.hs
              に例があります
  • HTTP リクエストを作って レスポンスをテストする
実用:テスト
• yesod-test   の活用方法 その2
  • テスト用 runDB を提供してくれているので
  • DB処理まわりのテストも書ける
実用:CIツール
• Cabal 
 • .cabalファイルにプロジェクトの各種仕様を記述する
   • 例)依存ライブラリ、実行コマンド、テスト、...
 • .cabalファイルに   test suites を登録して実行する
   • yesod init したプロジェクトの .cabal を見ましょう
   • yesod test コマンドは裏で cabal test をしています
実用:CIツール
• Travis 
 • CIツールのホスティングサービス、Haskell    も対応
 • Github と連携 (Github アカウントが必要)
   • push   を hook して処理を回してくれる
   • 設定ファイル(.travis.yml)を少し書くだけ
実用:CIツール
• Travis 
 • .travis.yml   をこれだけ書けば




 • push毎に実行
実用:デプロイ
• Keter   を使って nginx と連携
  • Snoyman
          さんが活発に開発中
• Heroku にホスティング
  • 参考資料のブログを参照
• Mighttpd(Haskell製 Webサーバ)
                    と連携して Haskell づくし
  • 今日はせっかくだから Haskell づくしで
実用:デプロイ
• Mighttpd 
 • Haskell製の高速Webサーバ
 • ルーティングと設定ファイルを指定して起動
 • かんたんに使える
• Angel 
 • Haskell製の   daemontoolsクローン
 • 機能:プロセスのデーモン化、監視と再生成
 • Bump    がサーバで使っているらしい
 • 設定ファイルを指定して起動
 • かんたんに使える
実用:デプロイ
• 配布したイメージには設定ファイル配置済みなので


• cd    haskell/hello 
•   sudo ~/haskell/angel/cabal-dev/bin/angel ~/haskell/angel/angel.conf


•   ブラウザで確認:http://localhost

•   運用方法
    •   nohup コマンドでずっと起動させておく
    •   アプリをupdateしたら yesod build してプロセスを kill
    •   Angel がプロセスを再生成してくれてサービス再開
実用:参考資料
• テスト
 • Haskellで Behavior Driven Development
 • HaskellとテストとBDD - あどけない話
• CIツール
 • Cabal  User Guide 
 • Travis CI 
• デプロイ
 • MightyとAngelでYesodをデプロイ            - あむログ
 • Yesod1.1   on Heroku - tk_shgの日記
Yesod まとめ
• 手軽に Webプログラミングをスタートできる
  • scaffold
         して MVC を足していくだけ
  • DSL が整えられているので簡単に書ける
• 十分に実用的
  • フレームワークに期待することは一通りできる
  • Cabal   や Travis で自動のビルドやテストもできる
• Haskell   らしいメリットが享受できる
  • 難しい変換系の処理は Yesod        がやってくれる
  • 開発者は高水準な世界に集中できる
  • Widget     や Subsite で再利用性を高められる
本日のまとめ
• Haskell   や Yesod を使うメリットがある
  • 高機能:問題解決をした結果として
    • 問題解決の方法として学ぶのも面白いかも
    • 開発者がやる必要ないことを基盤側がやってくれる
      • 開発者が本来のフィールドにより集中できる
  • 「関数型言語」と捉える必要は必ずしもないかも


• Web   Programming を Haskell でスタートさせましょう
  • 疑問・質問は遠慮なくどうぞ
  • みんなで解決していきましょう
Happy Haskell Web Programming!!

Ppl

  • 1.
    HaskellでWebアプリづくり ∼WebアプリケーションフレームワークYesod∼ 株式会社ワークスアプリケーションズ 島崎 清山 (@seizans)
  • 2.
    はじめに • 今日使うプロジェクトを作成します • cd  • cat .bash_profile >> .bashrc  •. .bashrc  init • コマンド:yesod • 自分の名前は任意 • プロジェクト名も任意 • DBは s (SQLite) を選択してください • cd (プロジェクト名) で移動 • cabal-dev install で必要ライブラリのインストール
  • 3.
  • 4.
  • 5.
    目的 • フレームワーク Yesod を使うことで・・・ • Haskell での Webアプリ開発が手軽に始められること を実感する • Haskell で Webアプリが十分に実用的に開発できるこ とを実感する • Haskell で開発することでのメリットを実感する
  • 6.
    自己紹介 • 勤務:ワークスアプリケーションズ 研究開発部門 • 前職:エン・ジャパン 企画営業 (2009年5月まで2年) • 職務内容: • Webアプリのセキュリティレビュー • Cloud基盤(AWS)の技術検証とサービス企画・運用 • 趣味:登山、楽器、ゲーム、甘いもの • エンジニア歴:3年強(2009年6月∼) • Haskell歴:1年半(2011年3月∼) • プログラミングできるようになるには?への回答 • Yesod歴:半年(2012年2月∼)
  • 7.
    自己紹介 • Haskell を始めたきっかけ • 元同僚への質問「何すればプログラミングできるよ うになりますか?」 • Yesod を始めたきっかけ • Haskell で何か作って運用してみたかった • 期限が決まっているネタがあったので作ってみた
  • 8.
    会社紹介 • 株式会社ワークスアプリケーションズ • ERPパッケージ「COMPANY」(人事給与、会計、等) の開発、販売、保守運用 •グループ社員数 2000 ~ 4000 の間くらい • 研究開発部門では10人くらい趣味で Haskell を読み書き • 随時エンジニアを募集しています
  • 9.
    Agenda • Haskell について • Yesod について • Yesod でプログラミング • まとめ
  • 10.
    Haskell で書くメリット(抜粋) • 強力な型推論を含む静的型付け • 型に関わる実行時エラーはコンパイル時に防止 • 型は必要最小限だけ書いても動いてくれる • Null をなくすことに成功 • Null Pointer Exception は存在しない • 関数が null を返すかの確認が不要に • IO を分離することに成功 • IO は例外が起きる、非IO は例外はほぼ起きない • 書く場所によって何に注意すべきか考えられる
  • 11.
    Haskell で書くメリット(抜粋) • 関数が柔軟に使えるようになっています •パターンは1つの関数にできます • 関数を見た瞬間に把握できるので可読性が良いです • 他にもいろいろなメリットがあります • どのような問題解決をしてメリットを生み出したのか という手法も面白いかもしれません • この続きは Haskell の入門書で
  • 12.
    Haskell の入門書 • 左:「プログラミングHaskell」 •右:「すごいHaskellたのしく学ぼう!」
  • 13.
    Haskellアプリ:Monadius • Haskellで書かれたグラディウス(ゲーム) • 2005年制作(未確認) •村主さん(@nushio さん、すごいHaskell訳者)制作 • http://www.geocities.jp/takascience/haskell/monadius_ja.html  • 着想「関数型言語でゲームを書くと楽になるのでは」 • でも「関数型言語はIOが苦手」?
  • 14.
    Yesod overview • フルスタックのWeb アプリケーション フレームワーク • Haskell のメリットを活かせるように作られている • 公式サイト:http://www.yesodweb.com/ • ソース:https://github.com/yesodweb/yesod
  • 15.
    Yesod overview • 型システムの恩恵 • TypeSafe URL:サイト内はリンク切れ無し • XSS:文字列をhtmlに埋め込む際にエスケープされる • DB は選べる • PostgreSQL、MySQL、SQLite、MongoDB • セキュリティが強い:デフォルトで防いでくれる • XSS、CSRF、SQLI は普通にやると入らない • セッションハイジャックもデフォルトで防ぐ(IP見る)
  • 16.
    Yesod overview • パフォーマンス • 速いというベンチマークがある • スケーラブルなセッション機構 • スティッキーではなく、適切に処理されCookie に • DSLで DRY • Model 定義、Routing 定義 • 他はさわってみてから
  • 17.
    Yesod の始め方 • Haskell-Platform をインストール:割愛 • Yesod をインストール: • cabal install yesod-platform  • Yesod プロジェクトを作成して build • yesod init  • ディレクトリを移動 • cabal install --only-dependencies  • yesod devel  •※ cabal-dev を使う方法を含めた解説は以下です • http://taketoncheir.hatenablog.com/entry/ 2012/08/14/020456
  • 18.
    ハンズオンの目標 • ~/haskell/hello  • http://localhost:3000  •CRUD 処理を一通り書く • これができれば WebアプリはだいたいOK • Form で POST してデータ新規作成をするページ • データのリストビューを見れるページ • 今あるデータを変更するページ • まずはコードを見つつ解説を少し
  • 19.
  • 20.
    1.ページを作る • URL  •config/routes に例にならって書く • URL、Resource名、対応Method • 処理 (Handler) • まずは Handler/Home.hs につぎたす • $(widgetFile “some”) で template/some.hamlet を使う • defaultLayout に widget を渡せば Handler RepHtml に • View (テンプレート) • hello だけでよいので template/hello.hamlet を書く
  • 21.
    2.hamlet と Widgetで遊ぶ • 参考URL • https://github.com/seizans/yesod-tutorial/commits/master • hamlet内のこと • <p> に対する閉じタグは不要 • ^{someWidget} で someWidget を差し込める • #{variable} で variable を文字列として埋め込める • @{ResourceR args} で型付きURL • <a href=@{HomeR}> のように使う
  • 22.
    3.Form を作る • Form の書き方を把握する • Formと関連付けるデータ型を決める • 無ければ作る、models をそのまま使うと楽 • 必須orNot  Field種類  ラベル名  デフォルト値
  • 23.
    4.DB処理を書く • データの Insert を把握する • Form からのデータを Insert するのはとても簡単
  • 24.
    4.DB処理を書く • データの SELECT を把握する • 全件取得なら runDB $ selectList [] [] と書けばいい • Key と Model の組になっていることに注意
  • 25.
    4.DB処理を書く • データの SELECT を把握する • 全件取得なら runDB $ selectList [] [] と書けばいい • Key と Model の組になっていることに注意
  • 26.
    その他の話題 • REST のサポート • 実は Json レスポンスを返すのが極めて簡単 • (ほぼ)models に json と書くだけ • PUT や DELETE の Handler も同様に作れる • Accept ヘッダによって html か Json か自動で変える • 例外 • ケアが必要な境界領域は Yesod がやってくれる • 一応 DB が落ちてて通信エラー、とかはありえる
  • 27.
    その他の話題 • 認証 •実は既にそのアプリに認証機能が入っている • 必要な認証は一通りプラグインが既に作られている • 少し調整して使うだけ • Subsite  • アプリをモジュール化して使いまわせる仕組み • 例:Auth モジュール、Wiki モジュール
  • 28.
  • 29.
    実用:テスト • Hspec (HUnit の代替品) • 仕様書ライクに書ける単体テスト • Ruby 由来 • QuickCheck  • 性質を書くとテストを自動生成してくれる仕組み • Haskell 由来  • doctest  • ドキュメントに利用例や性質を書き、それを自動的 にテストする仕組み • Python 由来
  • 30.
    実用:テスト • Webアプリケーションのテスト • DB処理のテスト •Handlerのテスト(HTTPリクエストを受けた結果) • 画面系のテスト:JavaScript の領域
  • 31.
    実用:テスト • yesod-test パッケージがテストフレームワークを提供 • tests/HomeTest.hs に例があります • HTTP リクエストを作って レスポンスをテストする
  • 32.
    実用:テスト • yesod-test の活用方法 その2 • テスト用 runDB を提供してくれているので • DB処理まわりのテストも書ける
  • 33.
    実用:CIツール • Cabal  •.cabalファイルにプロジェクトの各種仕様を記述する • 例)依存ライブラリ、実行コマンド、テスト、... • .cabalファイルに test suites を登録して実行する • yesod init したプロジェクトの .cabal を見ましょう • yesod test コマンドは裏で cabal test をしています
  • 34.
    実用:CIツール • Travis  •CIツールのホスティングサービス、Haskell も対応 • Github と連携 (Github アカウントが必要) • push を hook して処理を回してくれる • 設定ファイル(.travis.yml)を少し書くだけ
  • 35.
    実用:CIツール • Travis  •.travis.yml をこれだけ書けば • push毎に実行
  • 36.
    実用:デプロイ • Keter を使って nginx と連携 • Snoyman さんが活発に開発中 • Heroku にホスティング • 参考資料のブログを参照 • Mighttpd(Haskell製 Webサーバ) と連携して Haskell づくし • 今日はせっかくだから Haskell づくしで
  • 37.
    実用:デプロイ • Mighttpd  •Haskell製の高速Webサーバ • ルーティングと設定ファイルを指定して起動 • かんたんに使える • Angel  • Haskell製の daemontoolsクローン • 機能:プロセスのデーモン化、監視と再生成 • Bump がサーバで使っているらしい • 設定ファイルを指定して起動 • かんたんに使える
  • 38.
    実用:デプロイ • 配布したイメージには設定ファイル配置済みなので • cd haskell/hello  • sudo ~/haskell/angel/cabal-dev/bin/angel ~/haskell/angel/angel.conf • ブラウザで確認:http://localhost • 運用方法 • nohup コマンドでずっと起動させておく • アプリをupdateしたら yesod build してプロセスを kill • Angel がプロセスを再生成してくれてサービス再開
  • 39.
    実用:参考資料 • テスト •Haskellで Behavior Driven Development • HaskellとテストとBDD - あどけない話 • CIツール • Cabal User Guide  • Travis CI  • デプロイ • MightyとAngelでYesodをデプロイ - あむログ • Yesod1.1 on Heroku - tk_shgの日記
  • 40.
    Yesod まとめ • 手軽にWebプログラミングをスタートできる • scaffold して MVC を足していくだけ • DSL が整えられているので簡単に書ける • 十分に実用的 • フレームワークに期待することは一通りできる • Cabal や Travis で自動のビルドやテストもできる • Haskell らしいメリットが享受できる • 難しい変換系の処理は Yesod がやってくれる • 開発者は高水準な世界に集中できる • Widget や Subsite で再利用性を高められる
  • 41.
    本日のまとめ • Haskell や Yesod を使うメリットがある • 高機能:問題解決をした結果として • 問題解決の方法として学ぶのも面白いかも • 開発者がやる必要ないことを基盤側がやってくれる • 開発者が本来のフィールドにより集中できる • 「関数型言語」と捉える必要は必ずしもないかも • Web Programming を Haskell でスタートさせましょう • 疑問・質問は遠慮なくどうぞ • みんなで解決していきましょう
  • 42.
    Happy Haskell WebProgramming!!