GitHub の Issue をあとから Pull Request にする (あとからコードを添付する) #git #hub #Github - Qiita

怖話の場合は下記。(brewでhubをインストールしておく)

% git pull-request -h fjordllc:new-category

出す出す言ってなかなか出来なかった怖話iPhoneアプリが出来ました。

http://itunes.apple.com/jp/app/bu-hua/id564486792?ls=1&mt=8

App Store初申請なので最初は絶対リジェクトされると思ってたんですがあっさり通ってびっくり。

@jishihaさんに聞いた「iOS6対応で申請がいっぱいきてるからそのどさくさで簡単に通るとおもいますよ」というここを強い言葉を信じでえいやと提出してよかったです。

結局、PhoneCap -> Titanium -> PhoneGap -> Nativeというように紆余曲折を経ました。

星5のステマしておきました。

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

受信トレイ - 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メールになるのも便利ですね。

怖話はスマホ向け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

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

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

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

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

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

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

windows_xp_ie6 [Running]

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

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

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

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

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

怖話ではさくらVPS512を使ってます。性能的にはまだ問題無いんだけど、HDD容量が20GBとちと不安。先日もproduction.logが1.7GBになってたのでちゃんとローテートする。

$ cat /etc/logrotate.d/kowabana 
/var/www/kowabana/shared/log/*.log {
  weekly
  missingok
  rotate 24
  dateext
  compress
  delaycompress

  lastaction
    pid=/var/www/kowabana/shared/pids/unicorn.pid
    test -s $pid && kill -USR1 "$(cat $pid)"
  endscript
}

newrelicのログとかunicornのログとかも一辺にローテートされるから楽でいいですね。-dをつければdry run。-fで強制実行。

sudo logrotate -df /etc/logrotate.d/kowabana

後は一日14MBぐらいずつ増えるDBのバックアップファイルを何とかしなきゃ。

怖話をRuby 1.9.3とRails 3.2.1にした。

アプリの動作には影響無く簡単に移行できると思いきや、shoulda-contextがrails 3.2から対応しないのでテストを全てRSpecに書き換えた。

rspecコマンド単体で実行した時とrake specした時で結果が違うのが少し気になるが・・・。

怖話リゾートバイトが途中で切れるバグを直しました。

PostgreSQLの調子で使ってたMySQLのtext型の最長を超えてるだけだった。

text: 65535Byte
mediumtext: 16777215Byte
longtext: 4294967295Byte

リゾートバイトは120KBぐらいの長編なのでmediumtextに変えて対応。

# RAILS_ROOT/db/migrate/20120127081325_alter_body_to_mediumtext_stories.rb 
class AlterBodyToMediumtextStories < ActiveRecord::Migration
  def up
    if Rails.env.production?
      execute 'ALTER TABLE stories MODIFY body mediumtext COLLATE utf8_unicode_ci;'
    end
  end

  def down
    if Rails.env.production?
      execute 'ALTER TABLE stories MODIFY body text COLLATE utf8_unicode_ci;'
    end
  end
end

超えてもエラーが出ないから気づかなかったなあ。