1 of 22

Go + WS (仮)

PSOをWS使って

やってみる

2013/3/28(Wed.)

@SPDY+WS勉強会

2 of 22

自己紹介

上田拓也

豊橋技術科学大学大学院

電子・情報工学専攻

博士後期課程3年

(今週末まで)

twitter : @tenntenn

blog: http://u.hinoichi.net

3 of 22

アジェンダ

  • Go言語でWebSocket
    • ライブラリの使い方
  • 粒子群最適化法(PSO) + WebSocket
    • WebSocketを使った分散シミュレーション
    • 粒子群最適化法

4 of 22

Go言語でWebSocket

5 of 22

Go言語とは(念のため)

  • Googleの開発しているネイティブコードを吐き出す、クールな言語
    • シンプルな文法
    • 静的型付け
    • チャネルとGoroutine
    • 豊富なライブラリ
    • かわいいマスコット
  • ビッグウェーブがきてますよ
    • GoCon 2013 spring
      • 申込人数 182 / 120人
    • 電車でGo!
      • 電車借り切ってGo言語でハッカソン

6 of 22

net/httpパッケージ

package main

import "fmt"

import "net/http"

func handler(w http.ResponseWriter, r *http.Request) {

fmt.Fprintf(w, "hello, gophers")

}

func main() {

http.HandleFunc("/", handler)

http.ListenAndServe(":8080", nil)

}

localhost:8080にアクセすると

「hello, gophers」と出る。

7 of 22

HandlerとHandlerFunc

type Handler interface {

ServeHTTP(ResponseWriter, *Request)

}

// ServeHTTPを実装

type HandlerFunc func(ResponseWriter, *Request)

func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request)

8 of 22

websocketパッケージ

  • リポジトリ
    • code.google.com/p/go.net/websocket
  • ドキュメント
    • http://godoc.org/code.google.com/p/go.net/websocket

9 of 22

構成の例

受信部

送信部

クライアントサイド

Clients

受信部

送信部

Server

ブロードキャスト

受信部

10 of 22

websocketパッケージの使い方

  • ハンドラを作って登録する
    • Clientを作りServerに登録
  • Client型を作る
    • 受信部を作る
    • 送信部を作る
  • Server型を作る
    • 登録部
    • 掃除受信部(ブロードキャスト)

11 of 22

ハンドラの作成と登録

  • WebSocketのハンドラの型

type Handler func(*Cnn)

// http.

func (Handler) ServeHTTP(w http.ResponseWriter, r *http.Request)

handler := func (ws *websocket.Cnn) {

// 受信部

// 送信部

}

http.Handle("/ws", handler)

12 of 22

受信部を作る

  • websocket.JSON.Receiveを使う

// 別のgoroutineで受信処理

go func() {

done = make(chan bool)

for {

var msg Message // 適当な型

err := websocket.JSON.Receive(ws, &msg)

if (err == io.EOF) {

done <- true

break

}

// ブロードキャストする

}

}()

13 of 22

送信処理を作る

  • websocket.JSON.Sendを使う

for {

select {

case msg := <-ch:

websocket.JSON.Send(ws, msg)

case <-done:

return

}

}

14 of 22

粒子群最適化法(PSO)

WebSocket

15 of 22

何をやったのか?

  • 粒子群最適化法をブラウザ側(JS0で実行する
  • 結果をWSでサーバに送る
  • サーバに送られてきた結果を他のクライアントにブロードキャスト

分散して粒子群最適化法を行なう!

16 of 22

粒子群最適化法とは?

  • 粒子に解空間を探索させ、目的関数値を最小に最適化していく
  • 個体のベストと全体のベストを持つことで、他の粒子に結果を伝達する

解空間

17 of 22

粒子群最適化法とは?

  • 基本的にはランダムウォーク
  • ローカルベストとグローバルベストに吸いよされる
  • 完成も持つ

解空間

18 of 22

粒子群最適化法とは?

  • 粒子
    • 解空間上の位置
    • 速度
    • 個体のベスト
    • 全体のベスト

19 of 22

粒子群最適化法と分散処理

  • 粒子群最適化法は分散処理と相性がいい
    • 各粒子の動作はグローバルベストとして以外影響がない
    • 粒子を動的に増減できる
    • 粒子を小グループに分割して実行できる
      • グローバルベストを一定間隔で同期する

20 of 22

分散型の粒子群最適化法

解空間

=1クライアント

Server

グローバルベスト

ブロードキャスト

21 of 22

DEMO

22 of 22

まとめ

  • Go言語で結構簡単にWebSocket使える
    • Goroutineとチャネルが便利
  • ブラウザで分散シミュレーション
    • WebSocketを使えば簡単
    • 粒子群最適化法は実装簡単