F# と Erlang で簡単なゲームを作って
             みている

       pocketberserker


      2012 年 11 月 24 日
お前誰よ?




• 中山 / なかやん / ぺんぎん /
    @pocketberserker
•   どこにでもいるふつーのサーガ大学院生
•   F# / Haskell / Erlang / Scala / TDD / テスト
•   関数プログラミング≒私の人生を変えたもの
•   FSharpx/Scalaz のこんとりびゅーたらしい…
突然ですが質問です
突然ですが質問です



実用っぽい英単語はどれ?
突然ですが質問です



実用っぽい英単語はどれ?
 • practical
突然ですが質問です



実用っぽい英単語はどれ?
 • practical
 • functional
突然ですが質問です



実用っぽい英単語はどれ?
 • practical
 • functional
 • applicative
実際
実際




どれも正解
でも○○こわいなので




おとなしく practical な話(?)をします
• 理論理論したことは話せません、たぶん
• 理論理論したことは話せません、たぶん
• 突っ込みは随時どうぞ
• 理論理論したことは話せません、たぶん
• 突っ込みは随時どうぞ
• 本発表に登場する一部物語はそこそこフィク
 ションです
あるときのこと
あるときのこと




「ぺんぎん君、君の技量を測るために作って欲し
      いものがあるのだが」
渡された仕様
渡された仕様



• お題は簡単なシューティングゲーム
渡された仕様



• お題は簡単なシューティングゲーム
• Win か Mac で動くことが望ましい
渡された仕様



• お題は簡単なシューティングゲーム
• Win か Mac で動くことが望ましい
• 言語、ライブラリ、フレームワーク、プラッ
 トフォームすべて自由
だったら関数プロ
グラミングるしか
   ない!
当初の選択肢
当初の選択肢



• Unity3D + C# + F# (外部ライブラリ)
当初の選択肢



• Unity3D + C# + F# (外部ライブラリ)
• F# + WebSharper
当初の選択肢



• Unity3D + C# + F# (外部ライブラリ)
• F# + WebSharper
• Scala + Play 2 + 何か
当初の選択肢



• Unity3D + C# + F# (外部ライブラリ)
• F# + WebSharper
• Scala + Play 2 + 何か
• フル Haskell でがんがる
結局、F# F# したいので F# + WebSharper を選択
F# って?
F# って?



• Microsoft が開発したマルチパラダイム言語
F# って?



• Microsoft が開発したマルチパラダイム言語
• 静的型付け、関数パラダイム主体
F# って?



• Microsoft が開発したマルチパラダイム言語
• 静的型付け、関数パラダイム主体
• Scala より型推論が強力
F# って?



• Microsoft が開発したマルチパラダイム言語
• 静的型付け、関数パラダイム主体
• Scala より型推論が強力
• 3.0 がこの前でました
F# の実情?
WebSharperって?
WebSharperって?



• 本家曰く “the world’s most versatile web and
 mobile development framework for .NET”
WebSharperって?



• 本家曰く “the world’s most versatile web and
  mobile development framework for .NET”
• F# で書ける
WebSharperって?



• 本家曰く “the world’s most versatile web and
  mobile development framework for .NET”
• F# で書ける
• JavaScript を書かずに JS の機能が使える
WebSharperって?



• 本家曰く “the world’s most versatile web and
  mobile development framework for .NET”
• F# で書ける
• JavaScript を書かずに JS の機能が使える
• HTML5 などもいける
例:よくあるゲームループ

           Unity3D(C#) の例          

public class Hoge : MonoBehaviour
{
    void Update()
    {
        hoge();
    }
}
WebSharper 内でベタ書きすると

              F# の例               

[JavaScript]
let rec gameLoop () =
  async {
    do hoge()
    do! Async.Sleep (1000 / fps)
    do! gameLoop ()
  }
Canvas 使って何か書く                          

[JavaScript]
let hogeCanvas width height =
  let element = Tags.NewTag Canvas []
  let canvas = AsCanvasElement element.Dom
  canvas.Width - width
  canvas.Height - height
  let context = canvas.GetContext 2d

 Async.Start (gameLoop ())

 Div [ Width (string width); Attr.Style float:left ] - [
   Div [ Attr.Style float:center ] - [
     element
     |! OnMouseMove (fun _ arg -
       let offset = JQuery.Of(element.Dom).Offset()
       piyo offset arg.X arg.Y
     )
   ]
 ]
こんな感じで
こんな感じで



• html や JS の知識を仕入れながら書く
こんな感じで



• html や JS の知識を仕入れながら書く
• F#の知識が少しあればそれなりに書ける
こんな感じで



• html や JS の知識を仕入れながら書く
• F#の知識が少しあればそれなりに書ける
• 副作用云々は、作るもの次第で考えたほうが
 いいと思う
こんな感じで



• html や JS の知識を仕入れながら書く
• F#の知識が少しあればそれなりに書ける
• 副作用云々は、作るもの次第で考えたほうが
  いいと思う
• ジェネレートされた JS コードは読まないほ
  うがいい
WebSharper がもっと知りたい型へ
Expert F# 読書会はじめます
和書 (電子書籍もあるよ)
閑話休題
あるとき
あるとき




なかやん「あー、Erlang で何か書きたいなー」
あるとき




なかやん「あー、Erlang で何か書きたいなー」
人物 N「ならゲームのサーバ側 Erlang にすれば?」
あるとき




なかやん「あー、Erlang で何か書きたいなー」
人物 N「ならゲームのサーバ側 Erlang にすれば?」
なかやん「そ れ だ」
Erlang とは
Erlang とは




• エリクソンが開発
Erlang とは




• エリクソンが開発
• 並行処理指向、関数型 (?)、動的型付け
Erlang とは




• エリクソンが開発
• 並行処理指向、関数型 (?)、動的型付け
• コンパイル方式 (型の方面ではないけど)
使用するライブラリ




• rebar:ビルドツール
• cowboy:軽量ウェブサーバ
• jiffy:JSON パーサ
使用するライブラリ (選定理由)




• rebar:ないと始まらない
• cowboy:websocket が書きやすそうだった
• jiffy:速いっぽい
もっと詳しい話とか




voluntas さんの “継続開発のススメ Erlang/OTP 編”
  https://gist.github.com/9ee65f0dfa9b7dd78fde
WebSocket




ウェブサーバとウェブブラウザ間の双方向通信用
         の技術規格
送受信に使う json データ   

{
    x : 0,
    y : 0
}
例:プレイヤー機の座標を送受信



              Erlang 側 (初期化部分)             

 websocket_init(_Any, Req, _Opts) -
     Interval = round(1000 / 30),
     timer:send_interval(Interval, tick),
     Req2 = cowboy_req:compact(Req),
     {ok, Req2, undefined, hibernate}.
例:プレイヤー機の座標を送受信



                Erlang 側 (受信部分)                 

 websocket_handle({text, Msg}, Req, _State) -
     {[{_X, X}, {_Y, Y}]} = jiffy:decode(Msg),
     {ok, Req, {X, Y}};
 websocket_handle(_Any, Req, State) -
     {ok, Req, State}.
例:プレイヤー機の座標を送受信



            Erlang 側 (更新および送信)                       

 websocket_info(tick, Req, {X, Y}) -
     Data = jiffy:encode({[{x, X}, {y, Y}]}),
     {reply, {text, Data}, Req, {X, Y}, hibernate};
 websocket_info(_Info, Req, State) -
     {ok, Req, State, hibernate}.
例:プレイヤー機の座標を送受信
                                       F#側                   

[JavaScript]
  let initSocket context =

    let (|Text|Binary|) (data:obj) =
      match data with
      | :? string as text - Text text
      | binary - Binary (AsArrayBuffer binary)

    let socket = WebSocket(ws://localhost:19860/shooting)

    socket.Onopen - (fun () -
      PlayerShip.init | Json.Stringify | socket.Send
    )

    socket.Onmessage - (fun msg -
      drawBackground context
      match msg.Data with
      | Text text -
        text
        | (Json.Parse  AsInfo)
        | draw context
      | Binary _ - ()
    )

    socket
Erlang を使ってみた感想とか
Erlang を使ってみた感想とか



• OTP を使えば実装したいことのほうに集中で
 きる
Erlang を使ってみた感想とか



• OTP を使えば実装したいことのほうに集中で
  きる
• 慣れればもっとさくっと書けると思う
Erlang を使ってみた感想とか



• OTP を使えば実装したいことのほうに集中で
  きる
• 慣れればもっとさくっと書けると思う
• 高階関数あるし関数型なのだろう・
                 ・・たぶん
ちなみに
ちなみに



• Erlang はじめて 3 週間くらいだった
ちなみに



• Erlang はじめて 3 週間くらいだった
• 基本は飛行機本と web 上にあるサンプルで
 学ぶ
ちなみに



• Erlang はじめて 3 週間くらいだった
• 基本は飛行機本と web 上にあるサンプルで
  学ぶ
• 後はひたすら書く
飛行機本
ではデモ・
    ・・といきたかったけど




  間に合いませんでした orz
まとめ


• 手段を目的化して FP を学ぶのもありだと思
  います
• 自分にあった関数型言語を見つける(当たり
  前だけど FP=Haskell ではない)
• 気になったら理論へ進む
• JavaScript は生成するもの(キリッ
ご清聴ありがとうございました。

F#+Erlangで簡単なシューティングゲームを作ってみている