みんなでWAIWAI Webアプリ
Upcoming SlideShare
Loading in...5
×
 

みんなでWAIWAI Webアプリ

on

  • 848 views

 

Statistics

Views

Total Views
848
Views on SlideShare
848
Embed Views
0

Actions

Likes
2
Downloads
1
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

みんなでWAIWAI Webアプリ みんなでWAIWAI Webアプリ Presentation Transcript

  • みんなでWAIWAI Webアプリ Kiwamu Okabe
  • Web流行ってますね猫も杓子もWebアプリ。WebアプリをHaskellでも作れると=> モテモテ?
  • WebアプリといえばRails近年のWebアプリは↓の連携で設計するみたい。☆ Webアプリ☆ Webアプリケーションフレームワーク☆ Webサーバ
  • アプリとサーバの連携はどうやる?WSGIとかRackが有名みたい。* http://www.python.org/dev/peps/pep-0333/* http://rack.github.com/☆ Webアプリケーションフレームワーク☆ Webサーバの界面をAPI化したものらしい。CGIしかなかった20世紀からずいぶん遠くへ。
  • アプリとサーバを分離(Rackの場合)require rubygemsrequire rackclass HelloWorld def call(env) [200, {"Content-Type" => "text/html"}, "Hello Rack!"] endendRack::Handler::Mongrel.run HelloWorld.new, :Port => 9292みごとにcallメソッドで分離されてます。
  • そーゆーのHaskellにないの?WAIってのがありますよ。
  • WAIのインターフェイスWebアプリケーションフレームワークの例-- wai-app-staticstaticApp :: StaticSettings -> Application-- wai-app-file-cgicgiApp :: ClassicAppSpec -> CgiAppSpec -> CgiRoute -> ApplicationWebサーバの例-- warprun :: Port -> Application -> IO ()-- wai-extrarunSendfile :: B.ByteString -> Application -> IO ()-- wai-handler-webkitrun :: String -> Application -> IO ()Application型がキモ。
  • じゃあ作ってみようファイルの中身返すだけのWebサーバ。 使用ライブラリは以下。☆ フレームワーク: wai-app-static☆ サーバ: Warp
  • 材料1: Warprun関数を使えば簡単そう。
  • 材料2: wai-app-static その1Application作りたいんだけど、StaticSettingsってのはどこから?
  • 材料3: wai-app-static その2ルートディレクトリを指定したらイイ感じなStaticSettingsを作ってくれる関数発見。
  • できたコード{-# LANGUAGE OverloadedStrings #-}import Network.Waiimport Network.Wai.Handler.Warpimport Network.Wai.Application.StaticmyWaiApp :: ApplicationmyWaiApp = staticApp $ defaultFileServerSettings "."main :: IO ()main = run 9191 myWaiApphttp://localhost:9191 をWebブラウザで見てみましょう。
  • Webサーバをすげ替えることも{-# LANGUAGE OverloadedStrings #-}import Network.Waiimport Network.Wai.Handler.Webkitimport Network.Wai.Application.StaticmyWaiApp :: ApplicationmyWaiApp = staticApp $ defaultFileServerSettings "."main :: IO ()main = run "MyWaiApp" myWaiAppWebkitのウィンドウが起動して、その中でWebアプリが動く。
  • ちょっとまともなApplication{-# LANGUAGE OverloadedStrings #-}import qualified Network.Wai as Wimport qualified Network.HTTP.Types as Himport qualified Network.Wai.Handler.Warp as WPimport qualified Data.ByteString.Lazy as Lheader :: H.ResponseHeaders -- [(HeaderName, ByteString)]header = [("Content-Type", "text/plain")]myWaiApp :: W.Application -- Request -> ResourceT IO ResponsemyWaiApp req | W.requestMethod req /= "GET" = return r where r = W.responseLBS H.status405 header "Only GET is supported"myWaiApp req = return r where s = "Path:" `L.append` L.fromChunks [W.rawPathInfo req] r = W.responseLBS H.status200 header smain :: IO ()main = WP.run 9191 myWaiApp
  • 参考資料* 「(続) Haskell で Web サーバーを実装してみました」 山本和彦 http://www.mew.org/~kazu/material/2011-mighttpd2.pdf* 「WAI」パッケージ http://hackage.haskell.org/package/wai* 「Warp」パッケージ http://hackage.haskell.org/package/warp* 「wai-app-static」パッケージ http://hackage.haskell.org/package/wai-app-static