そろそろ力尽きてきた。というか、金曜ぐらいになると仕事中もう帰りたいとしか考えられなくなるのでよろしくないのがわかった。まあそんな状態でも意外にちゃんと仕事してるのでいいんじゃないかとも思うが、しんどいのでもうちょい加減して働こう。
土曜日にやっとイベントのサイト運営レポートをあげた。もう一ヶ月以上経ったんだな……。次は誰かやってくれ。 とりあえずGAEの課金状態は解除したので値上げの影響はうけんだろう。あー、無料分も減るんだっけ。まあたぶん大丈夫でしょう。 Appengine-JRubyも最近ぱったりと更新されてないのでもうだめだな。
やっと再開。 やる気はあるんだけどなかなか手をつける時間がないのがもどかしい。
UIとして普通のGUIの他にHTTP経由のインターフェースを追加したい。ASP.NETをホスティングするつもりではあるが、その前に複数のUIをホスティングできるようにせねば。
そんなわけで今あるGUIをプラグイン化。……できた。特にそんなに難しいところもなかったようだ。適当なところからdll読み込んで、自作のPluginAttribute
がついてるクラスがあったらそれをインスタンス化して保持しておいて、起動時にStartメソッドとかなんとか呼んでやれば完成。.NET 3.5なのでMEFとか使えないから自前で書いたが簡易な物なのですぐかけた。
ASP.NETをホストする際は必然的にAppDomain
を新しく作る必要があるので、まずはGUIのAppDomain
も分けてあげることに。これもそう難しくはないが、ホスト側のオブジェクトをGUIに渡すとシリアライズできないんですけど!ってひたすら怒られるので、怒られたクラスをいちいちMarshalByRefObject
から派生させる作業をするだけ。とりあえずGUIが起動するだけならできた。本当に動かすとまたあちこちでシリアライズできないと怒られまくるだろうからぼちぼちMarshalByRefObject
をつけていこう。
UIをプラグイン化したが、同じ方法で通信プロトコルとかストリームのメタデータパーサをプラグイン化できるなぁ。そのうちやっておこう。これやっておくと追加が便利になる。はず。
ASP.NETをホストするSystem.Web.Hosting.ApplicationHost
の使い方についてなんとなく調べたら思い違いをしていたようだ。ApplicationHost
を起動したら裏で勝手にListenとかしててHTTPサーバになってるもんだと思っていたんだが全然そんなことなかった。自分でSimpleWorkerRequest
を作ってHttpRuntime.ProcessRequest
に渡すと結果が書き込まれるという動作をするらしい。つまりネットワーク関係の処理は自前でやれと。思ったようなお手軽クラスでもないけどこのくらいの自由度はないと役に立たんか。
ネットワーク周りの処理はHttpListener
でできるので簡単。であるのは確かだが、PeerCastStationでは接続待ち受けとか当然自前でやってるんだった。そこにのっけられるじゃん。ただそこにのっけるとUIって扱いじゃなくて出力プロトコルの一種になるんだよね……。ちょっと作り的にどうかと思う上にUIをプラグイン分離した意味ないなぁ。いやUI扱いでASP.NETを立ち上げといて出力プロトコルでHTTP認識したらUI側に処理転送するのがいいのか。ちょっと複雑になるけど扱い的にはしっくりくるな。
でもセキュリティ的なところを考えると、配信・視聴・リレーに使うPeerCastプロトコルのポートとUIに使うポートは分離したいんだがなぁ。IPv6も考えるとPeerCastみたいにアドレスマスクで許可/不許可を指定するのはできなくて、だったらいっそ別のFirewallにまかせたい。ああ、ポート毎に視聴・リレー・UIの許可/不許可を設定できるようにすればいいのか。その程度の制御なら中でやってもいいしやらないといけないな。複数ポートで接続待ちは出来るからな。今はGUIが対応してないけど。
それはさておき、ASP.NETアプリの書き方がさっぱりわからんのが困るわね。