俺専用Monotoneリポジトリブラウザを動かしてたんだけど気がつくとメモリ喰いまくってたりするのでしばらく止めます。
具体的にはhttp://miru.kumaryu.net/を止めます。俺以外は誰も見てないだろうしいいでしょう。 なんでメモリ喰うのか調べてはみたんだけどわからんのだよねぇ。
当然俺はたまに使うんだけど、ちょっと使い勝手が悪いのもあるのでJavaScript駆使した感じで近いうちに作り直したい。
イベントサイト作りの続きをした。
ログイン方法を追加するのに既存のユーザ情報クラスに新しいユーザIDを持たせないといけなくて大変そうだなぁと思ってたんだけど、やってみると新しいユーザIDを持たせるだけで勝手にDBに列を追加してくれた。そういえばそうかも。旧ユーザIDを消さないといけない理由はなかった。
あとは新しいユーザIDでログインした時に既に登録されてたらそのまま、新しいユーザIDではないけどTwitterを使ってログインしてて旧ユーザIDと一致したらそのユーザ情報に新ユーザIDを記録してあげる、というだけで済んだ。あとはちょこちょこっとビューを変えるだけ。これもちょこっとだけだった。
Play!のSecureSocialモジュールを使ってるんだが、こいつのビューをいじらないといけないな。ログイン画面のタイトルが「SecureSocial Module」とか意味不明なことになってたり、ログイン画面でタイトルクリックするとログイン画面に戻るようになってるとか正直頂けない作りだ。外からいじれるかと思ったけど、直で書かれてたので直接書き換えないといけないようだ。モジュールリポジトリから入れてきたものを直接書き換えるのって嫌なんだけどそうせざるを得ない作りだもんなぁ。
とりあえずできたのでTwitter以外の方法でログインしてみるかとしたら、使おうとしてたGoogle、Facebook、githubのいずれもapptoken取ってないのでエラーになってしまった。そういやそうだった。GoogleはOAuthじゃなくてOpenIDでログインできる版があったのでそれを使って解決。他はどうしよう。githubはともかく、Facebookはアカウント持ってないのでapptoken取るのできない。いらないか。
mixiとかpixivとかSteamのIDでログインできるようにしてくだちい的なことを言われたので調べる。 Steamは予想外だったがピアキャスコミュニティを考えれば確かに合ってるな。OpenIDかOAuth対応してればなんとかできるはず。
mixiはOpenIDのプロバイダになってるのを知ってたので問題ない。てか以前作ったサイトで対応した覚えがあるわ。
Steamは調べたらOpenIDのプロバイダになってくれるようだ。
pixivは調べたが外部へのAPI公開みたいなのはやってないみたい。むしろ逆にFacebookのIDでログインできる感じっぽい。無理なら仕方ない。
SecureSocialに既にあったMyOpenIDProviderというクラスをパクってSteamのOpenIDでログインできるようにしてみたが、ログインはできるがログインしたユーザ名が取れない。サイトで使ってるのはユーザの表示名とアイコンなんだが、アイコンは無いサービスもあるだろうからともかくユーザ名は取りたいなぁ。
しばらく調べてみたがSteamのOpenID情報ページにはこのアドレスを使ってログインしてくださいくらい書いてない。どうもログインできた時にユーザIDは取れるがそれ以上の物を取るにはSteam Web APIという独自APIを使わないといけないらしい。Steam Web APIを使うにはapptoken取る必要があるらしい。べつにSteamのアカウントはあるから取ってもいいんだけどユーザの表示名を取りたいだけなのに独自API使ってまでやる気はないな……。ユーザIDを名前のかわりに表示しておくだけで妥協するようにした。いや表示名くらい取れてもいいと思うんですよ。だってOpenIDでユーザが明示的にログインしてるんですよ!?
mixiは入れてみたけど俺がアカウント持ってないので試せず。まあきっとちゃんと動くでしょう。mixiはドキュメントもしっかりしてて素敵である。
おおむね出来たのでコミットしようとしていろいろ整理してたら間違ってSecureSocialモジュールを再インストールしてしまいモジュール内の変更点が全部消えるというおそろしいことをやらかした。まあビューをちょっといじったのとOpenIDプロバイダをコピっていじったくらいなのですぐ取り戻せたけど、やっぱりインストールしたモジュールを直接いじるのはこわいよ。
DBの変更あるところが本番環境で動くかちょっと不安だけど、他はデザインを直せば公開できる状態にはなるかなぁ。 今週末には公開したい。
同一マシン内の別プロセスからいじれるようにローカル内のRPCを作ってた続き。あとで気付いたけどローカルでのRPCってInter Process CallでIPCと呼ぶんじゃないだろうか。
名前付きパイプもしくはUnixドメインソケットを使うということはあるものの、結局のところサーバを自前で作って云々しないといけないのでとてもめんどい。非同期処理ってすごく面倒だよね。
最近の.NETのTaskとかReactive Extensionという物を調べてみると、結構便利そうなんだが、キャンセルがやっぱり難しいということで悩ましい。 いずれもキャンセルはできるんだが、普通に組むとRead待ちみたいな物のキャンセルができない……と思ったんだけど出来んのかなこれ。Reactive Extensionでは。
まあしかしReactive Extensionはなんか難しくてピンと来ない。これ上手く書けるようになったとしても、通常のC#コードとあまりにもかけはなれてて他人に見せるコードとしてはちょっとよろしくなさそうだ。
通信の非同期って難しいよねぇ。いや、通信の非同期だけなら簡単なんだけど、理想的に中断できるようになると上手く書けないのがな。既存の何かを参考にした方がよさそうな気がするわ。
なんかこんなの作ってるより先にやることあるんじゃないかという気もしてきたなぁ……。