2014年11月26日水曜日

【Titanium】AndroidでMapモジュールが落ちる現象

titanium_android_mapiOS, Androidアプリ開発で、TitaniumのMapモジュールで嵌ったときの覚書。

環境: Titanium SDK 3.3.0 GA, Galaxy S2(Android 4.0.3)

下記エラーが表示されてマップ表示からしばらくしてアプリ自体が落ちる。

[DEBUG] REQUEST: Connection opened to:https://clients4.google.com/glm/mmap/api
[DEBUG] REQUEST: Open Connection
[DEBUG] REQUEST: DRD(65): 62|147
[DEBUG] REQUEST: Close
[DEBUG] REQUEST: Error processing: com.google.maps.api.android.lib6.b.d@416a5da8 not retrying
[DEBUG] REQUEST: Retrying: com.google.maps.api.android.lib6.c.au@418ecd60
[ERROR] REQUEST: ERROR
[ERROR] REQUEST: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
[ERROR] REQUEST:        at org.appcelerator.titanium.util.TiResponseCache.get(TiResponseCache.java:276)
[ERROR] REQUEST:
[ERROR] REQUEST:        at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:211)
[ERROR] REQUEST:        at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
[ERROR] REQUEST:        at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)
[ERROR] REQUEST:        at libcore.net.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:280)
[ERROR] REQUEST:        at com.google.maps.api.android.lib6.b.l.run(Unknown Source)
[ERROR] REQUEST:        at java.lang.Thread.run(Thread.java:856)

 

こちらのチケットで報告されている。

私の場合、このエラーは下記のことを試しているうちに表示されなくなった。どれが効いたのかは分からない。

  • API Keyの再発行
  • アプリ削除
  • 端末再起動
  • Resources/android/images/にres-hdpi, res-mdpiを作った
  • annotationを使わなくした

 

ただannotationを表示するとマップを描画する時点でアプリ自体落ちる。

で、いろいろ試して分かった事。注意:Androidのみ

  • annotationのimageプロパティに指定する画像の大きさは共通でなければならない。iOSは別々の大きさでも問題ない。
  • 大きさが同じでもPNG画像で表示される(透明部分の領域)部分に大きな落差があった場合も表示されなかった。
  • 大きさ(サイズ)は最大32x32 64x64@2xみたい
  • 横長の画像(45x30, 90x60@2x)だと表示されなかった
  • 正方形でも15x15, 30x30@2xだと表示されなかった

 

あまりこの手の情報は見当たらないので別の条件があるのかもしれない。

 

< Related Posts >

2014年11月14日金曜日

TitaniumでWebSocketを使いたくてtiwsをビルドする

titanium_module_buildWebSocketを使ったアプリのイメージが出来たので、Titaniumでtiwsというネイティブモジュールを自前ビルドしてみたときの覚書。

環境:Mac OS X 10.9.4, Titanium SDK 3.3.0.GA

MarketPlaceでも配布されているのでそこからダウンロードすればビルドは必要ない。

今回はtiws自体が2年間更新がなく、何かあれば自分で対応するためにビルドしてみた。

まずはGitHubからCloneする。

$ cd ~/Documents/Titanium_Studio_Workspace/
$ git clone
https://github.com/iamyellow/tiws

Fork先でいくつか修正されているようなのでこちらを使うことにした。
$ git clone https://github.com/HilkoLantinga/tiws

 


iOS用をビルド

環境変数を変更
$ cd tiws/ios/
$ vi titanium.xcconfig

TITANIUM_SDK_VERSION = 3.3.0.GA

TITANIUM_SDK = /Users/daiki/Library/Application Support/Titanium/mobilesdk/osx/$(TITANIUM_SDK_VERSION)

ビルド実行。
$ ./build.py

カレントディレクトリに「net.iamyellow.tiws-iphone-0.3.zip」が出来る。

 


Android用をビルド

前の記事を参考にまずは環境を作る。

環境変数を編集。
$ cd ../android
$ vi build.properties

titanium.platform=/Users/daiki/Library/Application Support/Titanium/mobilesdk/osx/3.3.0.GA/android
android.platform=/Applications/android-sdk-macosx/platforms/android-14
google.apis=/Applications/android-sdk-macosx/add-ons/addon-google_apis-google-14

ビルド実行
$ ant

エラー

BUILD FAILED
/Users/daiki/Library/Application Support/Titanium/mobilesdk/osx/3.3.0.GA/module/android/build.xml:163: /Users/daiki/Documents/Titanium_Studio_Workspace/tiws/android/lib does not exist.

libsならあるのでシンボリックリンクを作ってみる。
$ pwd
$ ln -s /Users/daiki/Documents/Titanium_Studio_Workspace/tiws/android/libs/ lib
$ ls -l
 

ビルド再実行
$ ant

成功するとdistディレクトリに「net.iamyellow.tiws-android-0.1.zip」が出来る。

生成したzipファイルをこのモジュールを使うプロジェクトの直下に置いておけばビルドしたときに自動で解凍される。

 

< Related Posts >

2014年11月8日土曜日

アプリ向けのサーバーAPIは「REST」 or 「WebSocket」?

restapi_websocketアプリとサーバー間のやりとりをREST APIかまたはWebSocketで実装するか迷ったときの覚書。

よくまとまっているサイト

今のところ「共存出来るんだから、それぞれの特性を理解して使い分けろ」に落ち着いている感じ。

WebSocketでやりとりするメッセージにルール付けして、RESTを表現しようとする動きもある。

 

NginxはWebSocketをリバースプロキシ出来るし、ロードバランサとしても動作する。

 

ExpressJSとSocket.IOでセッションを共有出来る。

 

Socket.IOを利用すると名前空間(namespace)で機能分けして、部屋(room)でメッセージを送受信する範囲を制御できる。

接続すると自動的に1つの(自分のIDが付いた)roomに参加するので、特定の人だけにメッセージを送信する場合はその人だけが参加しているroomに送信する。

Socket.IO v1.0からバイナリー送受信もサポートされて、ファイルの送受信も簡単に実装できる。

PCを遠隔操作できるデモをPCやタブレットで複数開きながら操作すると感動する。

 

クライアントアプリをTitaniumで実装する場合は、iOS/Androidに対応したモジュールがある。

Ti.Network.Socket.TCPを使うと上記のネイティブモジュールを使わなくても出来るみたい。

ti-websocket-clientを使っている人が質問してtiwsを使えという回答がちらほら。

 

技術的には環境が整いつつある感じがするので、WebSocketで「最新情報を取得」とかやる必要がないアプリを作ってみようと思う。

 

オンラインゲームとかどんなプロトコルでやりとりしているのかな?

Google Cloud Platformにある記事とか参考になりそうだった。

 

何となく見えてきた。

 

< Related Posts >

2014年11月6日木曜日

node-mysqlからnode-mariasqlに乗り換える

nodejs_mariadb_mysqlNodeJSの開発にも慣れたことだし、そろそろMariaDBのスレッドプールに頼らずにnode-mysqlのpool機能を使って、DB接続を使いまわすようにしようと調べたときの覚書。

環境: MariaDB Server 10.0.14, node-mysql 2.5.2, node-mariasql 0.1.21

 

調査しているとnode-mysqlより速いnode-mariasqlを発見。

node-mysqlの作者が速度改善に取り組んだ記事が面白い。

 

速度比較ベンチマーク

 

ただDB接続をpoolしたい場合は別モジュールと組み合わせて開発する必要がある。

 

今のところnode-mariasqlに乗り換えて、MariaDBのスレッドプールに頼ることにした。

node-mysqlのpool機能を使って接続を使いまわすようにした方が結果的に速くなるかもしれない。

 

試してみて気付いたこと。

  • Node.js v0.11では動かない。v0.10では動く。
  • selectした行ごとにasync.mapで非同期処理している中でqueryを投げると「Already Closed」エラーになる。
    → res.on('end')の中でclient.close()を呼び出すと回避できた。

確かに速い気がするが、いつでもnode-mysqlに置き換えられるように作っておいた方が良さそう。

 

< 2015/04/09 Modified >
Apache Benchで試してみたところ速度的に大差ない。

node-mariasqlで実行したとき数値のカラム(countした値など)も文字列で返ってくるので、やっぱりnode-mysqlで開発することにした。

 

< Related Posts >

Related Posts Plugin for WordPress, Blogger...

Blog Archives