朝起きれるようになってきたのは気のせいかもしれない。 もっと早く寝ればいいと思うんだけど。
気がついたらSIGGRAPH ASIAの早期割引き期限過ぎてた。 あー、今から泊まるところ探すとか飛行機取るとか難しい気もするので諦めるかな……。 SIGGRAPH ASIAの次週に仕事の締めがあるので行ってる場合かというのもあるんだよね。 一番の問題はやっぱり一人で海外とかしんどいですぅ。
先週直した雰囲気だった謎のリレー詰まりは今のところ再現してない気味だが、400時間程配信してたら止まったとの報告をもらった。 あれ、止まったじゃなくて落ちただっけ?まあなんか不具合が出たようだ。
そんな長時間配信したこともないのでわからないが、ビットレートを聞くと150kbpsと低い感じだった模様。思い当たるのは2GBか4GB越え辺りかなぁ。そのあたりの壁を越えられるかはあまり自信がないんだった。
PeerCastだとコンテントパケットの位置がバイト単位で保持され、32bit整数として格納されてる。なので2GB越えると負の値になったり4GB越えると0に戻ったりするわけだ。内部的には符号無しで保持してて表示する時になぜか符号有りとして扱われるから負の値として表示されるんじゃなかったっけかな……。
PeerCastStationだと4GB程度でループされるのは気持ち悪いので64bitに拡張して保持することにしてる。 しかしPeerCastと通信する以上は64bitのままにはできないので、32bitに縮小して送信してるし、受信したあとに64bitに拡張してる。 拡張は大変だけどなんとか頑張ったんじゃないかなぁ、という感じでまあここの扱いはだいぶ怪しいのだ。 というか今ちょっと考えただけでもいろいろ無理じゃねぇかと思うぞ。無理だなこれ。
実際そこが問題だったかどうかはよくわからないが、怪しいのはそこなのであとで調べよう。 と思ってたら自分の手元でバッチリ問題発生した。 長時間やってる配信を見てたら途中で送信が全く行えなくなってて、ログを見ると丁度4GB越えたところ(0x100000000)のヘッダを送信して止まってた。 たぶんヘッダは送ったんだけどその後のコンテントが4GB越え扱いされずに検索できてないんだろうな。 そもそもこの位置でヘッダ送信するのもおかしいし。やっぱ無理だったか。
4GB越えとかちょっと長時間やると越えちゃうし視聴だけでも影響でるからこれは早めに直さないといけないなぁ。さてどうしたものか……。
他の作業はUI周りをちょこちょこっと直してみたりmonoのxbuildでビルドできるようにしてみたり。NuGetをつっこむとxbuildで全然ビルドできなくて苦労しましたよ。NuGetの2.x以降を入れた状態でプロジェクトのパッケージ復元を有効にするとまともっぽいNuGet.targetファイルができるけど、それでもやっぱりエラー出るのでそれをちょっといじってやっと復元&ビルドできるようになりました。
ビルドはできるけどmonoでIronRubyが(あまりまともに)動かないからテストは通せないんだよねぇ。monoの正規表現がしょぼくてIronRubyが動かないよ!というバグ報告はmonoのBugzillaに上がってたけど正規表現周りをメンテできる人がいなくて直せないんだと。monoみたいにでっかい物だと必要な人手も範囲が広くて大変だよなぁ。
ゲームの方は結局Box2DをRubyに移植することにした。ちまちまやってるので全然進んでないが。
とりあえずベタ移植しようかと書いているが、やはりC++→Rubyだと移植はしんどい。 Rubyにはオーバーロードが無いのが一番しんどい、というより全てはオーバーロードだ。
世の中にはメソッドのパターンマッチとか言ってオーバーロード的なことをできるようにしてる人はみかけるけども、標準に入ってない以上アプリならともかくライブラリにそんな派手な変更が入るライブラリは使えないもんな……。
仕方ないのでちまちまとcase~whenで処理していくわけだけども。
演算子オーバーロードは困るよねぇ。とくにNumeric * Vec2
みたいに既存のクラスが左に来る場合。coerceを実装すればいいはずってのは知ってるけど書いたことないよ。どう書くんだよ……。調べると標準添付のMatrixとかVectorでもcoerce実装されてて、スカラー値はScalarという内部クラスにラップしたのを返してやっていた。なるほどなるほど。そんなんで勝手にラップしちゃっていいのかと思ったんだが、coerce呼ばれたあとには普通そのまま演算子メソッド呼ばれるくらいしかないからいいんだな。難しいぜ。
あとはC++の都合的にそういう書き方してるけどベタ移植するとRubyではそれはどうなんだろうかという形になってしまう関数とかどうしたものか。たとえばb2Absとかいう関数があって引数の絶対値を返すんだが、Vec2とかVec3とか引数に取れるわけよ。それメンバ関数にすればいいじゃん……とか思うわけだが、実はb2Absはfloatも引数に取れるのでそれに合わせてメンバ関数になってないんだろうと思う。でもRubyならFloat#absは普通にあるのでVec2#absもVec3#absで自然なわけだ。
じゃあb2Absはベタ移植せずにちゃんとメンバにしてやろうとすると、他にもどれはベタ移植じゃなくするのかなんて考える必要が出てきてめんどいめんどい。 まあとりあえずはベタ移植しておいてあとで整理するのがいいんだろうなぁ。ボトムアップで移植してるからどこで使われてんのかよくわからない物もいっぱいあるんだよね。
数学クラス辺りはある程度書けたので動かしてみるかと思ったがBox2Dにはテストがついてなくてこまった。 テストあるだろうからそれも移植して通れば大丈夫だろうと思ったのに……。 一応テストと称する物はあったけどただのサンプルだったしな。 他の移植をみてテストあったらパクってくればいいんだろうか。めんどいなぁ。