2013年10月16日水曜日

Androidで艦これをやる方法の考察

経緯
Androidで艦これをやるには、Flashや音声データ、その他Effectは無駄だと思えた。
というか動作が重い
なので、まともに艦これをやるために、専用ブラウザを作成することを考える。


艦これをしている時の通信を眺めていたところ、特に暗号化はされていなかった。
よって、APIを使用するだけなら、技術的なハードルは低いことがわかった。

次に、APIを使用するために、艦これのサーバとのセッションを作成する方法だが、これも簡単っぽい。(省略)

最後に、DMMへログインしてセッションを作成する。
必要なのは、token,mail address,passwordらへんだと思う。
tokenはログインページに直接に記述されていた。
あと、Cookieにsession idっぽいのがないとダメだとわかった。
どこから、Cookieをもってくるのかわかんね。詰んだ。

とりあえず、正しいログインができたとして、戻ってくるコードが302 Foundだった。
302 Foundから2回リダイレクトして、ようやくログインが成功する。

とりあえず、Cookieをどうにかしないといけないので、解決さくを考えた。

  1. ひたすらJavaScriptを読んで解析
  2. WebViewを使用する

1はどうせ、CookieをつくるのにJavaScript使ってんでしょ?とか言って、人力スクレイピング。
2はAndroidを使うんだから、しんどいところはWebViewを使ってログインしようぜ!ついでにCookieも取り出しちゃおうぜ!

とりあえず、試したところCookieは取れったっぽいから、WebViewは閉じて、Cookie使って、艦これtoken作ってAPI叩くところまで、妄想







2013年10月9日水曜日

JavaのRMIをつくるには


実装すべき内容
・サーバに名前をつけたインスタンスを保持させる
・クライアントはサーバにあるインスタンスを操作する
・クライアントでは、interfaceを持っているだけで、実装はサーバで行う。

サーバに名前をつけたインスタンスを保持させる
これは簡単で、HashMapを使用する。
KeyをStringにして名前を入れてしまえばよいからだ。


クライアントはサーバにあるインスタンスを操作する
これがめんどうである。
簡潔に言えば、プロキシインスタンスを作成しメソッドを実行したら、そのメソッド名と引数をサーバへ送り、サーバで実行し結果をクライアントへ返すという工程だ。

そして、この前段階にサーバのプロトコルを決めておこう。
RMIでは、サーバのアドレスとインスタンスの名前を送ることで、プロキシインスタンスを作成しているので、これに習ってみる。
ObjectOutputStreamでStringで名前を送る。
サーバでは、Stringを受信した時に、クライアントでプロキシインスタンスを作成するためのinterfaceを送信する必要がある。
なので、名前をつけて登録したインスタンスから共通のinterfaceを取り出すことにした。
reflectionを使用することで、インスタンスへ実装されているinterfaceの配列を取り出すことができる。
取り出すために、共通のinterfaceにはシンボルとして、Comfaceというinterfaceを作成し継承させることにした。
interfaceの配列からComfaceを継承しているものをクライアントへ送り、それでプロキシインスタンスを作成する。

次に、私はサーバにあるインスタンス名、実行したメソッド名、メソッドの引数の型、引数、を保持するクラスを作成した。
この際、シリアライズできるようにSerializableを実装する。
サーバでは、このオブジェクトの時にはメソッドの実行をするようにする。

プロキシインスタンスでは、InvocationHandlerを実装したクラスを渡すことで、メソッドの実行に細工ができる。
メソッドの実行時には、メソッドの名前や渡された引数がわかるので、それをサーバに送る事でRMIの真似事ができるのだ。
void型などのメソッドには気を付けること。