読者です 読者をやめる 読者になる 読者になる

non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

Goオールスターズ2に行くので、gopheronをGo言語で動かせるようにした #websocket

おはようございます。奥さんが海外出張で、子供達と実家で過ごしていました。kjunichiです。

Goオールスターズ2に行かせてもらえる

家族のGoogleカレンダーに駄目元で登録していたら、奥さんの許可が出て、行けることになった。

予習をすることにした。

gopheronとは

electronベースで3D表示にThree.jsを使って、Goのマスコットの3Dデータを読み込んでデスクトップにうろちょろさせる デスクトップアプリ。

子供達はこのキャラクターを「ごーふぁーくん」と読んで、そこそこ気に入っている。 (次男は、青いクマさんと認識してる節もあるが。。)

そもそものきっかけは、

qiita.com

を見て、自分でも作りたくなって始めた経緯があります。

予習内容

背景

Goのマスコットを使っているのに、Goのコードが全く入っていない状態が続いていた。

これではせっかくの勉強会に参加するのにまずいなぁ、ということで、lispからWebSocketを通してElectronを扱っている Ceramicを参考に、Go言語で同様の実装を試みた。

GoとEelectronの連携

Ceramic同様にWebSocketで実装することにした。が、その昔、疑似テザリングツールを自作した際に使った Socket.ioを使うことにした。

ハマりどころ

Go言語向けのSocket.ioのサーバーはすぐに見つかったが、クライアント用のライブラリがなかなか見つからなかった。 あれこれ試してようやく見つけた。

Goとは原因は関係なかったが、今回、gopheron本体に付属するクライアントもGo言語でSocket.ioを使って、任意のメッセージを コマンドラインから送れるようにしようとしていたが、いつまで経っても最初のメッセージが表示されてしまう現象が発生し、 これの解決に時間を取られた。

結果的には、Socket.io周りではなく、受け取ったメッセージをThree.jsのテクスチャとして表示していおり、このテクスチャの 更新がコマンドラインから送信したメッセージで更新されたものになっていなかったのが、原因だった。

まとめ

GoでもSocket.ioで手軽にWebSocketを扱えた。今回、Socket.ioサーバーを起動しつつ、Electronを起動するということをGoルーチンを初めて使って実装した。Goとつけて、関数を呼ぶだけで、本当にOKでびっくりした。

そんなわけで、Goオールスターズ2楽しみです。よろしくお願いします。

f:id:kjw_junichi:20161002072141p:plain

関連記事