Posts Tagged ‘Object’

[iPhone/iPad]WebAppのクラス設計について


2011
05.17

 

皆さんこんにちわ、お久しぶりです。

GW 以降バタバタしておりましたが一段落したと言いたい所ですが、この業界の三大職業病「肩こり」「腰痛」「イボG」のウチ、堂々の二冠達成と言う偉業を現在進行形でございます。

 

ちょっと単発ネタです。

先週は在宅勤務で引きこもっていたのですが、何もただ単に引きこもっていた訳ではありません。

仕事や家事や PSP でミクさんを愛でる時間の合間をぬって、iPhone / iPad 用の WebApp の開発を行っていました。今回構築しているアプリのベース部分が完成して、初代 3G なんかも引っぱり出して来てニヨニヨとしていたのですが…ここからエフェクト系を山盛り入れるには、とてもじゃないけどメモリが足りない事に気づきました。

 

だって既にちょっと重いもん。

 

画像や音声ファイルのロードは最初からネックになる事は解っていたのですが、JS で生成しているオブジェクトと我らの味方の jQuery が重たくてしょうがないのです。

 

安定性を欠くようではリリースなど片腹痛い訳で、これはもう基礎部分から再設計を余儀なくされた状況です。

リソースをふんだんに使うタイプの WebApp 開発にあたり、今回解った事は下記。

  • jQuery は使わない方が良さそう
  • prototype 定義を最大限使わないとキツい
  • Ajax による リソースの loader 部分がかなりマゾい
  • ダイナミックな動きは全部 CSS3 で賄う

1つ目は単純にライブラリよりネイティブの方が早い、当然ですね。クロスブラウザ対策が必要ないのでそこまで恩恵がある訳では無いので外す方向で行こうと思った。
そうなると要素に対して CSS3 を適応させる部分は大丈夫なんだろうか、とかの不安が残る。

 

2つ目は調子に乗って何個かインスタンスを作っているとメモリがアワワな事になる、昔 prototype 汚染にトラウマ級の悪さをされて以来食わず嫌いになっていたがそんな事言ってられなくなった。
これは私の設計の甘さもあるのですが…ガベージコレクションを使う手もあるんだろうか。

 

3つ目は WiFi 環境なら余裕で無視出来るレベルなのですが、貧弱な 3G 回線だとメディアファイルの load 時間がかなりストレスになる。しかし全てのファイルを始めに読み込んでおくのは 3G や 3GS のメモリ量だと厳しい感じがするので、先読みアルゴリズムを極限まで詰めて解放/読み込みをこまめにやるべき…?
逆にキャッシュの限界量に合わせてリソース側に制限をかけるべき…?

 

4つ目は jQuery を解雇するなら当然変わりにアニメーションを担当するものが必要になる、これは使ってみた感想だけど CSS3 でアニメーションさせると jQuery の何倍も何十倍も綺麗に動くので他に選択の余地は無いと思った。
canvas を使う手もあるのだけど、html5 で組むからこそ意味があると思っているので FLASH 的な動き(むにゃむにゃ動く背景とか)の時だけ使うのが良いと思う。

 

世界的にまだまだ開拓途中のこの WebApp と言う世界、今後のスマートフォンの主力コンテンツとしての活躍が期待されているのでやり甲斐があって楽しいのですが…

 

WebApp は開発サイクルが短くて予算節約になりますよ!

 

と言う売り文句を言えるようになるまでが大変そうです、セオリーは俺が作る!ぐらいの気概は必要ですね。

 

それではまた。

 

 

JavaScript のソースは隠蔽するべきか? Vol.3


2011
04.20

本日もやります、だんだんとノッてきましたしね。

ノリ過ぎて JavaScript の隠蔽の是非を問うようなタイトルなのに、何としても隠蔽してやろうと言う趣旨に変わって来ていますね。

サーチエンジン的に言うとタイトルと内容が一致していない評価が低いコンテンツになっているかも知れませんが、最終的な手間や再現可能環境をまとめて「JavaScript のソースは○○した方が良いかもね!」と強引に締める事で誤魔化そうと考えているので問題無いハズです。

 

それでは前回のおさらいから始めましょう。

  • サーバサイドでは精密なデバイス判定は難しい
  • ローカルサイトでも単純な UserAgent 比較だけではお話にならない
  • ラスボスは Mac Safari5 だった(今の所)

こんな感じでしょうか、要するに Mac Safari5 を攻略すれば取りあえず Oh Yeah と言う事で話しを進めます。

余談ですが iPhone のデバイス判定については色々調べてみました、中にはスクリーンサイズを取得して…と言う方法があり目から鱗だったワケですが結構簡単に破れちゃうなぁと言う事で今回は見送りました。

検証した所 iPhone4 の retina ディスプレイは 640 × 960 なのですが、3G/3GS との下位互換のためにスクリーンサイズは 320 × 480 が返される仕様でした。そんなサイズの PC モニタなんて無いですから一見強そうなんですが、VirtualPC や VMFusion みたいなバーチャルコンソールのシングルウィンドウモードで、その大きさにマウスでちょちょいとリサイズすればあっさり突破出来てしまいました。中々厳しいです。

 

navigator オブジェクトを突っついてみよう

前回目星をつけていると言いましたが、この Object には UserAgent の他にも様々な情報が格納されています。

詳しくは初めてのホームページ講座さんなんかで、navigator オブジェクトの仕様とか説明してくれているので眺めてみましょう。

パッと見だと navigator.appName とか navigator.platform 辺りはかなり有望なんじゃ無いでしょうか?だって通常はそんなの偽装する意味がないもの。

 

と言う事で検証用ファイルを作ります、body 要素内に script 要素を書いて…

1
2
3
4
5
6
7
document.write(
'appCodeName : ' + navigator.appCodeName + '改行' +
'appName : ' + navigator.appName + '改行' +
'appVersion : ' + navigator.appVersion + '改行' +
'anguage : ' + navigator.language + '改行' +
'platform : ' + navigator.platform
);

こんな感じで良いかな、解れば良いよね。そんな事よりこのコードビュープラグイン、<br />って書けないんだね!気持ち悪いけど「改行=<br />」と思って下さい。

例によって切ない人用にこちらにアップロードしましたので、色々見て行きましょう。

 

iPhone4 実機 + Safari5

appCodeName : Mozilla
appName : Netscape
appVersion : 5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5
language : ja-jp
platform : iPhone

これがベースとなります、これと違う点を発見すれば良いですね。

 

Mac OSX 10.6 + Firefox4(FireMobileSimulator)

appCodeName : Mozilla
appName : Netscape
appVersion : 5.0 (Macintosh)
language : ja-JP-mac
platform : MacIntel

なんか Firefox 可愛い。

 

Mac OSX 10.6 + Safari5(Developer Tools)

appCodeName : Mozilla
appName : Netscape
appVersion : 5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7
language : ja-jp
platform : MacIntel

キタコレ!appVersion は偽装してるみたいだけど、platform は流石にそのままですね!

 

ラスボス破れたり

 

と、言う事で判定は JavaScript で UserAgent と Platform を見る事にしましょう。

 

これで全ての武器が揃った訳ですが、海千山千の読者様は突っ込み所満載だなオイ!と思われているでしょう。

そうです、沢山問題がありますので弱点も今回のウチにまとめておきましょう。

  • navigator の中身全てを偽装するプラグインとかあったら負け
  • Safari5 より凄い開発ツールのあるブラウザがあると負け
  • 無くてもそう言うのを作れば良いだけなので負け

なんと言うか穴だらけですね!それでもまぁ市販のゲームだって逆アセかけて解析したり出来るしさ、データ周りだけサーバサイドで処理して送信するとかすればもう及第点と言う事で一つ。

次回はついにこの検証結果を踏まえた上での隠蔽プログラムの実装を紹介して終わろうと思います、もう少しお付き合いください。

 

それではまた。

 

1 | 2 | 3 | 4

 

オマケ:真のラスボス(ADP の公式シミュレータ)

真のラスボス
Platform は iPhone Simulator になってますね、ここは正直に書くのが礼儀的なものなのかも知れない。