Haskell で Webアプリ
∼ Yesod を使って面白かったこと ∼
 株式会社ワークスアプリケーションズ
     島崎 清山 (@seizans)
自己紹介
• 島崎清山   (@seizans)
• いままで:営業(1年)         → 社内SE(1年) → 現職(3年)
• おしごと:
 • Webアプリのセキュリティレビュー
 • Cloud基盤(AWS)の技術検証とサービス企画・運用
• 趣味:登山、楽器、ゲーム、甘いもの
• Haskell歴:1年半(2011年3月∼)
• Yesod歴:半年(2012年2月∼)
• 最近考えてること:どうやって             Haskell で仕事するか
自己紹介
• Haskell   を始めたきっかけ
  • mayahjp
      さんへ質問「何すればプログラミングできる
   ようになりますか?」
• Yesod   を始めたきっかけ
  • Haskell
       で何か作って運用してみたかった
  • 期限が決まっているネタがあったので作ってみた
会社紹介
• 株式会社ワークスアプリケーションズ
• ERPパッケージ「COMPANY」(人事給与、会計、等)
の開発、販売、保守運用
• グループ社員数   2000 ~ 4000 の間くらい
• 研究開発部門では10人くらい趣味で       Haskell を読み書き
• 随時エンジニアを募集しています
名古屋といえば
• 名古屋国際会議場




• 名古屋・・・また行きたいですね・・・
Web Framework 何があるか
• http://www.haskell.org/haskellwiki/Web/Frameworks
Yesod overview その前に
• Yesod   Quick Start 
 • http://www.yesodweb.com/page/quickstart 
• 参考用のコード
 • https://github.com/seizans/yesod-tutorial 
 • コミットログそれぞれで1つ何かわかるようにしてる
 • もうちょっと増やしていこうと思っています


• いいから書かせろという方はもうどんどん書いてみて
 ください
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
ページを作る
• 何を定義すればページができるか?
• URL 
 • URL   に対して Resource を定義する
 • 1行書くだけなので割愛
• Handler
      (処理)
 • 具体的な処理を書くので次で説明
• View   (テンプレート)
 • テンプレートでやりたいことはできる
 • 他の言語でやるのとほぼ変わらないので割愛
Handler を書く
• User   テーブルを全件テンプレートに渡してHtmlを返す




• UserId   でレコード引いて Json を返す(無ければ404)
Handler を書く
• User   テーブル用の Form を生成して画面をつくる
Handler を書く
• POST    した Form を受けてレコード追加処理を書く




 • データの変換は自動でやってくれる
 • bind
     してくれるのでパターンマッチで取り出す
 • 失敗の場合は FormFailure か FormMissing になってる
データ型の話
• 使うデータ型がこんなだとする




• やりたいこと
• DBテーブルと関連付け
• UserName   フィールドとか Unique にしたい
• Json   との変換も自動的にして欲しい
データ型の話
• これを書けば TH   を使ってよろしくやってくれる




• やりたかったこと
 • DBテーブルと関連付け
 • UserNameフィールドとか Unique にしたい
 • Json との変換も自動的にして欲しい


•※   実際には数百行のコードに展開されています
その他の話題
• REST    のサポート
 • Json
      のやりとりが簡単
 • PUT や DELETE の Handler も同様に作れる
 • Accept   ヘッダによって html か Json か自動で変える
• 例外があんまり出ないか
 • ケアが必要な境界領域は Yesod      がやってくれる
 • 一応     DB が落ちてて通信エラー、とかはありえる
その他の話題
• Subsite 
 • アプリをモジュール化して使いまわせる仕組み
 • 例:Auth    モジュール、Wiki モジュール
• 認証
 • ということで公開されてる Subsite を使えばOK
 • 実は 既にそのアプリに認証機能が入っている
 • 必要な認証は一通りプラグインが既に作られている
 • 少し調整して使うだけ
環境とか
• テスト
• CIツールの活用
• デプロイ
テスト
• 参考資料
 • http://www.mew.org/~kazu/material/2012-test.pdf 
• Hspec   (HUnit の代替品)
 • 仕様書ライクに書ける単体テスト
• QuickCheck 
 • 性質を書くとテストを自動生成してくれる仕組み
• doctest 
 • ドキュメントに利用例や性質を書き、それを自動的
   にテストする仕組み
テスト
• Webアプリケーションのテスト
• DB処理のテスト
• Handlerのテスト(HTTPリクエストを受けた結果)
• 画面系のテスト:JavaScript   の領域
テスト
• yesod-test   パッケージがテストフレームワークを提供
  • scaffold
          すると tests/HomeTest.hs に例ができてる
  • HTTP リクエストを作って レスポンスをテストする
テスト
• yesod-test   の活用方法 その2
  • テスト用 runDB を提供してくれているので
  • DB処理まわりのテストもOK
CIツール
• Cabal 
 • .cabalファイルにプロジェクトの各種仕様を記述する
   • 例)依存ライブラリ、実行コマンド、テスト、...
 • .cabalファイルに   test suites を登録して実行する
   • yesod init したプロジェクトの .cabal を見ましょう
   • yesod test コマンドは裏で cabal test をしています
CIツール
• Travis 
 • http://about.travis-ci.org/docs/ 
 • CIツールのホスティングサービス、Haskell            も対応
 • Github   と連携
   • push
       を hook して処理を回してくれる
   • 設定ファイル(.travis.yml)を少し書くだけ
CIツール
• Travis 
 • .travis.yml   をこれだけ書けば




 • push毎に実行
デプロイ
• 標準デプロイツールっぽいの(Keter)開発され中
 • 一応今でも動く
 • https://github.com/snoyberg/keter 
• Heroku   にホスティング
 • http://taketoncheir.hatenablog.com/entry/
   2012/08/14/020456 
• Mighttpd(Haskell製 Webサーバ)       を使うとか
 • http://amkkun.hatenablog.com/entry/2012/08/13/160523
デプロイ
• Mighttpd 
 • Haskell製の高速Webサーバ
 • ルーティングと設定ファイルを指定して起動
 • かんたんに使える
• Angel 
 • Haskell製の   daemontoolsクローン
 • 機能:プロセスのデーモン化、監視と再生成
 • Bump    がサーバで使っている
 • 設定ファイルを指定して起動
 • かんたんに使える
もう一つの選択肢
• それは      Scotty
 • http://blog.fujimuradaisuke.com/post/26887032662/haskell-
  de-json-web-api 
 • Yesod   と同様 persistent と aeson を利用
  • persistent:DB周りのORマッパーのようなもの
  • aeson:Json      ライブラリ
 • 依存ライブラリが少ない
 • 総コード量が少ないので、全部を早く把握したい人
  向けかも
  • Yesod の scaffold は総コード量が結構あるので
まとめ
• 手軽に Webプログラミングをスタートできる
  • scaffold
         して MVC を足していくだけ
  • DSL が整えられているので簡単に書ける
• 実用的
  • フレームワークに期待することは一通りできる
  • Cabal   や Travis で自動ビルドやテストもOK
• Haskell   らしいメリットが享受できる
  • 面倒な変換系の処理は Yesod      がやってくれる
  • 開発者は高水準な世界に集中できる
  • Subsite    でかんたんにプラグイン開発
Happy Haskell Web Programming!!

Yesod(at FPM2012)

  • 1.
    Haskell で Webアプリ ∼Yesod を使って面白かったこと ∼ 株式会社ワークスアプリケーションズ 島崎 清山 (@seizans)
  • 2.
    自己紹介 • 島崎清山 (@seizans) • いままで:営業(1年) → 社内SE(1年) → 現職(3年) • おしごと: • Webアプリのセキュリティレビュー • Cloud基盤(AWS)の技術検証とサービス企画・運用 • 趣味:登山、楽器、ゲーム、甘いもの • Haskell歴:1年半(2011年3月∼) • Yesod歴:半年(2012年2月∼) • 最近考えてること:どうやって Haskell で仕事するか
  • 3.
    自己紹介 • Haskell を始めたきっかけ • mayahjp さんへ質問「何すればプログラミングできる ようになりますか?」 • Yesod を始めたきっかけ • Haskell で何か作って運用してみたかった • 期限が決まっているネタがあったので作ってみた
  • 4.
    会社紹介 • 株式会社ワークスアプリケーションズ • ERPパッケージ「COMPANY」(人事給与、会計、等) の開発、販売、保守運用 •グループ社員数 2000 ~ 4000 の間くらい • 研究開発部門では10人くらい趣味で Haskell を読み書き • 随時エンジニアを募集しています
  • 5.
  • 6.
    Web Framework 何があるか •http://www.haskell.org/haskellwiki/Web/Frameworks
  • 7.
    Yesod overview その前に •Yesod Quick Start  • http://www.yesodweb.com/page/quickstart  • 参考用のコード • https://github.com/seizans/yesod-tutorial  • コミットログそれぞれで1つ何かわかるようにしてる • もうちょっと増やしていこうと思っています • いいから書かせろという方はもうどんどん書いてみて ください
  • 8.
    Yesod overview • フルスタックのWeb アプリケーション フレームワーク • Haskell のメリットを活かせるように作られている • 公式サイト:http://www.yesodweb.com/ • ソース:https://github.com/yesodweb/yesod
  • 9.
    Yesod overview • 型システムの恩恵 • TypeSafe URL:サイト内はリンク切れ無し • XSS:文字列をhtmlに埋め込む際にエスケープされる • DB は選べる • PostgreSQL、MySQL、SQLite、MongoDB • セキュリティ:デフォルトで防いでくれる • XSS、CSRF、SQLI は普通にやると入らない • セッションハイジャックもデフォルトで防ぐ(IP見る)
  • 10.
    Yesod overview • パフォーマンス • 速いというベンチマークがある • スケーラブルなセッション機構 • スティッキーではなく、適切に処理されCookie に • DSLで DRY • Model 定義、Routing 定義
  • 11.
    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
  • 12.
    ページを作る • 何を定義すればページができるか? • URL  • URL に対して Resource を定義する • 1行書くだけなので割愛 • Handler (処理) • 具体的な処理を書くので次で説明 • View (テンプレート) • テンプレートでやりたいことはできる • 他の言語でやるのとほぼ変わらないので割愛
  • 13.
    Handler を書く • User テーブルを全件テンプレートに渡してHtmlを返す • UserId でレコード引いて Json を返す(無ければ404)
  • 14.
    Handler を書く • User テーブル用の Form を生成して画面をつくる
  • 15.
    Handler を書く • POST した Form を受けてレコード追加処理を書く • データの変換は自動でやってくれる • bind してくれるのでパターンマッチで取り出す • 失敗の場合は FormFailure か FormMissing になってる
  • 16.
    データ型の話 • 使うデータ型がこんなだとする • やりたいこと •DBテーブルと関連付け • UserName フィールドとか Unique にしたい • Json との変換も自動的にして欲しい
  • 17.
    データ型の話 • これを書けば TH を使ってよろしくやってくれる • やりたかったこと • DBテーブルと関連付け • UserNameフィールドとか Unique にしたい • Json との変換も自動的にして欲しい •※ 実際には数百行のコードに展開されています
  • 18.
    その他の話題 • REST のサポート • Json のやりとりが簡単 • PUT や DELETE の Handler も同様に作れる • Accept ヘッダによって html か Json か自動で変える • 例外があんまり出ないか • ケアが必要な境界領域は Yesod がやってくれる • 一応 DB が落ちてて通信エラー、とかはありえる
  • 19.
    その他の話題 • Subsite  •アプリをモジュール化して使いまわせる仕組み • 例:Auth モジュール、Wiki モジュール • 認証 • ということで公開されてる Subsite を使えばOK • 実は 既にそのアプリに認証機能が入っている • 必要な認証は一通りプラグインが既に作られている • 少し調整して使うだけ
  • 20.
  • 21.
    テスト • 参考資料 •http://www.mew.org/~kazu/material/2012-test.pdf  • Hspec (HUnit の代替品) • 仕様書ライクに書ける単体テスト • QuickCheck  • 性質を書くとテストを自動生成してくれる仕組み • doctest  • ドキュメントに利用例や性質を書き、それを自動的 にテストする仕組み
  • 22.
    テスト • Webアプリケーションのテスト • DB処理のテスト •Handlerのテスト(HTTPリクエストを受けた結果) • 画面系のテスト:JavaScript の領域
  • 23.
    テスト • yesod-test パッケージがテストフレームワークを提供 • scaffold すると tests/HomeTest.hs に例ができてる • HTTP リクエストを作って レスポンスをテストする
  • 24.
    テスト • yesod-test の活用方法 その2 • テスト用 runDB を提供してくれているので • DB処理まわりのテストもOK
  • 25.
    CIツール • Cabal  •.cabalファイルにプロジェクトの各種仕様を記述する • 例)依存ライブラリ、実行コマンド、テスト、... • .cabalファイルに test suites を登録して実行する • yesod init したプロジェクトの .cabal を見ましょう • yesod test コマンドは裏で cabal test をしています
  • 26.
    CIツール • Travis  •http://about.travis-ci.org/docs/  • CIツールのホスティングサービス、Haskell も対応 • Github と連携 • push を hook して処理を回してくれる • 設定ファイル(.travis.yml)を少し書くだけ
  • 27.
    CIツール • Travis  •.travis.yml をこれだけ書けば • push毎に実行
  • 28.
    デプロイ • 標準デプロイツールっぽいの(Keter)開発され中 •一応今でも動く • https://github.com/snoyberg/keter  • Heroku にホスティング • http://taketoncheir.hatenablog.com/entry/ 2012/08/14/020456  • Mighttpd(Haskell製 Webサーバ) を使うとか • http://amkkun.hatenablog.com/entry/2012/08/13/160523
  • 29.
    デプロイ • Mighttpd  •Haskell製の高速Webサーバ • ルーティングと設定ファイルを指定して起動 • かんたんに使える • Angel  • Haskell製の daemontoolsクローン • 機能:プロセスのデーモン化、監視と再生成 • Bump がサーバで使っている • 設定ファイルを指定して起動 • かんたんに使える
  • 30.
    もう一つの選択肢 • それは Scotty • http://blog.fujimuradaisuke.com/post/26887032662/haskell- de-json-web-api  • Yesod と同様 persistent と aeson を利用 • persistent:DB周りのORマッパーのようなもの • aeson:Json ライブラリ • 依存ライブラリが少ない • 総コード量が少ないので、全部を早く把握したい人 向けかも • Yesod の scaffold は総コード量が結構あるので
  • 31.
    まとめ • 手軽に Webプログラミングをスタートできる • scaffold して MVC を足していくだけ • DSL が整えられているので簡単に書ける • 実用的 • フレームワークに期待することは一通りできる • Cabal や Travis で自動ビルドやテストもOK • Haskell らしいメリットが享受できる • 面倒な変換系の処理は Yesod がやってくれる • 開発者は高水準な世界に集中できる • Subsite でかんたんにプラグイン開発
  • 32.
    Happy Haskell WebProgramming!!