preload
12月 25

git とか GitHub とかいうのを使った事がなかったので、このたび初めて使ってみました。というわけで、標記の Rails プラグインを the MIT License にて公開します。


MbMail – GitHub


MbMail は、Rails で日本の携帯向けサービスをつくる際、 メール扱い周りで発生するちょっとした面倒を回避するための小物寄せ集めプラグインです。rails-2.0.2, tmail-1.1.0 環境下での動作を確認しています。また、rails プラグイン形式で配布していますが、MbMail::DMail は rails 環境に関係なく使えます。


MbMail は以下の機能を提供しています。

  • MbMail::DMail
    • キャリア間HTMLメール(デコメール, デコレーションメール, デコレメール)の相互変換
  • MbMail::MbMailer
    • ActionMailer の拡張
      • 標準で使用する charset (エンコーディング)を ISO-2022-JP に変更
      • 文字コード変換器に NKF を使用するように変更 (機種依存文字の送信を可能に)
      • 日本語ヘッダを作成するためのメソッド base64 を追加 (Mailer 内で日本語Subjectや日本語Fromを簡単に記述)
      • RFC違反のドットが連続するアドレスが扱えるよう、TMail::Parser を置き換え

たとえば、以下のように au デコレーションメール形式のファイルがある場合、これを load し to_docomo_format とすれば、docomo のデコメールフォーマットが得られます。

au = MbMail::DMail.load("au_decoration_mail.eml")
docomo = au.to_docomo_format
puts docomo.encoded # => docomo デコメールフォーマット文字列

その他、使用方法サンプルは、git リポジトリの中の spec ファイルたちをご参考ください。


パッケージに含まれるクラスのうち、MbMail::MbMailer は以前、こちらのエントリでも取り上げた「ドット連続アドレス問題」などに対応するものです。ただし、MbMailer を使用する事により TMail::Parser を書き換えてしまいますので、ご注意ください(MbMailer を使用するに当たって、ActionMailer の使い勝手を残しつつ TMail の一部だけ書き換える、ウマい方法が思いつかず。。誰か助けて)。


MbMail::DMail も MbMail::MbMailer も個人的な利用実績がありますので、基本的な部分はそこそこ使えると思います。が、プラグイン形式に切り出したのはこれが初めてですので、何かと不都合があるかもしれません。(絵文字の変換辺りで微妙にオカシイところがあるかも。)あと、git の使い方がよく分かってないうちは、何かと不慣れなことをしでかすかもしれません。諸々ご理解の上、ご利用いただければ幸いです。


なお、再掲を含みますが、上記のプラグイン提供に当たりお世話になった方々をご紹介しておきます。勉強させていただきました。ありがとうございました。

  • 携帯メールを扱うに当たっての base64 メソッドの実装や NKF 利用のアイデアとして、以下のサイト様を参考にさせていただきました
  • DMail の絵文字相互変換に Jpmobile の絵文字変換テーブルを使用させていただいています
  • ActionMailer の拡張時に TMail の幾つかのクラスを書き換え利用させていただいています
  • サンプルで使用している GIF 画像に 素材屋イチゴアポロ の素材を利用させていただいています

ついでに、以前こちらで紹介した「ケータイサイトで機種情報を取得する Rails プラグイン mbterm_db」も GitHub に引っ越しました。ついでに更新しようと思ったけど、更新の仕方を忘れたので、そのうちメンテします。


MbtermDb – GitHub


それでは皆様、よいクリスマス&よいお年をお迎えくださいませ。

Tagged with:
7月 29

W51CAからW62CA(G’zOne)に機種変更した

Uncategorized コメントは受け付けていません。

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


とか言って、何も書けないのもつまらんので、最近機種変更した 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:
2月 25

実は前から公開してたんだけど、最近の機種情報を追加ついで、あと Rails のプラグインを書く勘を取り戻しついでに、ちょっと手を入れたので、改めて紹介しときます。

mbterm_db は Ruby on Rails でケータイサイトをつくる際に、ブラウザのバージョンや画面サイズを取得する Rails プラグインです。

このプラグインは、以前モバイル勉強会で紹介した機種情報 DB の出力の一形式です。機種情報 DB には、基本的に僕が必要なものしか入れてないのですが、最近は FlashLite に傾倒気味なので、そのうち FlashLite のバージョンくらいは入れるかもしれません。

こんなデータベースを持たずとも、ドコモ以外は HTTP リクエストヘッダにそこそこの情報が含まれているのですが、リクエストヘッダの情報は微妙に足りなかったり(一行の文字数とか)、SSL したら取れない事があったりと(SoftBankでたまにある)、結構ハマりがちです。まあ、あったらあったで越したことはないかな、ということで、ご入用の方、どうぞお持ちください。

インストール方法は以下の通り。詳しくは trac の方をご覧ください。jpmobile とか Mobile_on_Rails などのプラグインと併用するのも便利だと思います(使わせていただいてます。感謝! ;-)

$ script/plugin install http://jpmbdb.googlecode.com/svn/trunk/mbterm_db

Continue reading »

Tagged with:
2月 19

Rails や TMail を使った Ruby アプリケーションで携帯メールをさばこうとするとブチ当たる、" 3つ以上連続するドットを含むメールアドレス問題 " の解決方法を再生産したので晒してみます。一応幾つかテストかけて使えてるけど、おかしかったらツッコミください。

まず、TMail::Mail.parse したときのエラーメッセージから:

NoMethodError: You have a nil object when you didn’t expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.[]

これを追っていくと、parser がパースに失敗しているところに行き着く。で、これに対して urekatのスカンク日記3 さんが紹介されているのは、parse 時の Syntax Error を rescue して、「あいまいパース」に落とすエレガントな方法。

プログラマ 福重 伸太朗 〜基本へ帰ろう〜 さんが紹介されているのは、先にアドレスをチェックして、必要に応じて ActionMailer を使わない方法へ回避する、これまたイカした方法。

で、ここで紹介するのは、TMail の parser を書き換えるという方法。
もうちょっと具体的に言うと TMail がメールアドレスのパースに使っている parser.rb – これが Racc というパーサジェネレータで生成されているのだが – の生成元: parser.y を改造してしまう、という方法です。つまり、これをやっちゃうと、同じ稼働環境で動いてるアプリ全体のメールアドレスの parse に影響するので、その辺覚悟してお試しを。

まず、TMail のアーカイブを拾ってきて、以下の通り tmail-1.2.1/lib/tmail/parser.y を書き換える。

$ diff parser.y.org parser.y
211c211,217
< | local_head '.' { val[0].push ''; val[0] }
---
>        | local_head dots
>                 {
>                   val[1].times do
>                     val[0].push ''
>                   end
>                   val[0].push ''
>                 }
235,236c241,242
< dots      : '.'     { 0 }
<             | '.' '.' { 1 }
---
>   dots      : '.'      { @dotnum = 0 }
>             | dots '.' { @dotnum = @dotnum + 1 }

ここで対応したのは、「3 つ以上連続したドット」への対応と、「@ (アットマーク) 直前で連続するドット」への対応の 2 点。(他にもケータイ特有な不可思議なフォーマットがあるかもですが、ここではスルー)

TMail の parser は、ドットふたつには対応していたが、ドット 3 つ以上の場合に対応する生成規則が無い ( dots ‘.’ から dots への還元ができない) ために parse error が起こっていたようだ。

アドレス中の文字列は逐次配列に push され、Address が new されるときに、配列要素の間にドットを入れる (空要素が入っていたら、ドットを一個追加する) という動きをしているようだったので、後半の書き換えで、連続するドットの数をカウントし、local_head への還元時に配列を組み立てるようにした。

前半の書き換えは、local 変数 ( @ の直前) として local_head ‘.’ と、ドットひとつしか許していないようだったので、これを同様に dots 変数を受け付けるようにしたもの。

あとは、こいつを make してやって( make には Racc が必要)、出来上がった parser.rb と parser.y を gem のパスでもどこでも適切なところに置いてやれば OK 。ActionMailer は内部 vendor ライブラリに TMail を包含しているので、必要であれば、そっちも書き換えてやる。(試しに消してみたら、gem の下の TMail を見に行ってくれたみたい。)

この方法のメリットは、サーバ環境を自由に使って良い人なら簡単にできちゃうってこと。デメリットは、これでいいかどうか自信が無いっていうのと、サーバ環境共有してる他のアプリにも影響がおよぶこと、あと、gem update tmail とかやったら元通りになっちゃうってこと。

TMail の過去の修正では、ドット 2 つに対応しているので、RFC 非準拠でもやむなく対応したのかと思っていたが、オリジナルの dots の生成規則を見るに、どうも不本意な実装になっているように見えた。が、この対応方法で合ってるかどうかもよくわからないので、作者さんに連絡する前に、とりあえずここで紹介してみましたです。

Continue reading »

Tagged with: