All My Files is really annoying.

Finder Preferences

怖話に自分の投稿した怖い話にコメントが付いたらメール通知する機能を付けました。

受信トレイ - komagata@gmail.com - Gmail

Userにメール通知する/しないフラグを追加して、CommentObserverを書く。

# app/models/comment_observer.rb:
class CommentObserver < ActiveRecord::Observer                                                                          def after_create(comment)
    if comment.story.user.notify_comment
      mail = NoticeMailer.comment_notice(comment)
      mail.transport_encoding = '8bit'
      mail.deliver
    end
  end
end

拡張子をfoo.html.hamlとかにしとくだけでHTMLメールになるのも便利ですね。

coffee-scriptはnpmで入るからいいだろということでhomebrewからhomebrew-altに移動したらしいです。なのでnodeを入れてソースからnpmを入れる。

% brew install node
% curl http://npmjs.org/install.sh | sh
% npm install coffee-script -g

元のjsがある場合はjs2coffeeでcoffee化する。

% npm install js2coffee -g
% js2coffee foo.js > foo.coffee

guardやjitterで変更を検知してcoffeeをコンパイルする。titaniumで使われてるスクリプト言語はpythonなのでGuardfileがリポジトリにあると発狂する人がいる(?)のでjitterを使ってみました。(via @yagi_)

% npm install jitter -g
% jitter coffee Resources

coffeeディレクトリ以下のファイルに変更があると、同じ名前のjsがResources以下に出来る。

Xcodeを入れる。

Titanium Studioを入れる。(Titanium SDKがインストールされる)

最小限サンプル。komagata/titanium-foo

// Resources/app.js
var window = Ti.UI.createWindow({
  backgroundColor:'#ffffff',
  navBarHidden:true,
  exitOnClose:true
});
  
var label = Ti.UI.createLabel({
  color:'#000000',
  text:'foo',
  height:'auto',
  width:'auto'
});
window.add(label);
window.open()

プロジェクトディレクトリに入って下記。(.などの相対パスだと駄目なのでpwd (via @yagi_))

% ~/Library/Application\ Support/Titanium/mobilesdk/osx/2.0.2.GA/iphone/builder.py run "`pwd`"

skitchUl2P0b

できた。

何かおかしい場合は下記で大抵直るらしい。

% rm -rf build

家でもMacbook AirをTVにつないで使ってたんですが、Diablo3をプレイするために、リビングPC用に以前買っていたマウスコンピューターの安いWindows PCに戻しました。

Diablo3はやはり3万円切ってる安物では厳しく、最低限設定にしても常にテクスチャがおかしかったり、ダンジョンでは真っ暗になって(前面のテクスチャが黒になってる?)プレイは厳しい感じでした。

そこで久しぶりにビデオカード(最近はあんまりこう言わないですねグラボっていいますね)を購入。

SapphireのRADEON HD 7750を買いました。確か9000円台だったと思います。

何年もノートPCで来たので、最後に買ったビデオカードはMatroxのG400だった気がします。ググってみるとG400は1999年発売だそうなので13年も経つらしいです…。

時は流れて、最近のビデオカード事情を調べてビックリ。スロットはPCI Expressとかいうのになってるし、ハイエンドじゃなくても2スロット占有するのが普通。外部電源を必要とするのも普通。

どんだけ電力食うんだっつー話ですが、時代は流れましたね。

とりあえず、どのくらい効果があるのか定量的に知りたかったので3D MARK Vantageというベンチマークソフトで測ってみました。

3D MARK Vantage ベンチマーク

旧環境

  • CPU: Athlon II X2 220
  • GPU: RADEON HD 4250(オンボード)

新環境

  • CPU: Athlon II X2 220
  • GPU: RADEON HD 7750

スコアが257から7361と約28倍にもなってる!

同じ機種でシリーズ名も同じで数字がちょっと大きいのに変えただけだから対して変わらないだろう。せめて真っ黒になっちゃうバグさえ直ればいいかなと思ってたら大違い。

最低解像度、最低設定でやっと動いてたのがFull HD、最高画質でもサクサクに。これは予想外に嬉しい。

そういった嬉しい誤算とは裏腹に悲しい誤算もあります。

「これを見てくれ、こいつをどう思う?」

「すごく・・・大きいです」

自分のPCにはロープロファイル対応しか収まらないということすら失念していました。(オープンエアで動かしてるので動作には支障ないが…)

要らないMicroATXのケースをもしお持ちの方であげても良いという方がいらっしゃれば@komagataまでMentionいただけるとありがたいです…。

今日、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とどう差別化していくのか気になりますね。