32
Haskell Webアプリ Yesod を使って面白かったこと 株式会社ワークスアプリケーションズ 島崎 清山 (@seizans)

Yesod(at FPM2012)

Embed Size (px)

Citation preview

Page 1: Yesod(at FPM2012)

Haskell で Webアプリ~ Yesod を使って面白かったこと ~株式会社ワークスアプリケーションズ

島崎 清山 (@seizans)

Page 2: Yesod(at FPM2012)

自己紹介•島崎清山 (@seizans)

•いままで:営業(1年) → 社内SE(1年) → 現職(3年)

•おしごと:•Webアプリのセキュリティレビュー• Cloud基盤(AWS)の技術検証とサービス企画・運用•趣味:登山、楽器、ゲーム、甘いもの• Haskell歴:1年半(2011年3月~)

• Yesod歴:半年(2012年2月~)

•最近考えてること:どうやって Haskell で仕事するか

Page 3: Yesod(at FPM2012)

自己紹介• Haskell を始めたきっかけ•mayahjp さんへ質問「何すればプログラミングできるようになりますか?」

• Yesod を始めたきっかけ• Haskell で何か作って運用してみたかった•期限が決まっているネタがあったので作ってみた

Page 4: Yesod(at FPM2012)

会社紹介•株式会社ワークスアプリケーションズ• ERPパッケージ「COMPANY」(人事給与、会計、等)

の開発、販売、保守運用•グループ社員数 2000 ~ 4000 の間くらい•研究開発部門では10人くらい趣味で Haskell を読み書き•随時エンジニアを募集しています

Page 5: Yesod(at FPM2012)

名古屋といえば•名古屋国際会議場

•名古屋・・・また行きたいですね・・・

Page 6: Yesod(at FPM2012)

Web Framework 何があるか• http://www.haskell.org/haskellwiki/Web/Frameworks

Page 7: Yesod(at FPM2012)

Yesod overview その前に• Yesod Quick Start • http://www.yesodweb.com/page/quickstart •参考用のコード• https://github.com/seizans/yesod-tutorial •コミットログそれぞれで1つ何かわかるようにしてる•もうちょっと増やしていこうと思っています

•いいから書かせろという方はもうどんどん書いてみてください

Page 8: Yesod(at FPM2012)

Yesod overview•フルスタックの Web アプリケーション フレームワーク• Haskell のメリットを活かせるように作られている•公式サイト:http://www.yesodweb.com/

•ソース:https://github.com/yesodweb/yesod

Page 9: Yesod(at FPM2012)

Yesod overview•型システムの恩恵• Type Safe URL:サイト内はリンク切れ無し• XSS:文字列をhtmlに埋め込む際にエスケープされる•DB は選べる• PostgreSQL、MySQL、SQLite、MongoDB

•セキュリティ:デフォルトで防いでくれる• XSS、CSRF、SQLI は普通にやると入らない•セッションハイジャックもデフォルトで防ぐ(IP見る)

Page 10: Yesod(at FPM2012)

Yesod overview•パフォーマンス•速いというベンチマークがある•スケーラブルなセッション機構•スティッキーではなく、適切に処理されCookie に

•DSL で DRY

•Model 定義、Routing 定義

Page 11: Yesod(at FPM2012)

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

Page 12: Yesod(at FPM2012)

ページを作る•何を定義すればページができるか?• URL • URL に対して Resource を定義する• 1行書くだけなので割愛• Handler (処理)

•具体的な処理を書くので次で説明• View (テンプレート)•テンプレートでやりたいことはできる•他の言語でやるのとほぼ変わらないので割愛

Page 13: Yesod(at FPM2012)

Handler を書く• User テーブルを全件テンプレートに渡してHtmlを返す

• UserId でレコード引いて Json を返す(無ければ404)

Page 14: Yesod(at FPM2012)

Handler を書く• User テーブル用の Form を生成して画面をつくる

Page 15: Yesod(at FPM2012)

Handler を書く• POST した Form を受けてレコード追加処理を書く

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

Page 16: Yesod(at FPM2012)

データ型の話•使うデータ型がこんなだとする

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

Page 17: Yesod(at FPM2012)

データ型の話•これを書けば TH を使ってよろしくやってくれる

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

• ※ 実際には数百行のコードに展開されています

Page 18: Yesod(at FPM2012)

その他の話題• REST のサポート• Json のやりとりが簡単• PUT や DELETE の Handler も同様に作れる• Accept ヘッダによって html か Json か自動で変える•例外があんまり出ないか•ケアが必要な境界領域は Yesod がやってくれる•一応 DB が落ちてて通信エラー、とかはありえる

Page 19: Yesod(at FPM2012)

その他の話題• Subsite •アプリをモジュール化して使いまわせる仕組み•例:Auth モジュール、Wiki モジュール•認証•ということで公開されてる Subsite を使えばOK

•実は 既にそのアプリに認証機能が入っている•必要な認証は一通りプラグインが既に作られている•少し調整して使うだけ

Page 20: Yesod(at FPM2012)

環境とか•テスト• CIツールの活用•デプロイ

Page 21: Yesod(at FPM2012)

テスト•参考資料• http://www.mew.org/~kazu/material/2012-test.pdf • Hspec (HUnit の代替品)•仕様書ライクに書ける単体テスト•QuickCheck •性質を書くとテストを自動生成してくれる仕組み• doctest •ドキュメントに利用例や性質を書き、それを自動的にテストする仕組み

Page 22: Yesod(at FPM2012)

テスト•Webアプリケーションのテスト•DB処理のテスト• Handlerのテスト(HTTPリクエストを受けた結果)•画面系のテスト:JavaScript の領域

Page 23: Yesod(at FPM2012)

テスト• yesod-test パッケージがテストフレームワークを提供• scaffold すると tests/HomeTest.hs に例ができてる• HTTP リクエストを作って レスポンスをテストする

Page 24: Yesod(at FPM2012)

テスト• yesod-test の活用方法 その2•テスト用 runDB を提供してくれているので•DB処理まわりのテストもOK

Page 25: Yesod(at FPM2012)

CIツール• Cabal • .cabalファイルにプロジェクトの各種仕様を記述する•例)依存ライブラリ、実行コマンド、テスト、...

• .cabalファイルに test suites を登録して実行する• yesod init したプロジェクトの .cabal を見ましょう• yesod test コマンドは裏で cabal test をしています

Page 26: Yesod(at FPM2012)

CIツール• Travis • http://about.travis-ci.org/docs/ • CIツールのホスティングサービス、Haskell も対応• Github と連携• push を hook して処理を回してくれる•設定ファイル(.travis.yml)を少し書くだけ

Page 27: Yesod(at FPM2012)

CIツール• Travis • .travis.yml をこれだけ書けば

• push毎に実行

Page 28: Yesod(at FPM2012)

デプロイ•標準デプロイツールっぽいの(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

Page 29: Yesod(at FPM2012)

デプロイ•Mighttpd • Haskell製の高速Webサーバ•ルーティングと設定ファイルを指定して起動•かんたんに使える• Angel • Haskell製の daemontoolsクローン•機能:プロセスのデーモン化、監視と再生成• Bump がサーバで使っている•設定ファイルを指定して起動•かんたんに使える

Page 30: Yesod(at FPM2012)

もう一つの選択肢•それは Scotty

• http://blog.fujimuradaisuke.com/post/26887032662/haskell-de-json-web-api • Yesod と同様 persistent と aeson を利用• persistent:DB周りのORマッパーのようなもの• aeson:Json ライブラリ•依存ライブラリが少ない•総コード量が少ないので、全部を早く把握したい人向けかも• Yesod の scaffold は総コード量が結構あるので

Page 31: Yesod(at FPM2012)

まとめ•手軽に Webプログラミングをスタートできる• scaffold して MVC を足していくだけ•DSL が整えられているので簡単に書ける•実用的•フレームワークに期待することは一通りできる• Cabal や Travis で自動ビルドやテストもOK

• Haskell らしいメリットが享受できる•面倒な変換系の処理は Yesod がやってくれる•開発者は高水準な世界に集中できる• Subsite でかんたんにプラグイン開発

Page 32: Yesod(at FPM2012)

Happy Haskell Web Programming!!