2011年12月20日火曜日

Corona SDKでハマったところ

おはようございます!今4時過ぎです。寒いですw

多相性睡眠を始めたので、blogはこの時間に書くことが多いかもです。
http://www.lifehacker.jp/2011/12/111215polyphasic_sleep.html

この辺も自分で動ける強み。
開発者と受験生とプロボクサーを兼務しているので、ひたすら時間が
なかったんですが、睡眠で3〜4時間位時間が増えるとありがたい。
会社員だと仮眠取ったら怒られるところ多いですからね。

あーニポン人はこれだからw

情報収集が全時間できるのも強みです。

正直、エンジニアの仕事の3〜4割は情報収集だと思ってます。
OSとかplatformにも限界はありますが、本当の限界は「知ってるかどうか」
だと思います。できることを知らなかったら、それはその人にとっては
できないこと、ですから。


で、Corona SDKの話

個人的に肝だったのは、binary通信です。
会社が特殊なスタイルだったので、binary通信をしないといけなかったんですが、
Coronaではサポートされていません。基本stringなので、そこに落とし穴が。

会社のスタイルっていうのは、サーバーサイドがJavaだったんです。
今時Javaかよ的な話ですが、CMSがJavaだったんですよね。かつて会社に
SE(嫌いな単語です)がいなかった頃に、某大手システム会社に頼んだため、
システム会社といえば、文系エンジニア業界、たいていJavaが専門、
というのがありJavaになったっぽいです。

で、Javaのbinary通信といえばDataOutput, DataInputなわけで、
そこと通信するためにbinary通信の仕組みが必要でした。

結果から言うと、binary通信は無理。Coronaではbyteまでは使えて、
string.char(文字コード)で一応byteデータは作れます。ただ、中の人が
処理するときにnullバイト(文字コード00)の所で終端コードとみなして
処理を止めちゃうんですよね・・・。

DataOutputの例えばwriteIntは4バイト使ってバイトを表現するわけで、
0xff & (v >> 24)が0になる数値(ほとんどですねw)は最初にnullバイト
入るのでそこで終わってしまいます。

悲しいことに、開始コードとかってwriteIntが多いと思うので、
contentLengthが0になって渡らないんです。通信なら自分でHeaderの
ContentLength設定すればいけそうですが、通信をラップしてる部分で
自動的に設定してるようで、手動で設定しても上書きされます(^_^;

ということで、何かで変換して送って、サーバー側で解釈するしかないです。
そんで、サーバー側からも変換して返すことになりますが(受信もnullバイトで
切られるため)、Coronaというかlua純正のモジュールで変換すると
たいていstringに変換しようとしてnullバイトで切れますw

なので、binary通信周りは結構自分で実装しないとダメですね。
DataOutput,DataInputも含め。


最良の選択はサーバーサイドをJavaにしないことですw

0 件のコメント:

コメントを投稿