くまりゅう日記

もっと過去の日記
[.NET | BeOS | Blender | COLLADA | fossil | mono | monotone | NPR | OpenGL | PeerCastStation | Riko | Ruby | Silverlight | TRPG | XNA | ゲーム | ゲーム作り | プログラム | | 模型]

2014-02-24

日記

先週は風邪引いて死んでた。

死んでたというほどではないが、月曜に熱を出して早めに帰ったがそんな高熱でもなく、すぐ微熱になったので一日休んで寝てればよくなるだろうと思ったら治らず。熱は微熱くらいしかないのに喉は痛いし鼻水出まくって息ができない。無理しても仕方ないので二日目も休んでおいたら夜には頭痛がしてきた。まずいなーと思いつつ木曜朝起きてみると頭痛が収まらず三日目も休み。夕方まで寝てたらさすがに頭痛も収まり喉や鼻もだいぶ楽になったので金曜はまだ少しぼーっとするものの出勤して仕事をしてた。

土日もまだ頭が重い感じがあったので家でごろごろしてた。そんなにしんどくはならなかったが、いつまでも治らなくていやらしい風邪だなー。まだ頭が少し重いし鼻水が止まらん。痒くはないので花粉の影響ではなさそうだが。

イベント用のゲーム作り

来月にまた定期的にやってるオンラインイベントがあるので何かゲーム的なものを作ろうとしている。

前回・前々回はトレードしつつ役をつくるドンジャラみたいなものだったが、ちょっとゲーム性が強すぎた?というかもう少し緩いコミュニケーションを目的とした物のはずだったんだが、ゲームがゲームとして単体で完結してしまっていた。

ゲーム自体は意外と面白くはあったんだけど、もともとイベントサイトの盛り上がり感を出したいという話があって作ったものなのに、ゲームは盛り上がってるけど、イベントの各ページに何か関連があったのかというと微妙。今度はもう少しイベントの内容に踏み込みたい。

一方サイトのサークルページにはコメント欄があるがあんまり盛り上がってない。 まあ気のきいたコメントつけるのって難しいよね。 ここのコメントをもっと気軽につけられるようにしたいよなぁ。

気軽に評価するならいいねボタン的なのだけどそれは見ても面白くないし、コメントつけたい。 気軽にコメントつけるなら定型文だけどただの定型文でも面白くない。 限られた単語しか持ってない状態でコメント文を作る単語限定コメント機能でもつけるか。

単に単語が限られるときついので、前回面白かったトレード機能を持たせて、単語をトレードできるようにしたい。 あと面白いコメント自体も評価してポイントつけられるようにするのがいいかな。ゲーム性は一応持たせたい。 細かいところは作りつつ考えるとしてこんなところだろうか。

中身の方もともかく技術的な方もなんとかしたい。前回まではSignalRを使いたいのでサーバがC#、クライアントは普通にJavaScript、Azureに置いたのでDBは普通にSQLServerだったが、せっかくWebアプリなのでRubyを使いたい。最近ならWebSocketが普通に使えそうということで通信にWebSocket、サーバにRuby、クライアントはOpalで行きたい。CoffeeScriptとか軟弱な物は使わない。Opal使ってクライアント側もRubyで書けやおらぁ!

問題はOpalだなーと思ってたんだけど、想像よりすんなり動きやがる。opal-browser入れたらWebSocketのバインディングが既に入ってたし(ごく当然のようにドキュメントはない)。表示にDOM直いじりなんてことはできない軟弱者なのでKnockousJS使いたいなーと思ってたんだけど、KnockousJSってAPI少ないからOpal向けのラップもすぐできた。Opalでの@hogeがJavaScriptではthis.hogeになってくれるので、@hogeにObservable入れておけばバインディングも問題なく解決してくれた。やったー。

サーバ側もHerokuのWebSocketドキュメント読みながらやったら簡単だった。WebSocketだけならな。

WebSocketでリアルタイムな通信をしようとしたら当然あっちのクライアントでやった変更をこっちのクライアントにも通知なんてことしないといけないわけだ。チャット程度でもあっちの発言をみんなに通知しないといけない。アプリのインスタンスが一つなら接続しているクライアントのリストをメモリに保持しておいてなんとかすることもできるけど、スケールできないのはかっこわるいし(スケールさせる程接続もないので困るほどではないが)、1dynoだからってアプリインスタンスが一つとも限らないでしょう。

スケールさせるにはメッセージキューみたいなサービスを使う必要があるのかと思ったら、HerokuのWebSocketドキュメントにはRedisのPubSubとか使うといいよという話が書いてあった。RedisってKVSだと思ってたけどそんな機能あったのか。不思議だけど便利だからいいか。保存するものそんなにないしDBもこれで済みそう。

RedisをWindowsで動かすのに苦労したりしながら、Ruby用のクライアントはあるので簡単に組み込んでみたんだけど、動かん……。 redis-rbのsubscribeはそれをやった時点でブロックするようでそこで止まってた。な、なんだと……。 仕方ないのでsubscribeは別スレッドでやることにして動くようになったが、今度は止まらなくなった。 サーバを止めようとしてもsubscribeしてるスレッドがいつまでも生きてるから止まらないようだ。

最終的にredis-rbじゃなくてem-hiredisとem-synchrony使って(サーバもthinにして)EventMachine上で動かすようにして回避したけど、EventMachineもem-synchronyもよくわかってなかったのでとても苦労した。もしかしたらem-synchrony使えばredis-rbでも大丈夫だったのかもしれないが、em-hiredis+em-synchronyの方が使いやすかったからこれでいいや。 Rackでつながりっぱなしになるような物を作るのは難しいんだなぁ……。

予想外にサーバ側で苦労したが、なんとか動くようにはなって一安心。 RubyでWebアプリなんてもはや何も苦労することない物だと思ってたが、Rails以外の情報はさっぱりない。 Rails言語はよく使われているがRubyなんて物は誰も使っていなかったようだ。

なにはともあれ最低限の動作はできた。作りたいものとしてはシンプルなので、ここまで動いたらあとはさくっと作り上げたいねぇ。


ページのトップへ | トップ «前の日記(2014-02-10) 最新 次の日記(2014-03-04)» | 編集 | kumaryu.net by kumaryu