SlideShare ist ein Scribd-Unternehmen logo
1 von 42
Downloaden Sie, um offline zu lesen
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!!

Weitere ähnliche Inhalte

Was ist angesagt?

SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews, Inc.
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すTakaya Saeki
 
Scalaでプログラムを作りました
Scalaでプログラムを作りましたScalaでプログラムを作りました
Scalaでプログラムを作りましたTomoharu ASAMI
 
Sbtのマルチプロジェクトはいいぞ
SbtのマルチプロジェクトはいいぞSbtのマルチプロジェクトはいいぞ
SbtのマルチプロジェクトはいいぞYoshitaka Fujii
 
Closure Compiler Updates for ES6
Closure Compiler Updates for ES6Closure Compiler Updates for ES6
Closure Compiler Updates for ES6Teppei Sato
 
SQLによるDynamoDBの操作
SQLによるDynamoDBの操作SQLによるDynamoDBの操作
SQLによるDynamoDBの操作Sugawara Genki
 
Build Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.jsBuild Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.jsmganeko
 
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略Teppei Sato
 
AWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguroAWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguroKenta Suzuki
 
081108huge_data.ppt
081108huge_data.ppt081108huge_data.ppt
081108huge_data.pptNaoya Ito
 
Scala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jsScala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jstakezoe
 
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知るPHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知るMasashi Shinbara
 
Service worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたちService worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたちKinuko Yasuda
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテストYoichiro Sakurai
 
Scala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaScala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaKazuhiro Sera
 
Capistrano in practice - WebCareer
Capistrano in practice - WebCareerCapistrano in practice - WebCareer
Capistrano in practice - WebCareerKyosuke MOROHASHI
 
Sphinxでドキュメントを書こう
Sphinxでドキュメントを書こうSphinxでドキュメントを書こう
Sphinxでドキュメントを書こうKazufumi Ohkawa
 
Jenkinsとhadoopを利用した継続的データ解析環境の構築
Jenkinsとhadoopを利用した継続的データ解析環境の構築Jenkinsとhadoopを利用した継続的データ解析環境の構築
Jenkinsとhadoopを利用した継続的データ解析環境の構築Kenta Suzuki
 
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12Ryuji Yamashita
 
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)Eugene Yokota
 

Was ist angesagt? (20)

SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
 
Scalaでプログラムを作りました
Scalaでプログラムを作りましたScalaでプログラムを作りました
Scalaでプログラムを作りました
 
Sbtのマルチプロジェクトはいいぞ
SbtのマルチプロジェクトはいいぞSbtのマルチプロジェクトはいいぞ
Sbtのマルチプロジェクトはいいぞ
 
Closure Compiler Updates for ES6
Closure Compiler Updates for ES6Closure Compiler Updates for ES6
Closure Compiler Updates for ES6
 
SQLによるDynamoDBの操作
SQLによるDynamoDBの操作SQLによるDynamoDBの操作
SQLによるDynamoDBの操作
 
Build Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.jsBuild Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.js
 
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
 
AWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguroAWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguro
 
081108huge_data.ppt
081108huge_data.ppt081108huge_data.ppt
081108huge_data.ppt
 
Scala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jsScala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.js
 
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知るPHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知る
 
Service worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたちService worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたち
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテスト
 
Scala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaScala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscala
 
Capistrano in practice - WebCareer
Capistrano in practice - WebCareerCapistrano in practice - WebCareer
Capistrano in practice - WebCareer
 
Sphinxでドキュメントを書こう
Sphinxでドキュメントを書こうSphinxでドキュメントを書こう
Sphinxでドキュメントを書こう
 
Jenkinsとhadoopを利用した継続的データ解析環境の構築
Jenkinsとhadoopを利用した継続的データ解析環境の構築Jenkinsとhadoopを利用した継続的データ解析環境の構築
Jenkinsとhadoopを利用した継続的データ解析環境の構築
 
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
 
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
 

Andere mochten auch

PFIセミナー 2013/02/28 「プログラミング言語の今」
PFIセミナー 2013/02/28 「プログラミング言語の今」PFIセミナー 2013/02/28 「プログラミング言語の今」
PFIセミナー 2013/02/28 「プログラミング言語の今」Preferred Networks
 
Yesod でブログエンジンをつくってみた
Yesod でブログエンジンをつくってみたYesod でブログエンジンをつくってみた
Yesod でブログエンジンをつくってみたHiromi Ishii
 
2015 lodc&UDC ゴミ多言語変換用データ基盤
2015 lodc&UDC ゴミ多言語変換用データ基盤2015 lodc&UDC ゴミ多言語変換用データ基盤
2015 lodc&UDC ゴミ多言語変換用データ基盤Takuya Yamagata
 
Streaming data processing ライブラリの紹介 (主に Conduit)
Streaming data processing ライブラリの紹介 (主に Conduit)Streaming data processing ライブラリの紹介 (主に Conduit)
Streaming data processing ライブラリの紹介 (主に Conduit)krdlab
 
Session2:「グローバル化する情報処理」/伊藤敬彦
Session2:「グローバル化する情報処理」/伊藤敬彦Session2:「グローバル化する情報処理」/伊藤敬彦
Session2:「グローバル化する情報処理」/伊藤敬彦Preferred Networks
 
怪しいWindowsプログラミング
怪しいWindowsプログラミング怪しいWindowsプログラミング
怪しいWindowsプログラミングnagoya313
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
IdrisでWebアプリを書く
IdrisでWebアプリを書くIdrisでWebアプリを書く
IdrisでWebアプリを書くHideyuki Tanaka
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
大規模Redisサーバ縮小化の戦い
大規模Redisサーバ縮小化の戦い大規模Redisサーバ縮小化の戦い
大規模Redisサーバ縮小化の戦いYuto Komai
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
Seo camp paris - A chaque enjeu, sa stratégie - Tips & REX
Seo camp paris - A chaque enjeu, sa stratégie - Tips & REX Seo camp paris - A chaque enjeu, sa stratégie - Tips & REX
Seo camp paris - A chaque enjeu, sa stratégie - Tips & REX Intuiti
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with DataSeth Familian
 

Andere mochten auch (17)

Monad tutorial
Monad tutorialMonad tutorial
Monad tutorial
 
PFIセミナー 2013/02/28 「プログラミング言語の今」
PFIセミナー 2013/02/28 「プログラミング言語の今」PFIセミナー 2013/02/28 「プログラミング言語の今」
PFIセミナー 2013/02/28 「プログラミング言語の今」
 
Yesod でブログエンジンをつくってみた
Yesod でブログエンジンをつくってみたYesod でブログエンジンをつくってみた
Yesod でブログエンジンをつくってみた
 
2015 lodc&UDC ゴミ多言語変換用データ基盤
2015 lodc&UDC ゴミ多言語変換用データ基盤2015 lodc&UDC ゴミ多言語変換用データ基盤
2015 lodc&UDC ゴミ多言語変換用データ基盤
 
Streaming data processing ライブラリの紹介 (主に Conduit)
Streaming data processing ライブラリの紹介 (主に Conduit)Streaming data processing ライブラリの紹介 (主に Conduit)
Streaming data processing ライブラリの紹介 (主に Conduit)
 
Digital Signature and PKI
Digital Signature and PKIDigital Signature and PKI
Digital Signature and PKI
 
Session2:「グローバル化する情報処理」/伊藤敬彦
Session2:「グローバル化する情報処理」/伊藤敬彦Session2:「グローバル化する情報処理」/伊藤敬彦
Session2:「グローバル化する情報処理」/伊藤敬彦
 
Icfp2009
Icfp2009Icfp2009
Icfp2009
 
怪しいWindowsプログラミング
怪しいWindowsプログラミング怪しいWindowsプログラミング
怪しいWindowsプログラミング
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
Xpath in-lens
Xpath in-lensXpath in-lens
Xpath in-lens
 
IdrisでWebアプリを書く
IdrisでWebアプリを書くIdrisでWebアプリを書く
IdrisでWebアプリを書く
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
大規模Redisサーバ縮小化の戦い
大規模Redisサーバ縮小化の戦い大規模Redisサーバ縮小化の戦い
大規模Redisサーバ縮小化の戦い
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
Seo camp paris - A chaque enjeu, sa stratégie - Tips & REX
Seo camp paris - A chaque enjeu, sa stratégie - Tips & REX Seo camp paris - A chaque enjeu, sa stratégie - Tips & REX
Seo camp paris - A chaque enjeu, sa stratégie - Tips & REX
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
 

Ähnlich wie Ppl

TokyoWebminig カジュアルなHadoop
TokyoWebminig カジュアルなHadoopTokyoWebminig カジュアルなHadoop
TokyoWebminig カジュアルなHadoopTeruo Kawasaki
 
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践日本マイクロソフト株式会社
 
作る人から作りながら運用する人になっていく
作る人から作りながら運用する人になっていく作る人から作りながら運用する人になっていく
作る人から作りながら運用する人になっていくRyo Mitoma
 
Firefoxの開発プロセス
Firefoxの開発プロセスFirefoxの開発プロセス
Firefoxの開発プロセスMakoto Kato
 
fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングYuichi Tateno
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでRyo Nakamaru
 
OSvのご紹介 in 
Java 8 HotSpot meeting
OSvのご紹介 in 
Java 8 HotSpot meetingOSvのご紹介 in 
Java 8 HotSpot meeting
OSvのご紹介 in 
Java 8 HotSpot meetingTakuya ASADA
 
The seminar of asp.net at 201908 sakurug
The seminar of asp.net at 201908 sakurugThe seminar of asp.net at 201908 sakurug
The seminar of asp.net at 201908 sakurugSAKURUG co.
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発日本マイクロソフト株式会社
 
Aspnet mvc 6の今を紹介
Aspnet mvc 6の今を紹介Aspnet mvc 6の今を紹介
Aspnet mvc 6の今を紹介Makoto Nishimura
 
Jenkins study jenkins build-cicdi
Jenkins study jenkins build-cicdiJenkins study jenkins build-cicdi
Jenkins study jenkins build-cicdi昌桓 李
 
AndroidでActiveRecordライクにDBを使う
AndroidでActiveRecordライクにDBを使うAndroidでActiveRecordライクにDBを使う
AndroidでActiveRecordライクにDBを使うFujimura Munehiko
 
PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門じゅん なかざ
 
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話Yahoo!デベロッパーネットワーク
 
OpenWhisk - Docker action で MeCab を動かす
OpenWhisk - Docker action で MeCab を動かすOpenWhisk - Docker action で MeCab を動かす
OpenWhisk - Docker action で MeCab を動かすKUNITO Atsunori
 
2015-12-16 某S社、出直しDDDってるってよ
2015-12-16 某S社、出直しDDDってるってよ2015-12-16 某S社、出直しDDDってるってよ
2015-12-16 某S社、出直しDDDってるってよkumake
 

Ähnlich wie Ppl (20)

TokyoWebminig カジュアルなHadoop
TokyoWebminig カジュアルなHadoopTokyoWebminig カジュアルなHadoop
TokyoWebminig カジュアルなHadoop
 
Clrh 110827 wfho
Clrh 110827 wfhoClrh 110827 wfho
Clrh 110827 wfho
 
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
 
作る人から作りながら運用する人になっていく
作る人から作りながら運用する人になっていく作る人から作りながら運用する人になっていく
作る人から作りながら運用する人になっていく
 
Firefoxの開発プロセス
Firefoxの開発プロセスFirefoxの開発プロセス
Firefoxの開発プロセス
 
fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギング
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
 
OSvのご紹介 in 
Java 8 HotSpot meeting
OSvのご紹介 in 
Java 8 HotSpot meetingOSvのご紹介 in 
Java 8 HotSpot meeting
OSvのご紹介 in 
Java 8 HotSpot meeting
 
The seminar of asp.net at 201908 sakurug
The seminar of asp.net at 201908 sakurugThe seminar of asp.net at 201908 sakurug
The seminar of asp.net at 201908 sakurug
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
 
20090328
2009032820090328
20090328
 
Aspnet mvc 6の今を紹介
Aspnet mvc 6の今を紹介Aspnet mvc 6の今を紹介
Aspnet mvc 6の今を紹介
 
Jenkins study jenkins build-cicdi
Jenkins study jenkins build-cicdiJenkins study jenkins build-cicdi
Jenkins study jenkins build-cicdi
 
AndroidでActiveRecordライクにDBを使う
AndroidでActiveRecordライクにDBを使うAndroidでActiveRecordライクにDBを使う
AndroidでActiveRecordライクにDBを使う
 
JavaScript 研修
JavaScript 研修JavaScript 研修
JavaScript 研修
 
PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門
 
Java in the World of Container by David Buck
Java in the World of Container by David BuckJava in the World of Container by David Buck
Java in the World of Container by David Buck
 
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
 
OpenWhisk - Docker action で MeCab を動かす
OpenWhisk - Docker action で MeCab を動かすOpenWhisk - Docker action で MeCab を動かす
OpenWhisk - Docker action で MeCab を動かす
 
2015-12-16 某S社、出直しDDDってるってよ
2015-12-16 某S社、出直しDDDってるってよ2015-12-16 某S社、出直しDDDってるってよ
2015-12-16 某S社、出直しDDDってるってよ
 

Mehr von Seizan Shimazaki

Mehr von Seizan Shimazaki (7)

PFDS8.1
PFDS8.1PFDS8.1
PFDS8.1
 
20120527yesod
20120527yesod20120527yesod
20120527yesod
 
Yesod and Auth
Yesod and AuthYesod and Auth
Yesod and Auth
 
Pfds20120304
Pfds20120304Pfds20120304
Pfds20120304
 
Cryptography
CryptographyCryptography
Cryptography
 
一方向ハッシュ関数(One-way Hash Function)
一方向ハッシュ関数(One-way Hash Function)一方向ハッシュ関数(One-way Hash Function)
一方向ハッシュ関数(One-way Hash Function)
 
メッセージ認証コード(Message Authentication Code)
メッセージ認証コード(Message Authentication Code)メッセージ認証コード(Message Authentication Code)
メッセージ認証コード(Message Authentication Code)
 

Ppl

  • 1. HaskellでWebアプリづくり ∼WebアプリケーションフレームワークYesod∼ 株式会社ワークスアプリケーションズ 島崎 清山 (@seizans)
  • 2. はじめに • 今日使うプロジェクトを作成します • cd  • cat .bash_profile >> .bashrc  •. .bashrc  init • コマンド:yesod • 自分の名前は任意 • プロジェクト名も任意 • DBは s (SQLite) を選択してください • cd (プロジェクト名) で移動 • cabal-dev install で必要ライブラリのインストール
  • 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 してデータ新規作成をするページ • データのリストビューを見れるページ • 今あるデータを変更するページ • まずはコードを見つつ解説を少し
  • 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 モジュール
  • 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 Web Programming!!