2012/07/23

文字実体参照を記号(文字)に置き換える

JSONやXMLデータを表示するクライアントを作った時などに、文字実体参照になっている記号がそのまま & とか表示されたりする。
パーサがお利口な場合はよしなに記号に置き換えてくれたりするけど、そうじゃない場合もあるので、その場合は自前で文字列置換を行ってあげる必要がある。

自前のアプリでは今のところ下記について対応していて、必要があれば適宜追加していっている。

""
""
&&
&&
''
''
&lt;<
&#60;<
&gt;>
&#62;>

てなことを &amp; が表示されちゃってるTwitterアプリを見て思ったりしたw

2012/06/30

Corona SDKにもNativeExtentionがキター!?

6月はこのネタでブログ書けるなと思っていた申請中のアプリがIn Reviewのまま持ち越しとなってしまって、アプリ・リリースのエントリが書けないので別ネタを滑り込みでw

http://docs.coronalabs.com/native/enterprise/
というページがあるという情報を受け見に行ってみると、やっとCorona SDKを拡張できる仕組みが提供されるみたい。\(^O^)/
(Titanium Mobileでいうところの“Module”、AIRでいうところの“NativeExtention”みたいなものらしい)

そもそも私がCoronaを気に入っている理由はOpenGLベースの描画を使ったアプリをOpenGLの知識無しに比較的簡単に開発できる点にある。
本来Corona SDKは2Dゲーム用のミドルウェアなのでこういった作りなんだけど、ゲーム以外のアプリでも凝ったUIを作ろうとしていくと、結局のところ標準UIの設定をちょっと変えたぐらいでは実現できないという状況になり、ツール系アプリなんだけどOpenGLで作るか?という選択肢も出てきたりするのが実情である。(でもcocos2dにしろ生OpenGLにしろ敷居高いよね)

そんな時Corona SDKのようなツールだったら、画像ベースのパーツを組み合わせて動かすことによって、オリジナルのUIを作り易く速度も遅くない。(デザイン・ガイドラインに沿った上でのオリジナリティか、完全にオリジナルな世界観を持ったUIにするかは別問題なのでここではおいといて(/^^)/)
ただツール系アプリでは、提供されるSDKを利用するという場合も多いので、なかなか悩ましい状況であった。
※もしCorona SDKのようなツールでネイティブ拡張が可能なツールが出てくれば乗り換えてもいいと思っていたw

ここにNativeExtentionの登場である。

まだ動かして試してないし、ざっと見ただけなので勘違いもあるかもしれないが、Luaで書くCoronaのアプリに、自分でObjective-C(iOS)またはJava(Android)で書いたコードを使ったり、開発者向けに提供されているWebサービスや広告のSDKを組み込んだりできるようになるものらしい。

これでCorona SDKがかなり強力なツールになったといえる。
そしてObjective-Cを仕込んどいてよかったと本当に思う。

なんか動かせたらまた記事にします。

2012/05/09

Corona SDKでサーバから画像をダウンロードして使う

CoronaのAPIリファレンスを眺めていたところ display.loadRemoteImage( ) というAPIを見つけて、「あぁサーバにある画像を読み込んで表示するんだろうな」と内容を確認してみたところ、サンプルに
display.loadRemoteImage( "http://developer.anscamobile.com/demo/hello.png", "GET", 
                                               networkListener, "helloCopy.png", system.TemporaryDirectory, 50, 50 )
とURLとは別に画像ファイル名が指定されていた。もしやと思いざっと解説を確認してみたところ、どうやらサーバにある画像を読み込んで表示するだけではなく、保存もされるらしい。わずか一行で画像のDLと保存が可能だと!これは試しておかねばと思い立ったw

せっかくなので、複数ファイルを扱います。サンプルではコード内に画像のファイル名を書いていますが、実際に使う場合は画像のリストをWebから取ってきたり、DBからもらってきたりすると思います。まぁ、そういったコードはそれぞれの仕様にあわせて実装してくださいw
あと、画像がダウンロード済みかどうかの判定も必要ですね。
local _W, _H = display.contentWidth, display.contentHeight

local server = "http://example.com/img/"
local count = 0

local imgList = {
 {name = "01.jpg"},
 {name = "02.jpg"},
 {name = "03.jpg"},
 {name = "04.jpg"},
 {name = "05.jpg"},
 {name = "06.jpg"}
}

local networkListener = function(event)
 if event.isError then
  print("NETWORK ERROR: Download Failed.")
 else
  display.remove(event.target)  --(2)
  event.target = nil
  count = count + 1
 end
 print("RESPONSE: "..event.response)
 
 if count == #imgList then --(3)
  local img = display.newImage(imgList[1].name, system.DocumentsDirectory)
  img.x = _W/2
  img.y = _H/2
 end
end

for i = 1, #imgList do
 display.loadRemoteImage(server..imgList[i].name, "GET", 
     networkListener, imgList[i].name, system.DocumentsDirectory) --(1)
 i = i + 1
end
(1)順番にdisplay.loadRemoteImage()を読んで画像をダウンロード
(2)リスナーとしてnetworkListener()が呼ばれますが、そのままだと画像が表示されてしまうので、
display.remove(event.target)
event.target = nil
でリムーブします
(3)確認のため、全画像がダウンロードされたら1枚目の画像を表示を表示させてます

思いつきでやってみましたので、この方法が良いのかどうかわかりません。
ですが多分何かの役にたってくれそうな気がします。
最近Daily Buildで実装されたLuaFileSystem(LFS)と組み合わせるといいのかなぁ?