Haskell で Webアプリ∼ Yesod を使って面白かったこと ∼ 株式会社ワークスアプリケーションズ     島崎 清山 (@seizans)
自己紹介• 島崎清山   (@seizans)• いままで:営業(1年)         → 社内SE(1年) → 現職(3年)• おしごと: • Webアプリのセキュリティレビュー • Cloud基盤(AWS)の技術検証とサービス企画・運用•...
自己紹介• Haskell   を始めたきっかけ  • mayahjp      さんへ質問「何すればプログラミングできる   ようになりますか?」• Yesod   を始めたきっかけ  • Haskell       で何か作って運用してみた...
会社紹介• 株式会社ワークスアプリケーションズ• ERPパッケージ「COMPANY」(人事給与、会計、等)の開発、販売、保守運用• グループ社員数   2000 ~ 4000 の間くらい• 研究開発部門では10人くらい趣味で       Has...
名古屋といえば• 名古屋国際会議場• 名古屋・・・また行きたいですね・・・
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 overview• フルスタックの Web        アプリケーション フレームワーク• Haskell     のメリットを活かせるように作られている• 公式サイト:http://www.yesodweb.com/• ソース:...
Yesod overview• 型システムの恩恵 • TypeSafe URL:サイト内はリンク切れ無し • XSS:文字列をhtmlに埋め込む際にエスケープされる• DB   は選べる • PostgreSQL、MySQL、SQLite、Mo...
Yesod overview• パフォーマンス • 速いというベンチマークがある • スケーラブルなセッション機構   • スティッキーではなく、適切に処理されCookie   に• DSLで DRY • Model 定義、Routing 定義
Yesod の始め方• Haskell-Platform   をインストール:割愛• Yesod をインストール:  • cabal install yesod-platform • Yesod   プロジェクトを作成して build  • y...
ページを作る• 何を定義すればページができるか?• URL  • URL   に対して Resource を定義する • 1行書くだけなので割愛• Handler      (処理) • 具体的な処理を書くので次で説明• View   (テンプ...
Handler を書く• User   テーブルを全件テンプレートに渡してHtmlを返す• UserId   でレコード引いて Json を返す(無ければ404)
Handler を書く• User   テーブル用の Form を生成して画面をつくる
Handler を書く• POST    した Form を受けてレコード追加処理を書く • データの変換は自動でやってくれる • bind     してくれるのでパターンマッチで取り出す • 失敗の場合は FormFailure か Form...
データ型の話• 使うデータ型がこんなだとする• やりたいこと• DBテーブルと関連付け• UserName   フィールドとか Unique にしたい• Json   との変換も自動的にして欲しい
データ型の話• これを書けば TH   を使ってよろしくやってくれる• やりたかったこと • DBテーブルと関連付け • UserNameフィールドとか Unique にしたい • Json との変換も自動的にして欲しい•※   実際には数百行...
その他の話題• REST    のサポート • Json      のやりとりが簡単 • PUT や DELETE の Handler も同様に作れる • Accept   ヘッダによって html か Json か自動で変える• 例外があんま...
その他の話題• Subsite  • アプリをモジュール化して使いまわせる仕組み • 例:Auth    モジュール、Wiki モジュール• 認証 • ということで公開されてる Subsite を使えばOK • 実は 既にそのアプリに認証機能が...
環境とか• テスト• CIツールの活用• デプロイ
テスト• 参考資料 • http://www.mew.org/~kazu/material/2012-test.pdf • Hspec   (HUnit の代替品) • 仕様書ライクに書ける単体テスト• QuickCheck  • 性質を書くと...
テスト• 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 i...
CIツール• Travis  • http://about.travis-ci.org/docs/  • CIツールのホスティングサービス、Haskell            も対応 • Github   と連携   • push      ...
CIツール• Travis  • .travis.yml   をこれだけ書けば • push毎に実行
デプロイ• 標準デプロイツールっぽいの(Keter)開発され中 • 一応今でも動く • https://github.com/snoyberg/keter • Heroku   にホスティング • http://taketoncheir.hat...
デプロイ• Mighttpd  • Haskell製の高速Webサーバ • ルーティングと設定ファイルを指定して起動 • かんたんに使える• Angel  • Haskell製の   daemontoolsクローン • 機能:プロセスのデーモン...
もう一つの選択肢• それは      Scotty • http://blog.fujimuradaisuke.com/post/26887032662/haskell-  de-json-web-api  • Yesod   と同様 pers...
まとめ• 手軽に Webプログラミングをスタートできる  • scaffold         して MVC を足していくだけ  • DSL が整えられているので簡単に書ける• 実用的  • フレームワークに期待することは一通りできる  • C...
Happy Haskell Web Programming!!
Upcoming SlideShare
Loading in …5
×

Yesod(at FPM2012)

3,406 views

Published on

Published in: Technology

Yesod(at FPM2012)

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

×