preload
12月 11

以下のように around_filter 内で reset_session するアクションに対し、大量のアクセスを重ねていくと、メモリ使用量ががつがつ増大していく。

class FugaController < ApplicationController
around_filter :foo
def index
end
protected
def foo
reset_session
yield
end
end

こいつを script/server -e production で起動し、ab -n3000 http://localhost:3000/fuga/ などにより多量のリクエストを送ると、メモリ使用量が 80MB を超えるまでに増大し、リクエスト完了後もまったく解放されない。foo 内で yield しなくても同様。セッションストレージにデフォルトの CookieStore を使った場合のほか、:active_record_store, :mem_cache_store を使っても同じ。session_options[:expires] の設定も関係無し。
なお、before_filter や after_filter で reset_session した場合は、問題は起こらないようだ。また、rails-2.0.2 環境で発見したが、rails-2.2.2 でも再現する。

状況解析のため、こちらのエントリ(Memory leak profiling with Rails) を参考にメモリ利用状況をプロファイルしてみたところ、around_filter を使った場合は String のインスタンス数が一気に膨れ上がった後、一向に解放されないことがわかった。(before_filter を使った場合は、リクエスト処理完了後、それなりに解放された。)

次に、この String の正体を見るために、上記の MemoryProfiler の :string_debug オプションを使って ObjectSpace 中の String をダンプしてみたところ、session_id などセッションデータと思しき文字列が大量に入っていた。リクエスト終了後は、CgiRequest や CGI::Session などのリクエストやセッションに絡むオブジェクトはすぐに解放されていた事から、何らかの原因でセッション内文字列のみ GC 対象にならない状態になっていると思われる。

さらに、上記の String がどの時点で生成されているのかを追ってみた。

actionpack-2.0.2/lib/action_controller/cgi_process.rb L.150-

private
# Delete an old session if it exists then create a new one.
def new_session
if @session_options == false
Hash.new
else
CGI::Session.new(@cgi, session_options_with_string_keys.merge("new_session" => false)).delete rescue nil
CGI::Session.new(@cgi, session_options_with_string_keys.merge("new_session" => true))
end
end

どうも上記の CgiRequest#new_session の CGI::Session.new で確保されているようだ。何が原因なのか追いたいが、CGI::Session は ActionPack で拡張されており、どうも切り分けが難しい。いろいろ書き換えながら試してみたところ、オリジナルの CGI::Session 中:

lib/ruby/1.8/cgi/session.rb L.299

ObjectSpace::define_finalizer(self, Session::callback(@dbprot))

ここのファイナライザ定義があることで、around_filter でのみリークするようだ(これを試しに無効にすると、リークしない。謎)。かといって、こんなところを無効にするわけにはいかず.. と、今度は around_filter と before_filter とで、何が変わってきているのか、を追ってみた。

actionpack-2.0.2/lib/action_controller/filters.rb L.709-

def run_before_filters(chain, index, nesting)
while chain[index]
filter, index = skip_excluded_filters(chain, index)
break unless filter # end of call chain reached
case filter.type
when :before
filter.run(self)  # invoke before filter
index = index.next
break if @before_filter_chain_aborted
when :around
yielded = false
filter.call(self) do
yielded = true
# all remaining before and around filters will be run in this call
index = call_filters(chain, index.next, nesting.next)
end
halt_filter_chain(filter, :did_not_yield) unless yielded
break
else
break  # no before or around filters left
end
end
index
end

ソースを追う限り、filter 処理は適用順序に並べた配列形式に変換された後、before_filter も around_filter も上記の ActionController::Filters::InstanceMethods#run_before_filters で実際のフィルタ処理がおこなわれているように見える。で、around_filter では、上記の filter.call(self) へ渡しているブロックで index = call_filters している箇所があるが、いろいろ切り分けていってみるに、どうもここが怪しい。around_filter に入れ子になっている filter を再帰的に処理しているようだが、ここの中で CGI::Session.new するとセッション中の String のみが解放されない状態になってしまう.. ということだろうか。

もうひといきな気がするんだが、ちょっとツラくなってきたので、とりあえずここまでで POST しておく。Ruby の GC の問題なのか、Rails の黒魔術のせいなのか、まだ微妙なところだ。とりあえず before_filter にしとけば問題は起こらないのだが、多数のフィルタ処理をサイトの全域で使うようなサービスの場合、個々のコントローラには around_filter をひとつ書いておいて、その filter 内に多数のフィルタメソッドを並べる、というのがラクチンだとおもう。うーむ、悔しいが before_filter で回避してしまおうか.. フィルタ内で、セッション検査をおこなった上で、不正セッションであれば reset_session して仕切り直す、みたいなのって、わりとあるような気がするんだけどなあ.. ハマってる人が見当たらない。

Continue reading »

Tagged with:
10月 31

@東京ステーションコンファレンス。本日1日目は諸事情あり十分な聴講時間がとれなかったこと&明日2日目は行けそうにない事から、今日聞けた中で一番面白かった Ameba(アメブロ) の話のメモをとりあえずポストしておきます。スピーカーはサイバーエージェントの岡田さん、大黒さん。


セッションのメモは以下に転記しますが、講演の内容は、2006 年以降アメブロで行われた Oracle => MySQL 移行の苦労話や、増大する PV (月間50億PV!) による負荷対策の取り組み、各種ストレージエンジン x ファイルシステムの組み合わせでのパフォーマンス検証結果、自作サーバによる各種ディスク構成でのパフォーマンス検証結果などなど、といったところでした。


率直な感想としては、けっこう生々しくて濃いセッションでした。サイバーエージェントさんが社内の研究開発で、ここまで面白そうな事をやられてるとは存じ上げなかったので、そちらも驚きました。プレゼン資料や動画については、後日公開されると伺いましたので、興味のある方は、サイバーエージェントさんサイトとか、このプレスリリース周辺をウォッチしておくと良いかも知れません。


以下、メモ。

  • 組織の話
    • 「新規開発局」以下の組織体系。プロデュース、フロントクリエイティブ、システムクリエイティブ、インフラテクノロジーの 4 区分
    • インフラチームは、更に、インフラの統括的なところと、ネットワーク、DB の 3 区分
    • DB チームの業務は DB に関わる部分全般。監視やら、パフォーマンス改善、研究開発や DC でのラックマウント作業も
  • Oracle からの移行の話
    • 2006 年 9 月時点では Oracle x 2 での Active/Stanby – 月間 4 億 PV
    • 2008 年現在は Oracle x 4, MySQL シングルマスタ x 1 + レプリケーション 41 台。Oracle で管理していたブログ記事や、コメント、トラックバックのレコードを MySQL に移行
    • MySQL への移行前(中?)も、ページの一部(サイドバーとか)へのキャッシュ導入、WebLogic から Apache + tomcat への移行、NFS マウントから WebDAV への移行などのチューニングは、いろいろやっていた
    • MySQL へ移行するにあたって、レコード数の多いデータ(ブログ記事とか 80 百万レコードくらいあったとか)は –replicate-do-table しつつサーバ/テーブルを分割。最終的に月間 50 億 PV 捌けるようになったとか
    • Oracle からのデータ移行は、ダンプしたやつを scp とかで運んで LOAD DATA INFILE するのが速い。
    • 移行ツールが一見ラクそうだが、やってみるとアプリ側の処理がボトルネックになってるようだった。LOAD DATA INFILE で 2 億件ほどのレコードを 4 時間で移行できた
    • DB を変えるにあたって、DB に適したシステム設計にできるよう、UI 側のデザイン見直しにも積極的に関与したとか。ブログ管理画面に年月タブを表示したり
    • INDEX の見直し、クエリの見直し、explain での確認を丁寧にやった
    • 最終的に、一画面表示の際の、参照系のクエリ発行回数は増加したが、ディスクの I/O はかなり軽減し、スケールアウトしやすい構成にできた
    • 現在の構成で 35000-40000 クエリ/分くらいだが、60000 クエリくらいまでは行けそう
  • ストレージエンジン x ファイルシステムの比較検証の話
    • 開発では CentOS 4 系、ファイルシステムに ext3、DB に MySQL 4.1 系 MyISAM 利用がスタンダードになっていた。
    • サイバーエージェントでは MyISAM が好まれている。テーブルロックはテーブル分割で回避できているし、InnoDB は運用時の扱いにくさもあるので避けられているとか
    • 一部 MySQL 5.1 を採用したサービスもあるが、もっといい組み合わせが無いかと、いろいろ試してみた
    • ext3, xfs, zfs の比較。OS が異なるため厳密な比較はできなかったが、ext3 < xfs で xfs のスループットが 1 割ほど良い結果が得られた。zfs はチューニング次第で ext3 レベルまで持っていけるかも
    • xfs は journal log 周りにチューニングの余地があり、まだ伸びしろがありそう
    • MyISAM, InnoDB, Maria の比較。InnoDB は想定ほど悪くはなかった
    • 組み合わせ的には xfs + MyISAM がもっともよさそう
  • 自作サーバの話
    • 自身で機器選定してサーバ構築&パフォーマンス検証。ハードウェア構成検証、スキルアップ、コスト削減のための取り組み
    • HW-RAID, SW-RAID, SSD によるディスク構成比較
    • HW-RAID なかなかよい。SW-RAID は I/O が増大してくると不安定に。SSD は読み込みは抜群に高性能だが、書込みパフォーマンスが悪い

ブログアプリってことで、参照系アクセスが多いんでしょうね。50 億 PV でも、シングルマスタ& MyISAM テーブル分割で回避できちゃうんだなあ。いや、もちろん、言うほど簡単じゃないんだろうけど。しかし 41 台レプリケーションで LAN 内ネットワークトラフィックは問題にならないんだろうかとか思ってたら、その辺の議論も質疑で交わされてて、そちらも参考になりました。いまんとこ、ネットワーク側はそんなに問題になってないとか。うんー、勉強になりましたです。


なお、上記メモ後半部分の、サイバーエージェントさん社内研究成果については、コンファレンス会場の展示会場ブースで見せてもらう事ができます。他のテーマも含め、いろんなネタがファイルされていたのですが、こういう研究活動のアウトプットがしっかりまとめられているという体制/仕組みもすばらしいなあと思ったのでした。


以上です。一部理解が追いつかなかったところもあり、正確にメモできてるかは微妙です。すみません。なんかオカシイんじゃねえかとおもうところとか、訂正とか指摘いただける方は、コメントとかで教えてください。


ちなみに、明日はニフティさんココログの PostgreSQL => MySQL マイグレーション事例紹介セッションがあるそうです。こちらも聞いてみたいのですが、行けそうにないので、誰かレポートしてくれるとうれしいです。

Tagged with:
9月 29

PHP×携帯サイト デベロッパーズバイブル を日頃からお世話になっている、memokami の荒木さんよりご献本いただきました。荒木さん、ありがとうございました。


さて、タイトルにも書きましたが、この本、ケータイサイト開発に関わる方なら PHPer でなくともオススメです。実装例やサンプルライブラリこそ PHP で紹介してあるものの、各種環境構築やサーバ設定などの主題から外れる内容は極力省かれており、全体的な解説の重心は「ケータイサイトを作る際に知っておきたいこと、考えておきたいこと」におかれています(と僕は思います)。ですので、「知っておきたいこと、考えておきたいこと」を読み解いていくことで、他言語での開発をおこなう場合でも、とても参考になる一冊だと思います。


もうちょっと細かく書くと、僕がこの本をオススメする理由は、大きく次の 3 点が挙げられます。

  1. 3キャリア対応サイトを作るために、3箇所(以上)に分散している一次情報をチェックし、比較活用できる形にする必要がある => その手間をショートカットできる
  2. キャリア仕様からは必ずしもうかがい知れない、「やってみなければ分からない」ポイントが押さえてある
  3. これらの情報が、実際のサイト開発の流れに載せて、順序立てて解説してある

1 点めは、ケータイサイト開発を始めて、すぐに遭遇する「メンドクサイポイント」です。たとえば「位置情報を使ったサイトを作るぞ」という状況になったとき、各キャリア仕様を当たることになりますが、「つくろうiモードコンテンツ」やら「EZ Factory」やら「SoftBank Mobile Creation」やらを巡回して、必要そうな資料(PDF)をピックアップしてくることになるわけです。当然、3 社とも資料の様式/解説手順は異なりますし、必ずしも一つの資料じゃ見えきれないキャリア特有の前提知識があったり、初めて見る標準仕様っぽい名前やら用語が出てきたりと、これらの情報を整理解釈するフェーズがどうしても必要です。これらの情報が「一次情報はどこにあって」「最低限見ておくところがこれで、3 キャリアではこうなってて」「実装するならこうだ」というのが一通り書いてある、というのは、これだけで大きなショートカットになります。


2 点めですが、たとえば、次のような情報で「何だこりゃ、どういうことよ」「うわ、ケータイサイト、メンドクさそう(でもやることになっちまった)」って方は、きっとこの本を読んでおくと、少なからず救われるのではないかと思います。

  • SoftBank モトローラ機種は、User-Agent の表示フォーマットが異なる
  • au は Win かそうでないかで利用可能絵文字数を見分けると良い
  • SoftBank 絵文字の扱いは 3GC 機種とそうでない機種で微妙に違う
  • au デコレーションメールの MIME フォーマットは他キャリアのフォーマットと異なる
  • SoftBank の旧機種では端末シリアル番号が取得できない
  • au だけは HTTP リクエスト拡張ヘッダで、位置情報対応有無を確認できる

こんなふうに、まさしく「ハマった人しか知らない」「やったことがある人でないとわからない」ポイントが目白押しです。とくに絵文字の扱いに関する説明の丁寧さには特筆すべきものがあります。3 キャリアサイトでの絵文字対応は鬼門ですが、ここまで絵文字についてページを割いて丁寧に説明している本を、僕は見たことが無いです。

余談ですが、僕は最近↑のデコレーションメール周りでいろいろハマってました(諸事情あり、ここで紹介できてなくて申し訳ないです)。ここも、しっかり解説してくれてるのが、ちょっと悔しかったりする。


最後の 3 点めは 2 点めとも共通してくるのですが、

ケータイサイトの開発では、「技術的に難易度が高い」というのとは異なるトリッキーなハマりどころが多く、何も知らずに足を突っ込んでしまうと、「オイオイ、こんなのでアリなのかよ」「この○○××め〜!(○○にはお好みの文句、××にはお好きなキャリア名もしくは機種メーカをどうぞ)」という実装 TIPS と、特異な( bad というには抵抗があるので)ノウハウの嵐に遭遇します。ケータイサイト開発を安易に考えていた結果、落とし穴にハマりまくって、見積りが大きくブレたという痛い経験は無いでしょうか。僕はあります。泣きました。


現実的には、最近は、これらのハマりポイントも Web 検索で解決できるようになってきました。けれど、この本は単にハマりポイントと対処療法を散乱させた、Web で検索できるネタの寄せ集めではありません。これらを、実際のサイト開発の流れに載せて、順序立てて解説してくれているという構成もオススメポイントのひとつです。こういう構成にしてくれているおかげで、これからケータイサイト開発に取り組む方がハマる前に、何を見ておくべきかを、あらかじめ知ることができると思います。


というわけで、携帯サイトの開発にかかわっている僕も、多くを勉強させていただきました。ケータイに関する開発にこだわって携わってこられ、自身でのケータイサービスも運用されている荒木さんならではの、エネルギーを感じる一冊です。これからケータイサイト始める方にも、すでに幾つか経験されてる方にもオススメです。


最後に、

荒木さんが巻末に書かれている通り、ケータイ技術は日進月歩、異常に速いスピードで進化していますから、確かにこの本の内容も、すぐに古くなって行ってしまうかもしれません。が、今までのスピードに比べれば、端末の買い替えサイクルも長くなってきたし、「普通のケータイサイト」を作る上でのポイントはちょうど成熟してきた頃なんじゃないかな、とも思います。

今後は iPhone やら android やらの話題がモリモリ世に出て行きそうですが、それらの開発 TIPS が一般的に必要とされるのは、もうちょっと先になりそうですよね。まだまだケータイサイトはいっぱい生まれてきてますし、ケータイサイト開発解説本としては、とても良いタイミングで発売されたのではないでしょうか。

Tagged with:
7月 29

ここのところ、請負案件から派生してる研究活動が多いので、イマイチネタが放出できてなくてアレです。まあ、今に、書ける段階になれば、書ける範囲で公開していきます。


とか言って、何も書けないのもつまらんので、最近機種変更した au の新機種についてダラダラ書こうと思います。W51CA(黒) から W62CA(G’zOne)(白) に機種変しました。使い始めて一週間くらい経ったので、宣伝でも批判でもなく、僕の視点と感想を適当にまとめてみます。きっと W62CA という機種に興味が無ければ全然面白くないし、興味があっても、一部なにを言ってるのか分からないくらい細かいところに言及すると思います。なので、途中で飽きるかも。飽きたらすいません。

ココが変わってて良かった

防水・耐衝撃
濡れを意識しなくていいのは快適。家の洗面所にも気兼ねなく置けるし、アウトドアレジャーにも良い。冬のゲレンデでも気にせず取り出せる
センサーいっぱい(G’zGEAR)
温度計とか電子コンパスが楽しい。室内でエアコン効き過ぎとかわかるし、高度計と電子コンパスは、「あの山はなんだっけ?」とか「富士山こっちか!」みたいのが、これまたゲレンデで楽しめそう(言うほど行ってないくせに)
ブラウザでの通信体感速度アップ
他の部分では速度ダウン(後述)だけど、ここは快適。EV-DO rev.A ってやつ?W51CA が対応してなかったのかどうかは知らないけど、体感は確実に速くなってる
ブラウザでのテキストコピーができるようになった
電話番号が tel: リンクになってないときとか、不便だったんです。これでコピって電話帳登録とかできるようになった
歩数計&カロリーメーター
待受け設定しておいたら、常に当日分の消費カロリーやら食べ物に換算したアニメーションやらが表示されて、楽しい。僕の昨日の運動量はマッシュルーム 198 個分だった。少ないな..
左右キーはブラウザの一画面スクロールになった。ブラウザの「戻る」「進む」は「メール」「EZWeb」ソフトキー
最初違和感があったけど、端末横のスクロールキーは押しにくかったので、これは結構うれしい。ひょっとして FlashLite コンテンツのインタラクティブ再生で四方向ナビゲーション拾えるようになったか?と思って

var keyListener_obj:Object = new Object();
keyListener_obj.onKeyDown = function() {
switch (Key.getCode()) {
case Key.DOWN :
cube._y += 10;
break;
case Key.UP :
cube._y -= 10;
break;
case Key.LEFT :
cube._x -= 10;
break;
case Key.RIGHT :
cube._x += 10;
break;
}
};
Key.addListener(keyListener_obj);

こんな感じで cube ひょこひょこさせるサンプル swf 作ってみたけど、やっぱダメでした。四方向拾えるのは未だに SoftBank だけか

通常メール <=> デコレーションメールの編集中切り替えが可能になった
今まで mailto リンククリックするとデコレーションメール使えなかったのですよ。これで急にデコレーションメールに気分が変わってもだいじょうぶ!
デコレーションメール編集中にデコレーションエモジ(絵文字)へのショートカットが使えるようになった
今までのデコレーションメールはデコレーション絵文字を入れるのでも通常のインライン画像挿入操作だったので、連続入力もできず、使いにくかった。これでだいぶドコモのデコメール編集の使い勝手に近づいてきたかも(ドコモのデコメール編集 UI は通常メールとの境がほとんど感じられない。アレくらい割り切っていても良いと思う。ユーザは HTML メールとか中身がどうなってるとかはどうでも良いんだし)
LISMO Playerの起動速度up
メニュークリック => スプラッシュ表示 => Player メニュー表示が一秒未満。ここはがんばってるとおもう。使ってないけどね(Macだと使えないんだもん
Run&Walk アプリ
ジョギングに使ってみてるけど、地図へのコースマッピングやら、速度チェックやら連動して、ちょっと楽しい。続けんとなあ
背面液晶(電子ペーパー)で時刻が常時表示
なにもキーを押さなくても時刻が常時出ててくれるので、テーブルの上とかでも、操作無しでこっそり時間確認できてよい(何がだ
Bluetooth 搭載
未使用だけど、使ってみたい。Mac で LISMO 行けるようになったらヘッドホンへのアダプタ買って使ってみるんだけどな
ワンセグアンテナが内蔵
いちいちアンテナ伸ばさなくて良い。こういうのは気持ちいい。もっと起動が速くなってくれると良いんだけど

ココは変わってなくて良かった

防水仕様でキーがシート形式なのに、かなり押しやすい
前の W51CA はかなりキーが押しやすい形状だったけど、この機種もキーの凸部がちゃんと確保してあって、シート形式とは思えないほど、ちゃんと触感がある。結構工夫したところじゃないかな、これ
メール送信中に折り畳み閉じても、送信処理続行してくれる
稀に、折り畳むと送信処理を中断する機種が居て、送信完了まで見届けないといけないのが困る。たまに「送信できませんでした」ってエラーを報告してくるのはなんとかしてほしいけど(送信できるまでやってくれよ、と思う)

あ、この項目あんまし無いな。でも、↑は重要。

ココが変わってて残念

基本的に、何するにも処理遅い
通信速度は上がってると思うんだけど、メインメニュー起動、メール画面表示、ブラウザやメーラから待受に戻る、データフォルダ開く、など画面を切り替える操作は、ほとんどが 1 秒以上かかる。データフォルダ表示や移動に毎回「処理中です」とか出るのも謎。前の機種よりも全然データが少ないのに。
メニューカーソル移動も、方向キー押しっぱなしで動かすだけでも 3,4 項目ごとに引っかかる。文字入力もたまに後追いになる。すげーストレス
電源ボタン短押しで、待受に戻らない
メインメニューより下の階層にいると電源ボタンでメインメニューへ、ブラウザだと EZWeb メニュー画面へ、というように、一発で待受に戻らなくなった。常に待受に戻しておきたいのに、電源連打しても上述の通りレスポンス遅いので、これまたストレス
待受ショートカットから新着メール起動して、電源ボタンで待受に戻ってくると、他のショートカットにカーソルが残留している
この状態だと、EZ ニュースフラッシュが流れないので、もう一度電源ボタンを押してカーソル解除する必要がある。ただし EZ ニュースフラッシュが流れているときに電源ボタンを押すと、ニュースフラッシュが消えてしまい、再度表示するためには「上」キーを押す必要がある => しかも、この表示に 1 秒程度かかる上に、表示設定無しにしてある検索ガジェットが勝手に登場してくれる(意味がわからん..)。このため、「常に待受はニュースフラッシュ表示させておきたい」場合は、電源ボタン連打ではなく、待受に戻る => クリアキーでカーソル解除 をいちいち画面で応答状況を確認しながら操作する必要がある
ガジェット使わない
表示する => ガジェット操作に入るためにそれぞれ 1-2 秒かかる。これなら前の機種でショートカットメニュー開いた方がよっぽど早い
2画面分割(マルチウィンドウ)使わない
分割できたのは一瞬うれしくてスゲーって思ったけど、ケータイでそんなにいっぺんにいろいろやんないから、それで重くなるくらいなら要らない。なんでいろんなキャリアでマルチタスク的な機能を入れてるんだろう。みんな使ってるんだろうか。ドコモで「ブラウザがこれ以上開けないから一旦終了してください」みたいなエラーが出るのも、未だにまったく理解できない
ケータイ de PCメール、使うと思ったけど有料だし使わなさそう
IMAP してる gmail をブラウザで覗きに行くだけでわりと十分とわかった。会社メールの流量が少なくて、それをケータイで送受信したい人は便利かもね
ツータッチ入力設定で英字モードに入ると、ここでもツータッチ設定になる
日本語ツータッチ入力設定してあっても、英数字はツータッチになってないのが au の魅力だったんだけど、変わってしまったみたい。ボタン一個で通常の英数字入力モードに戻せるので、まだ我慢できるけど、前の方がよかった。みんな英数字もツータッチで入力してるのかな?ドコモとSoftBankはツータッチ設定を解除しないと英数字入力もずっとツータッチになるのが使いにくいんですよ
ツータッチ入力時の記号の割当や改行入力、記号表呼び出し時のキー割当が微妙に変わっている
これは慣れるしか無いかなぁ.. 句読点(前まで 88 で入力できてた)はどうやって入れるんだ
背面液晶(電子ペーパー)に呼出し元が表示されない
解像度&アニメーションの応答的に厳しいのかな.. 開いてメイン液晶見れば良いんだけど、不便
メニューの背景色ができない。フォントも細くてヘニョイのしか無い
装飾できるメニューは一階層めだけみたいで、その下は、すげーシンプルな白黒 UI しかない。フォントも、変。gmail を EZWeb ブラウザで見ると、フォントが旧世代の機種のドット文字みたくカクカク。なんだこれ。どうにかできるのかな..
電話をかける際の呼び出し中画面で、コール先の電話番号表示が消える
「プップップッ」音が消えたときとかに間が空くと「あれ?どこにかけたっけ?」って思うんだけど、画面に何も表示されてなくて、確認のしようが無くて困る
EZムービーの早送りが、高速再生というより、秒飛ばしコマ表示再生
EZムービー再生中に右キーを押すと早送りできるんだけど、W51CA はそこそこ滑らかな高速再生で、一通りの映像が見られたのに、この機種は数秒ごとのコマがパラパラで表示されるようになっちゃってる
ライト点灯のキーが暗闇で識別しにくいところになった
W51CA は # 長押しでカメラ用のライトが点灯できて、簡易懐中電灯的に使えた(PCの裏側とか机の下の暗所作業でよく使う)んだけど、この機種は側面ボタンの 4 つ並んでるうちの上から 2 番目にライトが割り当てられてる。これがなんとも暗闇では指先で判別しにくい位置で、これまでに何回もマナーモード設定キーと間違えちゃってる
たまにメインメニューからその下の階層に行けなくなる
メニューのカーソルキーは動くのに、決定キーが無視されて、一切のメニューが使えなくなる。再起動すると復帰。なにこれ
折り畳み開いたときに、たまに画面真っ黒でなにも表示されない
何かボタンを押すと待受けが表示される。何が起こってるんだ
たまにカメラが起動できない
カメラ起動しようとすると「カメラの起動に失敗しました」ってエラーが出る。知らんよw この現象が出ると、電源も切れなくなるので、電池パックを外して再起動。

ココが変わってなくて残念

ブックマークデータ移行時に、フォルダ構造が消える
W51CA にしたときもこうだったんだけど、未だに同じだった。ブックマークの整理を作り直すのが面倒

こんなかんじかな。変わっても我慢できるものは仕方ないとして、基本的に、処理が遅くなってるのがストレス。au は速かったのが良かったんだけど、これでモッサリ度は 3 キャリアだいたい一緒になってしまったなあ。防水は本当に有り難いので、ソフトウェア更新で速くできるものならガンガンやって欲しい。(いろんな事情があって)無理なんだろうけど。


ちなみに、ナカチェン?ケータイアレンジ?、とかでメインメニューを変える際は、項目ごとでカーソル停止した際にアニメーションが入るタイプを選ぶと、大変遅いぽいので、さくさく使いたい人はアニメーションが入ってるようなメニューは避けた方が良いと思う。これは FlashLite が遅いのかな。au で FlashLite アニメーション、やけに遅いし。


以上、大変偏った視点で恐縮ですが、思うままに書きました。

Tagged with:
5月 02

ssh(1) と apache proxy を使って、ローカルの開発環境にケータイの実機ブラウザから直アクセスして動作確認する方法。ssh(1) の -R オプションを使うのがキモです。これだけで分かる人は、以下略でどうぞ。

ちょっと考えたらできそうな気はしてたんだけど、-R オプションの存在を知らなかったので、いろいろ試してみる時間が取れなかったのです。で、ふとマニュアル読んでたら -R オプションの存在を知り、やってみたらやっぱし簡単にできた、と。みんなやってるのかもだけど、あまりネット上で見かけない tips なのでポストします。

動作イメージ

(A)                  (B)                        (C)
携帯電話 ←────→ サーバ ←─────→ ローカル開発環境
http    80   13000    ssh    3000

まず、(C) の開発環境で Web アプリケーションを稼働させて、その後 (C) から (B) サーバへ ssh(1) で接続します。この際、-R オプションを指定し、(B) サーバの適当なポート(ここでは 13000)へのアクセスを、(C) の稼働環境 Listen ポート(ここでは 3000) にフォワードします。

次に、(B) サーバへの http アクセスを、(B) サーバ上ローカルの 13000 ポートにプロキシする設定をします。これで、(B) サーバへの http アクセスが、ssh のポートフォワード設定に渡されるようになります。

設定はこれだけ。あとは (A) の携帯ブラウザから (B) へ接続すれば、アクセスがローカル開発環境へ飛んできます。

用意するもの

上図の通り、(B) サーバとして使える インターネットから固定名もしくは固定IPでアクセスできて、わりと自由に使えるサーバ機 があれば、だいたいオッケーです。レンタルサーバでも良いですが、リモート側に開いたポートをローカルにフォワードするということをやるので、共用環境ではオススメしません。

ローカルの開発環境を見に来る、ということですので、ローカルには Web アプリケーションの稼働環境が入っている事が前提です。最近の気の利いたフレームワークは httpd や DB もセットになっててラクチンですね。

サーバ側の設定

上記 (B) サーバのアクセス名を example.com とします。

サーバ側には ssh 接続できる sshd と、適当な http プロキシの設定が必要です。僕は sshd に OpenSSH、http プロキシには Apache の mod_proxy を使いました。どちらもパッケージシステム等で簡単にインストールできます。

Apache のプロキシ設定は、以下のような感じです。httpd.conf など適当なところに書きます。

ProxyRequests Off
<VirtualHost *>
ServerName mobile.example.com
ProxyPass / http://localhost:13000/
ProxyPassReverse / http://localhost:13000/
</VirtualHost>

mobile.example.com の部分は、適当に読み替えてください。
要は ProxyPass を書くだけなので、Location とかで適当なパス以下をプロキシしても良いと思います。VirtualHost にしてるのは、アプリ内で指定するリンクのパスの書き方を初期から気にするのが面倒なのでルートを合わせたい、というだけ。

ここまで設定が終わったら $ apachectl graceful で適用して、サーバ側設定おわり。

ローカル開発環境側の設定

(C) のローカル側には ssh 接続クライアントが必要です。ssh クライアントが用意できたら、上記の (B) サーバに ssh するときのオプションとして -R を指定し、接続します。

$ ssh -R13000:127.0.0.1:3000 example.com

こんな感じ。-R オプションには、サーバ側で待ち受けるポート:フォワードする先のアドレス(接続元ネットワークで識別できるもの):フォワード先ポート を指定しています。127.0.0.1 のところには localhost と書いても良さそうなのですが、これだと僕の環境だとうまくいきませんでした。詳しくは $ man ssh をどうぞ。

携帯からアクセス確認

携帯のブラウザから、プロキシ設定した (B) サーバ(上記だと http://mobile.example.com/ )へ接続すると、ローカルの稼働環境にアクセスが飛んできます。ssh(1) スゲー。-R オプションスゲー。

うまくいかなかったら、ssh 接続した状態で (B) サーバから $ curl http://localhost:13000/ とかやって、ポートフォワードがちゃんと動いてるか、mod_proxy の設定がちゃんと生きているか、とかとか、確認してみてください。

おわりに

最近は携帯サイト開発向けのイカしたエミュレータが出てきてたりしてますし(Winソフトなので、使えてない Orz)、moxy やら ssb も超便利なので、あんまし面白くない tips かもしれません。が、ケータイサービス作ってると、やっぱし実機確認が、ツラくもあり面白くもあるフェーズだと、僕はおもいます。どうせパケット定額制使ってるんなら、がりがり実機確認しちゃえばいいじゃん、と。

手元の実機で目の前で作ってるアプリがすぐに見られるというのは、結構快感です。ちょっと出来上がってきたので実機で見ようかな、と思っても、デプロイ環境作るまでに一手間あって、そこでテンション下がることも多いです。手元でちまちま仕込みながらも、さくっと実機確認できる環境があるのはうれしいなあ、とやってみながらおもったのでした。

おお、最近ずっと書いてなかったからか、やけに真面目な文体になっている。なぜだ。

Tagged with: