HaskellでWebアプリづくり∼WebアプリケーションフレームワークYesod∼    株式会社ワークスアプリケーションズ        島崎 清山 (@seizans)
はじめに• 今日使うプロジェクトを作成します  • cd   • cat   .bash_profile >> .bashrc   •.   .bashrc             init  • コマンド:yesod  • 自分の名前は任意  ...
「関数型言語」でのプログラミングをしたことの有無は?
「関数型言語」は純粋な処理は得意だけど IO処理は苦手?
目的• フレームワーク Yesod    を使うことで・・・ • Haskell     での Webアプリ開発が手軽に始められること  を実感する • Haskell   で Webアプリが十分に実用的に開発できるこ   とを実感する • H...
自己紹介• 勤務:ワークスアプリケーションズ         研究開発部門 • 前職:エン・ジャパン      企画営業 (2009年5月まで2年)• 職務内容: • Webアプリのセキュリティレビュー • Cloud基盤(AWS)の技術検証と...
自己紹介• Haskell   を始めたきっかけ  • 元同僚への質問「何すればプログラミングできるよ   うになりますか?」• Yesod   を始めたきっかけ  • Haskell       で何か作って運用してみたかった  • 期限が決...
会社紹介• 株式会社ワークスアプリケーションズ• ERPパッケージ「COMPANY」(人事給与、会計、等)の開発、販売、保守運用• グループ社員数   2000 ~ 4000 の間くらい• 研究開発部門では10人くらい趣味で       Has...
Agenda• Haskell   について• Yesod について• Yesod でプログラミング• まとめ
Haskell で書くメリット(抜粋)• 強力な型推論を含む静的型付け  • 型に関わる実行時エラーはコンパイル時に防止  • 型は必要最小限だけ書いても動いてくれる• Null   をなくすことに成功  • Null      Pointer...
Haskell で書くメリット(抜粋)• 関数が柔軟に使えるようになっています• パターンは1つの関数にできます• 関数を見た瞬間に把握できるので可読性が良いです• 他にもいろいろなメリットがあります• どのような問題解決をしてメリットを生み出...
Haskell の入門書• 左:「プログラミングHaskell」• 右:「すごいHaskellたのしく学ぼう!」
Haskellアプリ:Monadius• Haskellで書かれたグラディウス(ゲーム)• 2005年制作(未確認)• 村主さん(@nushio         さん、すごいHaskell訳者)制作• http://www.geocities....
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...
ハンズオンの目標• ~/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 につ...
2.hamlet と Widget で遊ぶ• 参考URL• https://github.com/seizans/yesod-tutorial/commits/master• hamlet内のこと  • <p> に対する閉じタグは不要  • ^...
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   ヘ...
その他の話題• 認証 • 実は既にそのアプリに認証機能が入っている • 必要な認証は一通りプラグインが既に作られている • 少し調整して使うだけ• Subsite  • アプリをモジュール化して使いまわせる仕組み • 例:Auth    モジュ...
実用• テスト• CIツールの活用• デプロイ
実用:テスト• Hspec   (HUnit の代替品) • 仕様書ライクに書ける単体テスト • Ruby   由来• QuickCheck  • 性質を書くとテストを自動生成してくれる仕組み • Haskell   由来 • doctest ...
実用:テスト• Webアプリケーションのテスト• DB処理のテスト• Handlerのテスト(HTTPリクエストを受けた結果)• 画面系のテスト:JavaScript   の領域
実用:テスト• yesod-test   パッケージがテストフレームワークを提供  • tests/HomeTest.hs              に例があります  • HTTP リクエストを作って レスポンスをテストする
実用:テスト• yesod-test   の活用方法 その2  • テスト用 runDB を提供してくれているので  • DB処理まわりのテストも書ける
実用:CIツール• Cabal  • .cabalファイルにプロジェクトの各種仕様を記述する   • 例)依存ライブラリ、実行コマンド、テスト、... • .cabalファイルに   test suites を登録して実行する   • yeso...
実用:CIツール• Travis  • CIツールのホスティングサービス、Haskell    も対応 • Github と連携 (Github アカウントが必要)   • push   を hook して処理を回してくれる   • 設定ファイ...
実用:CIツール• Travis  • .travis.yml   をこれだけ書けば • push毎に実行
実用:デプロイ• Keter   を使って nginx と連携  • Snoyman          さんが活発に開発中• Heroku にホスティング  • 参考資料のブログを参照• Mighttpd(Haskell製 Webサーバ)   ...
実用:デプロイ• Mighttpd  • Haskell製の高速Webサーバ • ルーティングと設定ファイルを指定して起動 • かんたんに使える• Angel  • Haskell製の   daemontoolsクローン • 機能:プロセスのデ...
実用:デプロイ• 配布したイメージには設定ファイル配置済みなので• cd    haskell/hello •   sudo ~/haskell/angel/cabal-dev/bin/angel ~/haskell/angel/angel.c...
実用:参考資料• テスト • Haskellで Behavior Driven Development • HaskellとテストとBDD - あどけない話• CIツール • Cabal  User Guide  • Travis CI • デ...
Yesod まとめ• 手軽に Webプログラミングをスタートできる  • scaffold         して MVC を足していくだけ  • DSL が整えられているので簡単に書ける• 十分に実用的  • フレームワークに期待することは一通...
本日のまとめ• Haskell   や Yesod を使うメリットがある  • 高機能:問題解決をした結果として    • 問題解決の方法として学ぶのも面白いかも    • 開発者がやる必要ないことを基盤側がやってくれる      • 開発者が...
Happy Haskell Web Programming!!
Upcoming SlideShare
Loading in...5
×

Ppl

2,638

Published on

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,638
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
18
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Ppl

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

    Clipping is a handy way to collect important slides you want to go back to later.

×