今日、Cordovaでようやく具体的なアプリを書き始めて今回のアプリにはCordova使えないことがほぼ確定してしまった。

冷静に考えれば当たり前っぽいけど、

「サーバー上にあるHTML・Javascriptなどのリソースはローカル上のリソース(アプリ内)にアクセスできない」

Cordova(元PhoneGap)を選択したのは、Web版・Android版・iPhone版の殆どを共通のソースで作れるハズという仮説に基づいていたが、それが瓦解した・・・。

3種類が共通のソースでできず、新規に書く必要がある状況ではカクカクした動きになってしまうCordovaを使うメリットは無い。

需要の無い問題を解決してしまった!

今月中にリリースとか思ってたけどこれはヤバイ。

投稿できないビューワー専用にしてでも、機能最低限版を作らねば。

となると、ネイティブよりTitaniumの方が早くできそうだ。殆ど選択肢は無い・・・。

怖話はスマホ向けWebサイトです。今のスマホのHTML5 Audioではサウンドノベル風に音を鳴らすのが難しいのでcordovaでアプリ版を作っています。

しかし、サーバー側で普通のブラウザからのアクセスなのか、cordovaからのアクセスなのか区別がつかない。数ページ程度だったらquery stringにでも何か付けてアクセスするようにすればいいけど、怖話はサイト全体に渡ってどちらからもアクセスされる可能性があるのでcookieが使えないガラケーのようなquery string引き回しなどはやりたくない。

StackOverflow駆け込み寺に問い合わせたところ、10minで答えが来た

「cordovaのソース弄ってヘッダ追加すれば?」

なるほどですねー!

% git diff
diff --git a/framework/src/org/apache/cordova/DroidGap.java b/framework/src/org/apache/cordova/DroidGap.java
index 5e2586d..dfbdb44 100755
--- a/framework/src/org/apache/cordova/DroidGap.java
+++ b/framework/src/org/apache/cordova/DroidGap.java
@@ -562,7 +562,9 @@ public class DroidGap extends Activity implements CordovaInterface {
                 };
                 Thread thread = new Thread(runnable);
                 thread.start();
-                me.appView.loadUrl(url);
+                HashMap headers = new HashMap();
+                headers.put("X-Access-From-Cordova", "true");
+                me.appView.loadUrl(url, headers);
             }
         });
     }

X-Access-From-Cordovaという勝手なヘッダを付けて、以前のエントリー通りcordovaをbuildして自分のプロジェクトに放り込む。

サーバー側(Rails)に下記helperを追加。

# app/helpers/application_helper.rb
module ApplicationHelper
  def cordova?
    request.headers['X-Access-From-Cordova'] == 'true'
  end
end

神様仏様StackOverflow大明神様 <3 <3 <3

README通りで問題無い。

commons codecをdownload

% cd ~/Downloads
% curl -OL http://ftp.meisei-u.ac.jp/mirror/apache/dist//commons/codec/binaries/commons-codec-1.6-bin.tar.gz
% tar zxf commons-codec-1.6-bin.tar.gz

cordova android版をbuild

% git clone https://github.com/apache/incubator-cordova-android.git
% cd incubator-cordova-android/framework
% cp ~/Downloads/commons-codec-1.6/commons-codec-1.6.jar libs/
% android update project -p . -t android-15
% ant jar
% ls cordova*.jar
cordova-1.7.0.jar

やったネ。

怖話でAndroidだけはカクカクして遅いので文字が位置文字ずつ出るのではなく、一行一気に出るように変更しました。

Androidというか、Androidのデフォルトブラウザー(MobileSafari?)だけで遅く、Android版FirefoxやChrome Betaでは速い。iPhoneは言わずもがな速い。

最小限のサンプルを作ってみたところ、Javascriptというより、DOMをいじった時に発生するReflowやRepaintが遅い。CSSでshadowやmarginなどによってReflowが起こる時だけで遅い訳でなく、Repaintも遅いっぽい。

Canvasで文字を扱うのは対応状況がまだ厳しい。

なんか手っ取り早い対策があればいいのだけど…。

ペパボの新しいPaaS、SQALEのクローズドβ招待頂いたのでやってみた。

ダッシュボードで公開鍵を登録して下記。

$ git clone ssh://sqale@gateway.sqale.jp:2222/komagata/foo.git
$ cd foo
$ vi config.ru
require 'rubygems'
require 'rack'

class App
  def call(env)
    [200, {'Content-Type' => 'text/plain'}, ['foo']]
  end
end

run App.new

$ git commit -am'First commit'
$ git push origin master
$ open http://foo-komagata.sqale.jp/

http://foo-komagata.sqale.jp/

おお、動いた。

他のPaaSとどう差別化していくのか気になりますね。

Menu > Refactor > Rename

対象のプロジェクトのディレクトリ内のファイルには全く変更が無いのでEclipse内のどこかにプロジェクト名を保存している?

半年ぐらい34歳だと思ってたので誕生日に向けて”プログラマー35歳定年説”のエントリーを暖めていたらホントは33歳で、今日34歳になったkomagataです。

おめでとう!俺。ascii codeで言えば制御コードはとうに脱し、 ” 歳になりました。

Terminal — less — 80×24

半年に1回ぐらい自己確認の為にやってることがあります。それは、Twitterに「うんこ」と書き込むことです。

何歳まで書けるかな?ってのと、書いた時自分がどう思うか。恥ずかしさはどのくらいか?などを確認しています。

ちょっと前にやりましたが、まだ余裕ですね。

というか「そういう報告要らない」と、「今、うんこしてきた」という報告と間違えられました。

2年ぐらい前につぶやいた時は姪っ子(小学生)に姉経由で見られて爆笑されました。

企業の透明性、情報共有度などを測るのに有用なメソッドではないでしょうか?

「うんこ」と呟きたい為にどんだけ必死なんだって話ですが…。

“プログラマー35歳定年説”の話は来年書きます。

怖話にIEでアクセスすると…

windows_xp_ie6 [Running]

PCからの閱覽はほんの僅かなのでWindows Phoneが大流行しない限りこのまま。

Macを再インストールしたのでrvmが新しくなったからか、capれない。

% bundle exec cap staging deploy
/Users/komagata/.rvm/lib/rvm/capistrano.rb:5:in `': RVM - Capistrano integration was extracted to a separate gem, install: `gem install rvm-capistrano` and remove the `$LOAD_PATH.unshift` line, note also the 'set :rvm_type, :user' is now the default (instead of :system). (RuntimeError)

長いエラーをちゃんと読むと、rvmのcapistrano関連の部分はrvm-capistranoとして別gemになったようです。Gemfileに追加します。

group :development do
  gem 'rvm-capistrano'
end

また「$LOAD_PATH.unshiftしてんのを取れ」と出てるので大抵の人はRAILS_ROOT/config/deploy.rbに書いてる下記を取ればOK。

$:.unshift(File.expand_path('./lib', ENV['rvm_path'])) # REMOVE ME!

コンパイラが変わるという大転換期なので仕方無いとは思いますが、Xcode依存のゴタゴタはプログラマーにも厄介。デザイナーさんに環境作ってと気軽に言い辛いここ最近のMac環境です…。

怖話では怖い話をサウンドノベル風に表示するのに色々端折ると下記のようなJavascriptを実行しています。

var text = ["こ", "わ", "い", "は", "な", "し"];
setInterval(function(){
  line.innerHTML += text.shift()
}, 80);

これが、PCやiPhone(3GSとかでも)ならばいいんですが、Androidのブラウザーだと僕の持っているGalaxy Nexusでもかなりカクカクします。

innerHTMLが遅いっていうのはよく見るんですが、全部つないで最後に表示というものではなく、実際に一文字、一文字増えていくサウンドノベルみたいな表示をするときに他の方法がイマイチわかりません。何か詳しい人だったら一発で速くなりそうな気もするんですがなんとも…。