くまりゅう日記

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

2013-04-26

日記

結局アニメ見てない。めんどくさくなってしまった……。

ちょっくら咳が出ると思っていたら頭痛くなった。急な温度変化に晒さないでください。

週末のイベントに向けてもう頭がいっぱいだ。仕事も忙しいし。現実逃避でいろいろやりたくなってきたし。うおー。

ブラウザゲー作り

ランキングページを作ろうとして詰んだ。 Azure Storage Tableだと一度に1000件しか取得できないしDB側でソートってこともできないので1000人以上参加されてると正しく表示できない気がするな。

いやよく考えたら順位付けしてる方が問題じゃないか?全ユーザのデータ取ってきて順位付けしてるけどこれまずいぞ。1000人以上ユーザいると取ってこれないじゃーん。仕方ないのでついに観念してSQL Serverに移行するか。 今考えるとStorage Tableでどうしても取ってこれないわけでもない気はするが、無理する手間を考えるとまあ諦めた方がよさそうだな。

一週間前だというのにDB変更だとか何やってんだという気はしたが、まあ実際そんなに大変ではなかろう。Azure SQL Databaseというのを作ってみたが、使い方がわからんなぁ。Data Toolsとかいうのを入れろというので入れてみて、プロジェクトにデータアクセス用の項目を追加してみたらなんだかUMLのクラス図みたいなのでグラフィカルに編集しろとかいう画面になった。いやそんな難しいことは求めてなくてですね、C#からDBにアクセスできればいいだけなんですけど……。

DBへの接続方法を調べてみるとすっごいいろいろあるようだ。死にたい。LinqToSqlってのが名前的に楽そうかなーとプロジェクトに追加してみたらやっぱりグラフィカルに編集させようとしてきたので消した。さらに調べてたらLinqToSqlはオワコンという情報も出てきた。今はEntityFrameworkというのを使うらしい

EntityFrameworkて書いてあるやつを追加したらやっぱりグラフィカルで編集する奴が出てきた。だーかーらー!もっと調べてたらEntityFramework4.1でコードファーストという方法が追加されててこれでグラフィカルに編集なんてことをせずに済むようになったようだ。今5.0が最新っぽいけど4.1てことは結構最近までできなかったんだねー。

コードファーストについて調べるとそんなに大変そうでもなかったので実装は簡単にできた。いざ実行すると「リレーションのプリンシパルEndが決定できません」とかいうメッセージの例外が出ちゃう。リレーションのプリンシパルEndってなんだよ、全然日本語になってねぇじゃねぇか。リレーションはまあなんとなく分かるがプリンシパルってなんだよ、Endはなんでアルファベットのままなんだよ、といろいろ考えてしまうがそんなことを考えても解決しないんだよ!日本語(?)のメッセージで検索してもあまり情報が出てこなかったが、英語のメッセージらしきものは見つかったのでそれで調べてみると、エンティティが相互に1:1参照してる部分があるので片方に[Required]属性をつけろとのことだった。相互に1:1参照してるとどっちが先だかよくわからん的なことが書いてあってそれはまあなんとなくわかるが、Required付けると通るのはなんでだろう。付けたら通ったし動作に問題なかったので気にしないことにしたが。

あとはそんなに困ることなかった。接続も普通にSQL Serverにつなぐ方法でできたし。やっぱり怖がるよりやった方が早いよな。そうだよな……。

ただLinqで多重ループしてるところで文句言われた。既にDataReaderが開かれてるのでなんちゃらとか言われてるがEntityFrameworkの中で例外出てるしそんなん知らんがな。調べてみたところDB接続で検索のカーソルは一つしか開けないんですよーとのこと。外側のループで検索カーソル開いてるから内側のループでエンティティに対するLinqで新しい検索カーソルが使えないってことか。DBによっては設定で変更できるみたいだけどそこまでする必要ないなーと外側の方をToArray()して回避しておいた。

Linqは標準で遅延実行なのが意外に嵌まるんだよなぁ。RubyのEnumeratorもlazy呼ばないでも標準で遅延実行するようにすればいいのにと思ったことがあるんだが、Linqでたまに遅延実行に嵌められることがあるのを思うと標準では積極的評価てのもいいのかもしれない。あーRubyでもDBのライブラリなんかは遅延評価するかー。

DBをAzure TableからAzure SQL Databaseに移行できたので、次はNPCトレードでも追加するか。単に過疎ってるとゲーム進まなくなるので適当にサクラをつっこむだけだが。

適当な間隔でワーカー回してトレードが2つ以下の部屋にはランダムなトレードをぶち込んでいけばよかろう。トレード主はダミーユーザーにしてみたらユーザーは1つしかトレード出せないよとDB検証で怒られた。そういや1:1にしてたな。どうせプログラム側で1つしかトレード出せないようにしてるのでDB側でそこまで強制する必要もない。ユーザー:トレードは1:多にしちゃおう。

だいたい出来たっぽいので配置しよう。配置は以前やったし問題ないだろう……って配置したらワーカーロールがなんか起動しない。管理用のコンソール見る限りでは何か例外で落ちてるようだが詳しい情報が取れない。またリモートデスクトップで入るしかないのか……。リモートデスクトップで入ってイベントビューアでログを見るとどうもDBのスキーマが変わってるからマイグレートしてねという例外が出てるようだ。それは知ってた。知ってたから事前にテーブル削除しておいたはずだが……?

VisualStudioのサーバエクスプローラを見てもテーブルは削除済みなんだがと思って更新してみたら削除したつもりの奴らが復活してきやがった。うわー、これサーバエクスプローラで削除押して消えたように見えたけど実は消えてないな。どうなってんだふざけんなよMSめ。削除押すと最初はDBの更新スクリプトを作るかすぐに実行するか聞かれるんだけど二度目は聞かれないのは実は削除してないということだったようだ。一つテーブルを削除する度に更新ボタン押して最新の状態を表示するようにしたらその度に聞かれるようになって本当に消せた。ひどい話だ。

これでまあ見た目以外はだいたい出来たかなー。問題はまだあるだろうけどまたその時考えよう。

しかしAzure Cloudの起動が遅くて稼働中に更新するのはやりたくないな。いちいちVMシャットダウンして更新して再起動ってのをロール毎にやるのでめちゃくちゃ時間かかる。ステージング環境ってのがあるなーと思ってたけど、どうもここに上げると運用環境とのスワップができるようだ。試してみよう。

ステージング環境は発行時に選択するだけで簡単にできた。上げたら普通に起動して運用環境と合わせて4インスタンス立ち上がってしまった。うげぇ、予想通りではあるがこの分料金かかるんだよなぁ……。それはともかくスワップを押したらすぐにスワッ…プ……さ…れ……た!1分くらいはかかるのか。思ったよりは時間かかるけど、まあ普通に更新するよりは断然速いから使わない手はないか。スワップしたあとにステージング環境を削除すれば余計な料金もかからないしな。

稼動中に更新なんかしないのが一番いいんだけど、わかってない問題もいっぱいあるだろうし、実装したかったけど入れられなかった機能がまだあるから更新はしちゃうんだろうなぁ。

[PeerCastStation] 接続情報の取得

リレー要求された時にリレー不可ノードを切断するってのを実装しようとしたんだけど……。 出力接続を表すIOutputStreamにこいつがリレー不可かどうかを取得するインターフェースがなかった。

そういやそうだった。接続一覧のアイテムとして表示するのにも困って、めんどくさいからToString()を呼ぶと接続一覧にいい感じにフォーマットした文字列を返すようにしてたけど、それはあまりにもひどいので直そうとしてたんだ。同じ接続情報の取得ならついでにやっちゃうか……。

そんなに難しいことはなくて、必要そうな情報を列挙してConnectionInfoクラスのメンバにしてやって、あとはIOutputStream.GetConnectionInfoで適当にフィールドを埋めて返すだけ。ちょっとめんどいけどまあすぐ出来た。

表示の方もこれ使ってしてやろうということで新しく整形しなおした。出る情報はそんなに変わってない。 HTML UIの方はちょっとめんどくさいのでまだやってないけど忘れないうちにやっておきたい。

肝心のリレー要求された時にリレー不可ノードを切断するってのはまだ実装できてないぜ……。

[PeerCastStation] 未視聴チャンネルの自動切断

自動切断ってできるんですか……え、できないの?早く実装しろおらぁ!ってしばしば言われるので実装することにした。

視聴もリレーも一定時間してないチャンネルを切ろうと思ってたんだが、見てないチャンネルをいちいちUIから切るのがめんどいっていうのが主な用途とのことでリレーしててもぶった切るようにした。 リレーしてるチャンネルを自動で切るのはどうかなぁと思ったんだけど、手動で切るときはリレーしてても切るもんなぁ。

ただ標準で有効にするにはまだちょっと抵抗があるので今のところはOFFにしておこう。

ちょっと前から入れてた未接続チャンネルの自動切断と同時に設定できるようにしちゃったけど、分かりづらいから排他の方がいいかも。自動切断しない・未接続チャンネルのみ自動切断・未視聴未リレーチャンネルの自動切断・未視聴チャンネルの自動切断でレベル指定できる感じの方がわかりやすいかな。こっちにしようか。

PeerCastチャンネル個別に自動切断しないKEEPってのもできるようにしたい気もしたけど、よく考えるとKEEPって使いどころがわからんので要望があるまではやめておく。自分はプレイヤーを一瞬止めた時に切れるのが嫌って時にKEEPしてたけど、PeerCastStationの自動切断は時間指定で即座には切れないから問題ないしな。


ページのトップへ | トップ «前の日記(2013-04-15) 最新 次の日記(2013-05-01)» | 編集 | kumaryu.net by kumaryu