メイン

2009年7月13日

iモードブラウザ 2.0まとめ
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

こんばんは、五十川です。

ご存知の通り、5月以降に発売開始されたNTTドコモの携帯電話の殆どには、新しいiモードブラウザ 2.0が搭載されています。iモードブラウザの大幅な仕様の拡張はi-XHTMLの登場以来ということになりますが、iモードの登場から10年経って登場した新しいブラウザは、i-XHTMLのときよりも遥かに大きな、過去最大の変化を遂げています。

iモードブラウザ 2.0の詳細は、ドコモ公式のiモードブラウザ 2.0にまとめられています。以下では主要な変更点を確認していこうと思います。


キャッシュ容量拡大

1画面あたり読み込めるデータの最大量が、従来の100Kバイトから500Kバイトに、大幅に拡大されました。ご存知の通りiモードの場合この値は、画像などの外部リソースもすべてひっくるめた値ですが、iモードブラウザ 2.0では、新たにCSSファイルやJavaScriptファイルも外部から読み込めるようになりましたので、これらのデータ量もこの制限の対象になります。

なお従来は、最大データ量を超過した場合には、単に警告が表示されるだけというのが一般的だったと思いますが、iモードブラウザ 2.0搭載機種では、機種によるのかもしれませんが、「フルブラウザに切り替えると見れます。切り替えますか?」といった旨のダイアログが表示されるようになっているようです。

なお、サーバサイドでブラウザのバージョンを判定する必要がある場合は、User-Agent文字列中のキャッシュサイズを示す箇所の値が“500”(以上)であるかどうかで行います。


Cookie対応

これまではCookieが利用できなかったため、ドコモ端末に対応したウェブアプリケーションでは、セッションIDをURLに付与する実装が広く行われてきました。他のキャリアはCookieが使えるため、ドコモのみ他と異なる実装が必要で、かつセッションフィクセーションなどの攻撃に対して細心の注意を払う必要がありましたが、ついにCookieがサポートされたことで、iモードブラウザ 2.0を搭載した端末に限っては、他のキャリアと同様の実装が行えるようになったということになります。

iモードブラウザ 2.0のCookieの仕様は以下のようになっています。

  • 端末で有効無効の設定可能(デフォルトは有効)
  • 1件あたり4Kbytesまで、1ドメインあたり20件まで保存
  • SIM単位

余談ですが、これまでドコモユーザは、Cookie利用を前提とした海外のケータイサイトを利用できず、一方日本のケータイサイトは、攻撃に対する安易な防衛策として、IPネットワークによるアクセス制限が広く実施されてきました。個人的には最大手キャリアのこの仕様が、日本のケータイサイトの、いわゆるガラパゴス化の一因であったのではないかと思っているので、今回のCookie対応は望ましことではないかと考えています。いや、時既に遅しな気もしますけどね。


Referer対応

これはiモードブラウザ 2.0で最も注意しなければならない変更です。

Cookieの項でも述べた通り、ドコモ対応のウェブアプリケーションではセッションIDをURLに付与する実装が広く行われてきました(iモードIDを利用することでこれを回避できますが、iモードIDが登場したのは比較的最近で、それ以前は、公式サイト以外では、URLにセッションIDを付与するか、すべての遷移でUTN属性を使用した個体識別番号の取得を行い続ける以外に、持続的なセッションを管理する方法はありませんでした)。セッションIDが第三者に漏れるとセッションフィクセーションなどの攻撃に晒される危険が生じるわけですが、これまでのiモード端末はRefererを送出しないため、少なくともこれによるセッションIDの漏洩の危険はなかったわけです。しかし、Refererを送出するiモードブラウザ 2.0に対してもセッションIDを含むURLにアクセスさせている場合は、RefererによるセッションIDの漏洩の危険が生じますので、Cookieを利用する(あるいはiモードIDを利用する)ように変更する必要があるかもしれません。

Refererの送出も、Cookieと同様に端末で有効無効の設定が可能です(デフォルトは有効)。


VGA対応

ブラウザ画面のVGAサイズでの表示が可能になりました(以下、ドコモの記述に合わせてVGA/QVGAという表現を使いますが、従来もQVGAが必ずしも240×320ピクセルではなかったのと同様に、VGAと言っても必ずしも480×640ピクセルというわけではありません)。

表示モードは、サイト側が以下のようなMETA要素を記述することで決定します。

<meta
 name="disparea"
 content="{qvga|vga}"/>

content属性値が“vga”であれば、VGAモードになります。値が“qvga”であるか、このMETA要素がないHTMLはQVGAサイズで描画されます。

三大キャリの中でいち早くVGAに対応したソフトバンクでは、VGAかQVGAかはユーザが端末で設定して切り替えますが、ドコモの場合はユーザが変更することはできません。これは、従来との互換性を最大限保つために決定された仕様なのでしょう。

しかし、この画面サイズの変更によって問題が生じる場合もあります。

画面サイズの管理

ひとつは画面サイズの管理です。ご承知の通り、auやソフトバンクと異なり、iモードブラウザはHTTPヘッダに画面サイズ情報を含まないため、画面サイズを特定する必要があるケータイサイトでは、端末ごとの画面サイズを独自に管理する必要があり、これはiモードブラウザ 2.0でも同様です。しかし、これまでブラウザの画面サイズは、原則1端末あたり1種類でしたが、iモードブラウザ 2.0では、VGAとQVGAの2種類の画面サイズが存在するため、サイトが対応する画面サイズに応じて、適切な値を管理しなければなりません。

携帯端末の判別を行うライブラリとしては、PerlではHTTP::MobileAgent、PHPではNet_UserAgent_Mobileがよく利用されているかと思われますが、いずれも現時点での最新バージョン(HTTP::MobileAgentは2009年7月7日付けの0.28、Net_UserAgent_Mobileは2009年6月23日付けの1.0.0)に含まれる画面サイズは、iモードブラウザ 2.0搭載端末のものはVGAのもののみとなっているようです。

以下は、Net_UserAgent_Mobile 1.0.0の構成ファイル中、画面サイズデータを管理しているNet/UserAgent/Mobile/DoCoMo/ScreenInfo.phpの、P-07Aの箇所ですが、縦横のサイズはそれぞれ1種類、VGAのもののみとなっています。

...
// i-mode browser 2.0
'P07A3' => array(
                'width'  => 480,
                'height' => 662,
                'depth'  => 262144,
                'color'  => 1
                ),
...

従って以下のようなコードでは、画面の幅を返すNet_UserAgent_Mobile_Display->getWidth()は、VGAの値である“480”を返します。

// As of Net_UserAgent_Mobile 1.0.0
$mobile  = Net_UserAgent_Mobile::singleton('DoCoMo/2.0 P07A3(c500;TB;W24H15)');
$display = $mobile->makeDisplay();
$display->getWidth(); // 480

もしこれらのライブラリを利用しているウェブアプリケーションがQVGAサイズを想定したものである場合は、これらの値を独自にメンテナンスする必要があるかもしれません。幸いどちらのライブラリも、クラスファイルに直接手を入れる必要はなく、別途にXMLファイルで画面サイズを管理できるようになっているので、サイトがQVGAに対応したものであれば、QVGAの値を入れたXMLファイルを用意すればよいでしょう。

あるいはもし、アプリケーションがVGAとQVGAの両方をページによって切り替えるようなものである場合は、これらのライブラリの現時点での実装では要件を満たせないかもしれません。

横画面のサイズ

もうひとつの問題は横画面のサイズです。これまでにも横画面をサポートした端末は存在しましたが、その画面サイズはいずれも240×240ピクセルでした(画面の横方向に余白があり、そこには時計などが表示されていました)。つまり、縦画面でも横画面でも、画面の幅はいずれも240ピクセルだったわけです。しかしiモードブラウザ 2.0搭載端末の横画面サイズは、従来と同じ240×240ピクセルのものもある一方で、そうではないものも登場しています。iモードブラウザ 2.0の仕様は下位互換性の維持に極力留意されていますが、この点はそうではありません。

例えばP-07Aの場合、QVGAの画面サイズは、縦画面では240×331ピクセル、横画面では427×178ピクセルと、単純に幅と高さが入れ替わった値ですらありません。

従って、画面の横幅を必要とするケータイサイトは、横画面にも対応しなければならない場合は改修が必要かもしれないのですが、困ったことに、サーバサイドのプログラムだけで、アクセスしてきたケータイが横画面であるか縦画面であるかを区別し、その画面サイズを特定するのは容易ではありません。

サーバプログラムが画面の縦横を判定する手がかりとなる、つまり端末から送られてくる情報の中で、画面の縦横で変化するのは、唯一User-Agentに含まれる、表示可能な文字数の値です。従って、この値に、それぞれの画面サイズを紐付けて管理しておけばよいわけですが、悪いことに、この値はユーザが端末で設定するフォントサイズによっても変化します。

縦/横User-Agent文字サイズ設定
縦画面DoCoMo/2.0 P07A3(c500;TB;W16H10)特大
DoCoMo/2.0 P07A3(c500;TB;W20H12)拡大
DoCoMo/2.0 P07A3(c500;TB;W24H15)標準
DoCoMo/2.0 P07A3(c500;TB;W30H18)縮小
横画面DoCoMo/2.0 P07A3(c500;TB;W28H05)特大
DoCoMo/2.0 P07A3(c500;TB;W35H06)拡大
DoCoMo/2.0 P07A3(c500;TB;W42H08)標準
DoCoMo/2.0 P07A3(c500;TB;W53H09)縮小

これらの値をどうにか管理することで縦画面か横画面かの判定が可能かと思われますが、やはり従来に比べれば煩雑な管理を強いられてしまうでしょう。


i-CSS2

これまでのiモードのCSS(i-CSS)で指定できるのは、基本的にはHTMLの要素/属性で表現可能なものに限られていました。また、その記述は一部の例外を除いて要素のstyle属性で行わなければならず、CSSを有効にするにはContent-Type: application/xhtml+xmlの出力が必須であるなど、他の携帯キャリアとも互換性に乏しいものでした。

これに対してiモードブラウザ 2.0のCSS(i-CSS2)は、以下の改善がなされています。

  • STYLE要素に普通に記述でき、LINK要素による外部ファイルの読み込みもおk
  • Content-Typeに依存しない(text/htmlでもおk)

対応する記述も大幅に増え、より標準に近い指定が可能になりました。ただし制限事項も多くあり、標準的なCSSがそのまま再現できるというわけではありません。

  • @importなどは無視される
  • 対応するセレクタは、以下の基本的な書式のみ
    • *
    • E
    • E F
    • E#myId
    • E.myClass

またもちろん、フォント関連の各種指定やoverflow:autoなどのように、ブラウザの実装などの制約に制限されるものは利用できません。

以下はiモードシミュレータでAcid2テストを実行した画面ですが、残念ながらテストのクリアにはほど遠い状態です(それでももちろん、これまでのi-CSSよりは格段の進歩ではありますが)。

font-sizeについて

これまでのiモードのCSS(i-CSS)ではfont-sizeはlarge/medium/small系の指定しかできませんでした。また、表示上有効なサイズは、原則として大中小の3段階で、本来の7段階の指定は反映されませんでした。

iモードブラウザ 2.0のCSS(i-CSS2)でも、large/medium/small系の指定は従来と同じです。これは、おそらく下位互換性を考慮しての決定だと思われます。

また、large/medium/small系の指定は、VGAとQVGAで画面上の「見た目」が同じになるようになっています。

一方i-CSS2では、%やem、px、ptなどによる指定も可能になっていますが、pxやptなどでの指定は、VGAとQVGAでは画面上の「見た目」が異なる点に注意する必要があります。

端末でのフォントサイズ設定が標準の場合、QVGAでは、medium/100%/1emは20px/15ptで描画されます。一方VGAのmedium/100%/1emは40px/30ptと、QVGAの倍のサイズで描画されます。

つまり、large/medium/small系や、%、emなどでの指定では、VGAとQVGAで1行あたりに表示可能な文字数は同じで、つまり見た目も同じになりますが、px/ptなどでの指定では、VGAとQVGAで同じ値を指定した場合、1行あたりに表示可能な文字数は、VGAではQVGAの倍(見た目は半分)となるわけです。


JavaScript

iモードブラウザ 2.0では、ECMA-262準拠のJavaScriptが利用できることになっています。残念ながら、初期のiモードブラウザ 2.0搭載端末の一時的な発売中止以来、現時点までJavaScript機能は無効にされたままですが、今後のソフトウェアアップデートにより、いずれ利用できるようになるでしょう。

iモードブラウザ 2.0のJavaScriptは、DOMやXMLHttpRequestを含む本格的な実装となっています。CSSが標準準拠を謳いながら、あいにく標準からははまだまだかけ離れたものであるのとは対照的に、JavaScriptについては、CSSと異なり下位互換性に配慮する必要がなかったからでしょうか、CSSなど他の実装の制約に依存するものを除いては、基本的にかなり標準に忠実な実装となっており、PC向けのウェブブラウザ向けに書かれたJavaScriptが、そのままで、あるいはわずかな修正で動作する可能性があります。

以下は試しに、clippJSONP形式フィードをパースして表示するJavaScriptのサンプルプログラムを、iモードシミュレータで動作させてみた図です。

これはその作りがそもそも非常に簡単なものであるためというのもありますが、CSSとそれに関連する箇所のわずかな修正だけですんなりと動作させることができました。

さらに、iPhone向けサイトのJavaScriptフレームワークの定番であるiUIを修正して、iモードシミュレータで動作させてみました。

CSSについては結構手を加える必要がありましたが(そしてまだまだiUI本来のものの再現にはほど遠い出来映えですが)、JavaScriptについては一切手を加えることなく、iUIのサンプルをシミュレータで動作させることができました。iUIのJavaScriptは結構複雑ですが、それが概ねきちんと動作するというのは、iモードブラウザ 2.0のJavaScript機能には大きな期待を抱かずにはいられません。


マルチメディア関連

PNGとBMPに対応

PNGが表示できるようになりました。これでようやく三大キャリアの端末がGIF、JPEG、PNGのいずれにも対応するということになります。

Flash Video対応

FLVファイルが再生できるようになりました。再生方式はインラインとプログレッシブダウンロードが利用できます。インライン再生の場合は、データ容量は、1画面あたり読み込めるデータの最大量(500Kbytes)で制限されます。一方プログレッシブダウンロードでは、iモーションと同様10Mbytesまでの動画を配信できます。

Windows Media対応

初期のFOMAには、ASFコンテナを採用したASF対応iモーション(コーデックはMPEG4/AMR)というものがありましたが、決してそれが復活したわけではなく、一般的なWindows Mediaが再生できるようになりました。

対応コーデックはWindows Media Video/Audio 9で、基本的に320×240px/500Kbps/30fpsといった仕様の動画が再生可能です。配信方式はストリーミングが基本ですので、配信にはWindows Mediaサーバが必要になります(機種によってはダウンロード再生も可能ということです)。ストリーミング配信では、サーバにアクセスするのはiモードブラウザではなくWindows Mediaプレイヤーになり、そのUser-Agentは、NSPlayer/9.0 ({機種名}_iB;FOMA)のように、Windows Mediaプレイヤーの標準的なものに準じたものになります。

ページ内への埋め込みは、なぜかEMBED要素を使用することになっています(指定できる属性はSRCとTYPEのみです)。

<embed
 type="video/x-ms-asx"
 src="hoge.asx"/>

スクリーンキャプチャ、テキストのコピー&ペースト、およびこれらの禁止設定

スクリーンキャプチャは、画面メモの保存時に、従来のものに加えて表示画面を静止画像として保存できる機能です。スクリーンキャプチャは、通常の画像とは異なり、「データ」フォルダではなく、画面メモのひとつとして保存され、再配布やコピーはできません。

テキストのコピーは、従来のフォーム要素だけではなく、ページ内のすべてのテキストがコピーできるようになりました。テキストのコピーは、iモードブラウザ 2.0で標準仕様になった疑似ポインタを利用することで、広い範囲をスムーズに選択できるようになっています。

また、新たに導入されたMETA要素によって、これらと、画像の保存および画面メモを禁止できるようになりました。なおフレームドキュメントの場合は、フレームを構成するドキュメントのいずれかひとつにでもこの指定があれば、フレームの全ドキュメントで禁止になります。

<meta
 name="prohibition"
 content="{image|text|image,text}"/>

content属性値で禁止対象を指定します。

  • image: スクリーンキャプチャ, 画面メモ, 画像保存を禁止
  • text: テキストコピーを禁止
  • image,text: 全部禁止

フレーム対応

iモードブラウザ 2.0はFRAMEおよびIFRAMEに対応しています。ただしPC向けのウェブブラウザと異なり、スクロールバーは表示されません(スクロールはできます)。またフレームの内外への移動は、iモードブラウザ 2.0で標準仕様になった疑似ポインタを利用するのが基本のようです。


マルチウィンドウ対応

iモードブラウザ 2.0では、最大5ヶのブラウザ画面を保持できるようになっており、“target="_blank"”などを付与したリンクなどは、新しいブラウザ画面で表示されます。

もっとも、ドコモは「ウィンドウ」という表現をしていますが、ウィンドウシステムというわけではなく、画面を切り替えるというイメージです。


マイニュース、マイリンク

マイニュース

iメニューのトップページに、登録したフィードの更新情報を簡易に表示できる機能です。フィードを登録させるには、以下のようなリンクを用意します。

<a href="http://docomo.ne.jp/cp/siteadd.cgi?
   sflg=1&amp;
   surl={フィードURL}&amp;
   nl={戻り先URL}">マイニュース登録</a>

マイリンク

iメニューのトップページに、登録したURLのリンクが表示される、簡易なオンラインブックマーク機能です。URLを登録させるには、以下のようなリンクを用意します。

<a href="http://docomo.ne.jp/cp/siteadd.cgi?
   sflg=2&amp;
   surl={ブックマークするURL}&amp;
   snm={ブックマーク名}&amp;
   nl={戻り先URL}">マイリンク登録</a>

マイニュース、マイリンクはまだユーザに馴染みの薄い機能ですので、以下のような、説明ページへのリンクを添えるとよいかもしれません。

<a href="http://docomo.ne.jp/imt/my/week/03bunsan_mynews_it">マイニュースとマイリンクとは</a>

その他

User-Agent

User-Agentの書式は従来と同じです。これだけ大きな変更にも関わらず、冒頭の“DoCoMo”に続くバージョン番号も“2.0”のままで変わりありません。これも下位互換性に配慮したものなのでしょうか。サーバサイドでブラウザのバージョンを判定する必要がある場合は、User-Agent文字列中のキャッシュサイズを示す箇所の値が"500"(以上)であるかどうかで行います。

左右キーの割り当て変更

iモードブラウザ 2.0搭載端末では、ユーザインタフェースには大きな変更があります。従来十字キーの左右は、「戻る/進む」機能でしたが、戻る/進む機能は左右のソフトキーに割り当てとなり、十字キーの左右は左右のフォーカス移動に変更になりました。これはつまり、ソフトバンクのキー割当と同じです。従来の端末から機種変更したユーザは、これには戸惑うことでしょう。

Shift_JISテキスト形式の絵文字ついに廃止

ドコモでは絵文字の記述方式がいくつかありますが、そのうちのひとつ、Shift_JISテキスト形式(&#nnnn;形式)がついに廃止になりました。この書式は従来でも推奨されていませんでしたので、使用しているサイトは多くはないと思われますが、使用している場合は他の書式にあらためる必要があります。

DOCTYPE宣言

iモードブラウザ 2.0でのi-XHTMLのDOCTYPE宣言は以下のものということになっています。これは従来のものと、“Ver.=ja/2.3”の箇所のバージョン番号が変わった以外は同じで、DTDのURIすら変わっていません。また、従来通りDOCTYPE宣言はレンダリングには影響しないようです。

<!DOCTYPE html PUBLIC
 "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/2.3) 1.0//EN"
 "i-xhtml_4ja_10.dtd">

要素・属性

iモードブラウザ 2.0ではさまざまな要素・属性が追加されています。詳細はドコモ公式のiモードブラウザ 2.0を参照ください。個人的に上記以外で気になった点は以下でした。

  • META要素のhttp-equiv="refresh"がサポートされました。
  • HTML要素でxmlns属性が指定できるようになりました(もっともレンダリングには影響しないようですが)。
  • 原則すべての要素で、id属性とclass属性が指定できるようになりました。
  • A要素に“ib”という属性が追加されました。この属性が付与されたリンクは、フルブラウザで開かれます。

iモードブラウザ 2.0は、画面サイズとキャッシュ容量の拡大、JavaScriptのサポート、CSSの改善などで、PC向けのブラウザに近い表現力を身につけたものになりました。しかしPC向けのブラウザと比べて遜色のないものとなったかというと、そういうわけでは決してありません。おそらく他社との差別化を図る一方で、自社のスマートフォンやフルブラウザとの差別化、および従来との下位互換性の配慮などによる、ある意味妥協の産物のようにも思えます。

個人的にはiモードブラウザ 2.0の最大の魅力はJavaScriptだと思うのですが、残念ながらこれは、最初に発売された端末の一時的な発売中止以来、現時点まで無効にされたままです。この発売中止の際のドコモの対応は、自分の知る限り過去に例をみないもので、緊急のアップデートを繰り返し、そのたびにUser-Agentを変更し、さらには期日までにアップデートを行わなかった端末はパケット通信を不能にするという、極めて切迫したものでした。そして今でもJavaScript機能は無効にされたままです。果たしてこうした対応を行わざるを得ないほどの不具合とはいったいなんだったのでしょう。なんにせよ、この機能は早々に復活して欲しいものです。

以上、先日iPhoneにMNPしてドコモとおさらばした五十川がお送りしました。

2010-02-11追記

2010年2月発売のP-03Bのブラウザには「iモードブラウザ2.0LE」という呼称が与えられ、通常のiモードブラウザ2.0とは区別されています。通常のiモードブラウザ2.0との相違は、iモードブラウザ2.0LEの対象機種と省略機能についてによると、P-03Bの場合はVGA非対応ということですが、LEがイコールVGA非対応であるのか、それ以外にもなんらかの制約があるものを総称してLEと呼ぶのかは、現時点では不明です。

2009年2月16日

文字コードと携帯絵文字
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

ウノウでは特に最近、積極的にエンジニアを採用しています。
ご興味のある方は求人ページから、ぜひご応募ください!!

今年は早くも花粉が舞っているようですね。花粉症にはなりたくないなぁと毎年おびえるyukiです。

さて今回は、社内の勉強回で発表した「文字コードと携帯絵文字」のスライドを公開したいと思います。文字コードとは何か、とか、文字集合とは何か、というところから、各キャリアの対応状況や、最近Googleの提唱している「emoji4unicode」について、基礎の部分をさらっと触れている感じです。もしよろしければご覧下さい。

文字コードと携帯絵文字

参考文献

2008年10月 8日

携帯とCookieドメイン
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

こんばんわ五十川です。

しばらく前になりますが、ソーシャルスクラップブックclippのモバイル版をリリースしました。cippモバイルではドコモ以外は、セッション管理にCookie(のみ)を利用することにしたのですが、そのときCookieドメインではまりました、というお話。

PC向けclippのドメイン名は、トップページなどのユーザ共通ページは「clipp.in」、ユーザ個別のページは「{username}.clipp.in」(例えばclipp-info.clipp.in)となっています。ケータイサイトをマルチなサブドメインにする例はあまり多くないと思いますが、clippモバイルでは、ルーティング直すのめんどくさいという怠け者な理由で、PC版のドメイン名がそのまま使えればいいなと思って取り掛かりました。しかし、その目論見はあっさりと破綻することになるのでした。

  • 以下の内容は手元の数多くない端末で確認しただけのもので、各キャリアのサイトに掲載されているドキュメントにはこのあたりの話題は見当たらないようです(あったらごめんなさい)。なので間違ってたりヌけてたりする可能性はたぶんにあります。もしこのあたりの話題をご存知のかたがいらっしゃいましたら、ご教示いただければ幸いです。
  • 以下はCookieに関する話題のうちドメインについてのみです。ケータイサイトでのCookieについては、この他にもいろいろな制約がありますが、ググればいろいろ出てきますので、そのへんはそちらをご参照ください。

まずはau/EZweb

EZwebのCookieドメインには以下のようなルールがあるようです。

  • ドメイン名の評価は後方一致
  • ホスト名を省略した指定では先頭にドットが必要

後者のルールに従えば「{username}.clipp.in」に合致するCookieドメインは「.clipp.in」でなければなりませんが、「.clipp.in」は「clipp.in」には後方一致しません。

そこで、モバイル版のユーザ共通ページのドメインは「m.clipp.in」に変更しようと考えました。

続いてソフトバンクモバイル

さてしかし、これではソフトバンクモバイルでうまくいきません。「clipp.in」というドメイン名は「クリッピン(グ)」から採ったものですが、ソフトバンクモバイルのCookieドメインには以下のようなルールがあるようで、「clipp.in」のトップレベルドメイン「.IN」がこの制約を受けます。

  • gTLD、及び他のいくつかのトップレベルドメイン(.JPのみ?)では2ヶ以上、その他は3ヶ以上のドットが必要

これはNetscapeのCookie仕様でお馴染みのハナシで、実際のところ属性ドメインを含む(かもしれない)ccTLDなどの扱いはウェブブラウザの実装によって差異がありますが、ソフトバンクモバイルでは、「.IN」は3ヶ以上のドットが必要なドメインとなるようです。つまりドメインに「.clipp.in」を指定したCookieは無効で、有効なCookieであるためにはドメインを「.{なんとか}.clipp.in」という形式にしなければならないようなのです。

しかし、Cookieドメインを例えば「.m.clipp.in」に変更すると、当然「{username}.clipp.in」には合致しません。そこで、ユーザ個別ページのドメイン名も「{username}.m.clipp.in」に変更しようと考えました。

再びau/EZweb

しかし、Cookieドメインを「.m.clipp.in」とすると、ユーザ共通ページのドメイン名「m.clipp.in」が、前述のEZwebの後方一致ルールでNGなので、EZwebではCookieドメインを「.clipp.in」、ソフトバンクでは「.m.clipp.in」と分ければいいかと考えました。

さてしかし、これでもやっぱりうまくいきません。EZwebは「{username}.m.clipp.in」に対して、ドメインに「.clipp.in」を指定したCookieを返してくれません。これはどうやら:

  • ホスト名を省略した指定では、ホスト名部分にドットが含まれてはいけない

というルールのようです。RFC 2109の4.3.2にあるA Set-Cookie from request-host y.x.foo.com for Domain=.foo.com would be rejected, because H is y.x and contains a dotですね。ちなみにソフトバンクモバイルは、このパターンはOKのようです。

ということで結局

以上のような試行錯誤を繰り返した挙句にclippモバイルはリリースされました。結局どうしたか、ご興味のあるかたは実際にclippモバイルにアクセスしてお確かめください(笑)。

本日のまとめ

  • ケータイサイトでマルチサブドメインは止めとくが吉
  • もしやらなければならないのならgTLDまたは.JPなドメイン名で

ではでは。

2008年7月 3日

Ext JSをUIに使って携帯サイトのシミュレータを作ってみた
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

五十川です。

携帯サイトの見栄えをシミュレートするウェブアプリ作りました。と言っても、実際に作ったのはかれこれ半年以上前で、手直ししてから公開しようと思ってたら、結局「guid=ON」を付け足したくらいであとは放置だったので、さすがにいい加減晒そうと。

任意のヘッダでリクエストして、レスポンスの絵文字とか変換してサイトの見栄えを確認するというものですが、これはそもそもExt JSをいじってた頃に、Ext JSでこういうの作ればいい感じになるんじゃね?ということで、丁度2.0がリリースされた頃にデモ用に作ったものなのでした(なので、かれこれ半年以上前)

実機テストの代用になるわけでは、もちろんありませんが、絵文字も含めたマルチキャリアでの見栄えを手軽に確認したいときなどに、わりと便利に使えてたりします。

スクリーンショット

機種ごとのプリセットのヘッダグループをYAMLファイルに書いておいて、以下のようにプルダウンメニューから選択して切り替えます。この画面で直接ヘッダの値を書き換えたり、任意のヘッダを追加したりもできます。

リクエストヘッダ/機種の選択・編集

レスポンスのヘッダとボディ(HTMLソース)を確認できますが、HTMLソースは以下のようにタグなどを色分けして、行番号を付けて表示します。

レスポンスボディ/HTMLの確認

アクセス履歴を保存してドメイン別に表示します。ページタイトル、URL、アクセス日時で並べ替えができ、それぞれダブルクリックで、そのページに再度アクセスできます。

ドメイン別アクセス履歴の表示

その他の機能

  • QRコード表示します。
  • Basic認証をエミュレートします(開発環境には必須かな)
  • iモードの「UTN」と「guid=ON」をエミュレートします。リクエストヘッダのUser-Agentに個体識別情報が含まれる場合は、UTN属性のある要素からのリクエストでは個体識別情報を含むUser-Agentを、それ以外は個体識別情報を除去したUser-Agentを送信します。同様に、リクエストURLのクエリーストリングに「guid=ON」が含まれる場合、X-Dcmguidヘッダが設定されてれば送信します。
  • iモード以外ではCookieの送受信をエミュレートします。

サーバサイドのプログラムは諸般の事情でPHP4スクリプトです(PHP5でも動作確認してます)。PHP4でのHTMLスクレイピングには限度があるので、そのあたりの処理は限定的になってます。

試してみようと思ったかたは

以下アーカイブをどうぞ。

mobile-simulator-1.0.tar.gz

Google Codeに移動しました(2008-07-10)

しかしこいつは、各機能を実現するのにさまざまなオープンソースソフトウェアを利用させていただく他力本願なつくりなので、アーカイブの中身だけでは動きません。以下利用させていただいているソフトウェアの一覧です。それぞれ必要な段取りは、アーカイブのREADMEをご覧ください。

Ext JS 2.x

2.0と2.1で確認してます。それ以前のバージョンでは動きません。

MobilePictogramConverter 絵文字変換ライブラリ

絵文字の変換表示にはこちらを利用させていただいてます。

QRcode Perl CGI & PHP scripts ver. 0.50

QRコードの表示にはこちらを利用させていただいてます。

PEAR HTTP_Client

仮想HTTPクライアントのコアはこちら。

PEAR Text_Highlighter

レスポンスボディの強調表示に。

spyc 0.3

YAMLのパースはこちら。

Jsphon - JSON in PHP

JSONのエンコード/デコードはこちら。

SILK ICONS

アイコン画像に利用させていただいています。

2007年11月29日

User Agent Profileについて
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

harukiです。

端末に関する詳細な情報が少ないため苦労することが多いケータイサイト開発ですが、 その手がかりとなる情報にUser Agent Profile(UAProf)があります。

国内で対応しているのはSoftBankの3G端末です。

SoftBankの3G端末はリクエストにX-Wap-Profileヘッダがある端末があります。

(例)SoftBank 911SHの場合

X-Wap-Profile:http://www.sharp-mobile.com/UAProf/911SH_SHJ001_3g.xml

http://www.sharp-mobile.com/UAProf/911SH_SHJ001_3g.xml

 

UAProfについては、以下がとてもわかりやすいです。
Forum Nokia - User Agent Profile の基本 - ツール & SDK - テクニカルインフォメーション
http://www.nokia.co.jp/forum/developer/tech_doc/browsing/user_agent_profile/

 

国内のケータイでは標準の以下の6つに加え

  • HardwarePlatform
  • SoftwarePlatform
  • BrowserUA
  • NetworkCharacteristics
  • WapCharacteristics
  • PushCharacteristics

別途、以下の2つも含まれています。

  • MmsCharacteristics (MMSに関するプロパティ)
  • Streaming (ストリーミング関連)

細かい情報などは以下にあります。

 

しかし残念なことに、技術資料のHTTP編によると、

2007年以降発売の3GC端末では、本ヘッダを送出しない端末がある。
と書かれていて、実際にSoftBank 913SHなどでは送出されてきません。

UAProfも間違いがあったりして、100%信用できる情報ではありませんが、情報が少ないケータイサイト作成者には有益な情報ですので、 メーカーの方々は是非とも情報を提供していただきたいです。

海外ケータイのUAProf

海外でのDDR(Device Description Repository)は以下のようなところもあります。(日本のケータイの情報は足りないです)

上記のWURFLのAPIを使ったものとしてWALLがあります。 WALLは共通のマークアップを書くことにより端末に応じてタグを吐き分けてくれるライブラリです。 http://wurfl.sourceforge.net/java/index.php
WALL 4 PHP
http://wall.laacz.lv/

 

ケータイサイト開発で手詰まりになった際には、(もしかしたら)手がかりになることもあるかもしれません。

2007年11月 1日

FFmpegで変換した3GPP動画をNTTドコモiモーションのストリーミング再生に対応させる (for Linux)
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

isogawaです。

さまざまな形式の動画を携帯電話向けに変換して配信するサービスでは、変換処理をFFmpegで行っている例が多いと思われます。しかしFFmpegが出力する3GPPファイルは、NTTドコモiモーションの、ストリーミング(プログレッシブダウンロード)方式での再生はできません。QuickTime Proや携帯動画変換君で作成した動画はストリーミング再生も可能ですが、変換処理をLinux上で行っている場合には、これらを利用するわけにもいきません(できないことはないですが)。ではどうしたらいいでしょう?という小ネタ。

なにが問題なのか

+--ftyp
+--free
+--mdat
+--moov
  +--mvhd
  +--trak
  | +--tkhd
  | +--mdia
  +--trak
  | +--tkhd
  | +--mdia
  +--udta

3GPPのファイルフォーマットについては、以前の MP4/3GPP/3GPP2ファイルフォーマットの基礎知識をご覧いただくとして、FFmpegが出力する3GPPファイルのAtom/ボックス構造はこんな感じになってます(例によって入れ子は端折ってます)。

このうち、mdatボックスにはメディアデータ(動画や音声の実際のデータ)、moovボックスにはメタデータが格納されているわけですが、この構造だとメディアデータの読み込み完了後にメタデータを読み込むことになるわけで。このままでは、データを逐次読み込んで再生するプログレッシブダウンロードは無理なので、mdatとmoovの順番を入れ替えてやる必要があります。

もうひとつ。ftypボックスにはそのファイルの互換性を示す「ブランド」値が記録されてます。iモード端末は通常のダウンロード再生ではここの値を気にしないようですが、一方ストリーミング再生の場合は、ここにiモーション対応のファイルであることを示す値(mmp4)がないとダメみたいです。

てなことで、FFmpegで変換した3GPP動画をNTTドコモiモーションのストリーミング再生に対応させるには、以下のふたつの処理を行う必要があるようです。

  1. mdatをmoovの後に配置する。
  2. ftypに「mmp4」を追加する。

ではどうするか

FFmpegのGUIフロントエンドである携帯動画変換君で作成した動画がどうして携帯電話できちんと再生できるかというと、携帯動画変換君はFFmpegで(コーデックを)変換した出力を、独自開発のツールで整形しているためです。変換処理をWindows上で行っている場合は、これらのツールが利用できますが、Linuxではそういうわけにもいきません(できないことはないですが)。

ではLinuxではどうしようかということで。バイナリをゴリゴリ削ってファイルフォーマットを書き換えるプログラムを書き起こすのも一興ですが、上に挙げた処理については、オープンソースのマルチメディアフレームワークGPAC付属のコマンドラインツール、MP4Boxを使うと簡単に行えます。はい、ようやく本題です(笑)。

FFmpegの出力をMP4Boxで整形する

以下のようなコマンドで、FFmpegで「input.avi」ファイルからMPEG4/AMRな「output.3gp」ファイルを作成したとして。

ffmpeg -i input.avi -vcodec mpeg4 -b 64k -s qcif -r 15 -acodec libamr_nb -ab 12200 -ar 8000 -ac 1 -flags bitexact output.3gp

MP4Boxで「output.3gp」ファイルを読み込み「output_mod.3gp」ファイルを作成すると。

mp4box -add output.3gp -brand mmp4:1 -new output_mod.3gp
+--ftyp
+--moov
| +--mvhd
| +--trak
| | +--tkhd
| | +--mdia
| +--trak
|   +--tkhd
|   +--mdia
+--mdat
+--free

「output_mod.3gp」ファイルのAtom/ボックス構造を確認するとこんな感じで。ご覧のようにmdatがmoovの後に配置し直されています。

そしてMP4Boxの「-brand」パラメータは、ftypのメジャーブランドの値をパラメータの引数で指定した文字列に変更しています(この例では「mmp4」)。

こうして出来上がった「output_mod.3gp」ファイルは、iモード端末でストリーミング方式での再生ができるようになってると思います。

  • 手持ちの限られた機種でしか再生を確認できていませんので、再生できねーよという場合は、機種名などを添えてコメントをいただければ幸いです。
  • こんな文章をここまで読んでるようなかたには既知の筈ですが、念のため。ストリーミング方式で配信する際に記述するHTMLタグは、通常のダウンロード方式のものとは異なりますのでご注意ください。

MP4Boxの使い途あれこれ

MP4Boxは3GPPやMP4ファイルを操作するさまざまな機能が用意されており、携帯電話向けの動画を扱う際にはなにかと便利です。

ファイルを指定サイズで分割したり

例えば携帯電話向けの動画は、端末が受信可能なデータサイズの制限に応じてファイルを分割する必要が生じる場合がありますが、以下のようなコマンドで、指定のデータサイズ(以下の例では300キロバイト)以内で、動画を複数のファイルに分割してくれます。

mp4box -splits 300 large-file.3gp

ちなみにFFmpegでもファイルを分割できますが、指定のデータサイズ以内にきちんと収まらなかったり、あれこれバッドなノウハウを凝らす必要があったりするので、単純な分割であれば、MP4Boxを利用したほうがお手軽かと。

フラグメントを結合したり

あるいはFFmpegで、auの携帯電話で作成した3GPP2ファイルを変換すると、(本来の再生時間はもっと長い筈なのに)最初の15秒しか変換されない場合があったりしますが、この現象もMP4Boxを使って解消できます。

この現象は3GPP2の特徴のひとつであるムービーフラグメントに因るものですが(ムービーフラグメントについては MP4/3GPP/3GPP2ファイルフォーマットの基礎知識の、moofボックスの説明をご覧ください)。フラグメントなファイルをMP4Boxで-addとかした出力は(明示的に指定しない限り)フラグメントが結合されるので、FFmpegでもきちんと変換できるようになります。

MP4Boxについて

MP4Boxは、GNU LGPLでライセンスされるオープンソースのマルチメディアフレームワークGPACの付属ツールです。MP4Boxはコマンドラインツールですが、WindowsではYAMBなどのGUIフロントエンドも利用できます。

MP4Boxのドキュメントは以下にあります。

謝辞

この記事の元ネタ作成はharukiさんに協力いただきました。Thanksでーす。

2007年10月30日

携帯へメールを送る際の確認事項
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

harukiです。

ケータイ宛にメールを送信するサイトにおける確認事項をまとめてみました。

サーバ側

DNS

  • IPアドレスが逆引きできるようになっているか
  • SPFレコードが正しく設定されているか

SPFは、2007年11月1日からDoCoMoも対応します。

http://www.nttdocomo.co.jp/service/mail/imode_mail/sender_id/index.html

MTA

  • EHLO/HELOコマンドでのドメイン名が正しいか
  • エンベロープFrom/Toは正しいか

その他

  • Fromフィールドのドメインが正しいか
    (Aレコード、MXレコードが存在しているドメインか)
  • Return-Pathは設定しているか
  • 端末で表示できる文字コード・形式で送っているか

あとは、OP25B(Outbound Port 25 Blocking)に該当する場合は、その確認も必要になります。

メールログを確認すれば、だいたいの原因は判明します。

端末側

「メールが届かない」といった類の問い合わせに対応するためには、届かないケースを運営側が把握しておく必要があります。

  • 容量がいっぱいになっていないか
  • 拒否設定にひっかかっていないか

    メール設定を確認

    (エラーメールを返さない設定をしていないかを確認)

    拒否設定の変更をしている場合、念のため、拒否→解除と再度行ってみると効果がある場合もあります。

各キャリアのメール設定へ行くことができるページを用意してあげることも効果的です。

 

新しくサービスを始める場合、機能追加の際などに、設定・確認もれのないように気をつけましょう。

2007年9月28日

携帯サイトとクローラ
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

harukiです。

ケータイユーザも検索エンジンから来るユーザも増えています。
そのため、携帯サイトも検索エンジンのクローラへ対応する必要があります。

・Mobile Link Discoveryの記述を追加する

PC用のページのheadタグ内に

<link rel="alternate" media="handheld" href="(ケータイURL)" />
の記述を追加するだけです。

Mobile Link Discoveryに対応しているサイトでは、ケータイからのアクセス時に直接アクセスしてもらえるようになります。

Mobile Link Discovery 仕様
http://www.sixapart.jp/docs/tech/mobile_link_discovery_ja.html

 

検索エンジンでは、Googleモバイルのgoogle mobile proxy
http://www.google.co.jp/gwt/n

Yahoo!モバイルでの検索→PCサイトの結果のところにケータイサイトのURLが追加されるようです。

(他の検索エンジンでは対応してたり、してなかったりします)

また、はてなMobileGatewayも対応しています。
http://mgw.hatena.ne.jp/help

 

PC用のページに1行追加するだけですので簡単です。

…ということで、昨日、ビデオポップsugu.CCにも追加しておきました。

・ケータイ検索エンジン用クローラ対策

先ほどのMobile Link Discoveryは主にPC用の検索エンジンのクローラ等への対応になります。
対応しておいて損はないという程度だと思います。

やはり、ケータイサイトであるならば、ケータイ用の検索エンジンのクローラに対応してあげるほうが効果は高いです。

サイトでSessionや端末IDを使用する場合は、各キャリアのIPアドレス帯域による制限を行っていると思います。
しかし、それではクローラのアクセスも弾かれてしまいますので、クローラにもケータイ向けのページを表示してあげる必要があります。

対応する際には、以下の順序で対応していくのがいいと思います。

  • プログラムでキャリアのIP帯によるアクセスなのかを判断できるようにする
    .htaccessなどでうまくやる方法があれば教えて下さい
  • クローラのIPもしくはUserAgentのアクセスを許可する
    クローラの一覧はぜひ共有したいです
  • Sessionの利用・端末IDの取得はキャリアのIP帯からしか許可しない
    キャリアのIP帯以外からの場合はSessionは「使わない・破棄する」
このように対応すると、ログイン後に見れるページ以外は検索エンジンに登録してもらえるようになります。

・検索ワードの把握

Referrerを送ってくれるauとSoftBankでは検索ワードが取得することができます。
webalizerの場合は、webalizer.confにこんな感じで追加するとSearch Stringの取得ができます。

SearchEngine    google.co.jp    q=
SearchEngine    yahoo.co.jp     p=
SearchEngine    ezweb.ne.jp     query=
SearchEngine    livedoor.com    q=

まだまだ、勉強不足な分野ですので、ツッコミや追加の情報などがあれば是非、教えていただければと思います。

2007年9月 3日

携帯のエラーメールの種類
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

harukiです。

メールを送信するサイトの場合、メールアドレスのクリーニングは定期的に行うべきです。 そのためにはエラーメールを解析しなければなりません。

そこで、エラーメールの種類をまとめてみました。

SMTPエラー

存在しないメールアドレスや、正しい形式でないメールアドレスの場合は、 DoCoMo,au,SoftBankの3キャリアともSMTPエラーになります。

例として、以下の条件でメールを送信したとします。

From: sender@example.com
Return-Path: bounce@example.com
To: アドレス@docomo.ne.jp

MTAにより異なりますので、ここではPostfixを例にします。
Postfixではmultipart/reportのメールがbounce@example.comに届きます
(※ 必要な情報のみに省略しています)

From: MAILER-DAEMON@example.com (Mail Delivery System)
Subject: Undelivered Mail Returned to Sender
To: bounce@example.com
Content-Type: multipart/report; report-type=delivery-status;
	boundary="boudary/example.com"

This is a MIME-encapsulated message.

--boudary/example.com
Content-Description: Notification
Content-Type: text/plain

(メッセージ)

<アドレス@docomo.ne.jp>: host mfsmax.docomo.ne.jp[203.138.180.240] said: 550
    Unknown user アドレス@docomo.ne.jp (in reply to end of DATA command)

--boudary/example.com
Content-Description: Delivery report
Content-Type: message/delivery-status

X-Postfix-Sender: rfc822; sender@example.com

Final-Recipient: rfc822; アドレス@docomo.ne.jp
Action: failed
Status: 5.0.0
Diagnostic-Code: X-Postfix; host mfsmax.docomo.ne.jp[203.138.180.240] said: 550
	Unknown user アドレス@docomo.ne.jp (in reply to end of DATA
	command)

--boudary/example.com
Content-Description: Undelivered Message
Content-Type: message/rfc822

(ヘッダ)
From: sender@example.com
To: アドレス@docomo.ne.jp

(本文)

--boudary/example.com--

Content-Type: message/rfc822のToから、「アドレス@docomo.ne.jp」を取得できます。

特殊なエラーメール

auとSoftBankでは、上記のエラーに加えて、一旦受信されてから送り返されてくるものがあります。 種類は4つあります。
(※ ここでも必要な情報のみに省略しています)

  • 1. multipart/report
  • 2. text/plain
  • 3. multipart/mixed
  • 4. multipart/mixed(自動転送先)

1. multipart/report

Postfixの例で書いたものがサーバから送られてきます。
auとSoftBankにこのタイプがあります。

2. text/plain

拒否している場合のauのエラーメールです。
※ <アドレス@ezweb.ne.jp>の行がない場合もあります。

Content-Type: text/plain; charset=iso-2022-jp
From: Postmaster@ezweb.ne.jp
To: bounce@example.com
Subject: Mail System Error - Returned Mail

次のあて先へのメッセージはエラーのため送信できませんでした。

<アドレス@ezweb.ne.jp>

送信先メールアドレスが見つからないか、
送信先メールサーバの事由により送信できませんでした。
メールアドレスをご確認の上、再送信してください。
Each of the following recipients was rejected by a remote mail server.
---------------------------------------------------
(送信したメールのヘッダ)
From: sender@example.com
To: アドレス@ezweb.ne.jp

(本文)

SoftBankにもこのタイプがあります。

To: bounce@example.com
From: MAILER-DAEMON@softbank.ne.jp
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit
Subject: Non Delivery Notification

送信先エラーにより、配信されませんでした。
To:アドレス@softbank.ne.jp
Date:Sun, 1 Sep 2007 00:00:00 +0900

3. multipart/mixed

auでは送信したメールの内容がないパターンもあります。

To: bounce@example.com
From: Postmaster@ezweb.ne.jp
Content-Type: multipart/mixed; boundary="==boundary"
Subject: Mail System Error - Returned Mail

This message is in MIME format.Since your mail reader does not understand this format, some or all of the message may not be legible

--==boundary
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit

次のあて先へのメッセージはエラーのため送信できませんでした。

送信先メールアドレスが見つかりませんでした。
メールアドレスをご確認の上、再送信してください。

The user(s) account is disabled.

<アドレス@ezweb.ne.jp>


--==boundary--

4. multipart/mixed(自動転送先)

auでは自動転送先が2つまで設定できます。 自動転送先へメールが届かなかった場合に、以下のメールが送られてくることがあります。

To: bounce@example.com
From: Postmaster@ezweb.ne.jp
Content-Type: multipart/mixed; boundary="==boundary"
Subject: Mail System Error - Returned Mail

This message is in MIME format.Since your mail reader does not understand this format, some or all of the message may not be legible

--==boundary
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit

次のあて先へのメッセージはエラーのため送信できませんでした。

送信先メールアドレスが見つからないか、
送信先メールサーバの事由により送信できませんでした。
メールアドレスをご確認の上、再送信してください。

Each of the following recipients was rejected by a remote
mail server.

    Recipient: <転送先アドレス>
    >>> RCPT TO:<転送先アドレス>
    <<< 550 Unknown user 転送先アドレス


--==boundary--

4は特殊な状況なので、4以外のエラーメールにはできるだけ対応しておいたほうがいいと思います。

※参考
KDDI au: EZwebへメール送信する際の注意事項 > 技術仕様
http://www.au.kddi.com/notice/manner/jyushin_policy/shiyo.html

追記(09/04 18:15)

はてブのコメントでご指摘いただいたVERPについて、知りませんでしたので試してみました。

Postfix VERP Howto
http://www.postfix.org/VERP_README.html

 Postfix 2.3 and later:

    % sendmail -XV -f owner-listname ....

    % sendmail -XV+= -f owner-listname ....

Postfix 2.2 and earlier (Postfix 2.3 understands the old syntax for backwards compatibility, but will log a warning that reminds you of the new syntax):

    % sendmail -V -f owner-listname ....

    % sendmail -V+= -f owner-listname ....

ということで、PHPのmail関数の場合は、
mail($to, $subject, $message, $additional_headers, '-XV -f bounce');

として、すぐ確認できる種類を試してみました。
(確認できなかった種類 = 2.text/plainのSoftBank)

結果として、確認できた種類ではすべて

To: bounce+アドレス=docomo.ne.jp@example.com
という形式で取得することができました。

貴重な情報をありがとうございます。

2007年8月 7日

携帯サイト作成のためにも使えるPHPのライブラリ
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

harukiです。

携帯サイト作成の際に使えるPHPのライブラリを知っているだけ羅列してみます。

Net_UserAgent_Mobile

基本となるライブラリです。機種判定など、様々な用途に使用します。
細かい情報については、スクレイピングなどをしたりして自前で用意する必要があります。

PEAR::Mail

メールの送信に使用できます。
特殊な送信の際は、Mail::factory()にsmtpで使用することになりますが、キャリアの迷惑メールの設定にも気をつける必要があります。

Mail_mime_Decomail (Y-110's Wiki)

Mail_mimeと同じ使い方で、デコメール送信用にMIMEを組み立てることができるのでとても便利です。

Mail_mimeDecode

空メール・エラーメールなどを受け取って解析する際に使用します。
解析の際には、Mail_RFC822::parseAddressListも使用します。

Net_IPv4

キャリアのIP帯域の判定に使用します。

HTTP_Download

auでのFlashや動画などの分割ダウンロードの際にも使用できます。
setContentType()でvideo/3gpp2などが指定できないので、手を加える必要があります。

画像処理

使える画像の種類が違うため変換したり、リサイズなどの処理のために使用します。
ライブラリについてはこちらのエントリに詳しくまとめられています。

上記のライブラリで、ある程度、末端の処理の手間を省けるのではないでしょうか。
それ以外の処理は、普段使用しているフレームワークなどでがんばることになります。。。

便利なライブラリがあったらぜひ教えて下さい。

2007年7月11日

3G携帯のみに限定したサイトを作る場合
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

harukiです。

最近では3Gのみ対応というサイトも増えてきています。 そこで、3Gに限定した場合の端末の対応具合をまとめてみました。

以下を該当の機種として進めます。

DoCoMoFOMA(※)
auWAP2.0
SoftBank3GC型

※XHTML対応機種(FOMA 2001,2002,2101V以外)

●記述言語

HTMLが必須ではなくなり、XHTML「のみ」という選択も可能になります。

●文字コード

Shift_JISに加えてUTF-8、EUC-JPも使えるようです。

●ページサイズ

DoCoMo100KB
auテキスト9KB程度以内
SoftBank300KB

テキストと画像のサイズ合計で1.2KB, 5KB, 7.5KB, 10KBということをあまり気にしなくてもよくなります。

●画像

DoCoMoGIF / JPEG
auGIF / JPEG / PNG
SoftBankGIF / JPEG / PNG

よほどのことがない限り、GIFとJPEGで事足ります。

●メール

端末が受信可能な文字コードは以下になります。

DoCoMoShift_JIS / ISO-2022-JP
auShift_JIS / JIS / ISO-2022-JP
SoftBankUTF-8 / ISO-2022-JP

3キャリアすべてで、太字になっている文字コードでは、メールに絵文字を含めることが可能です。

また、サイズは以下になります。

DoCoMo全角5,000文字
au全角5,000文字
SoftBank300Kbyte

500Byteや384Byteという制限もありません。

デコメールやデコメ絵文字の受信にも対応しているものも多いです。

●その他

3Gの場合に、比較的対応している機能もあります。

・Flash

それぞれのキャリアでの対応するFlash Liteのバージョンは以下のとおりです。

DoCoMo1.0 / 1.1
900iシリーズのみ1.0、以降は1.1
au1.1 / 2.0
WIN端末では比較的対応しています。
SoftBank1.1 / 2.0
50%ぐらい対応しているようです。

・動画

対応機種はMPEG-4に対応しています。

DoCoMo3GPP
auAMC / 3GPP2
SoftBank3GPP

MNG,Nancyなどはありません。

と、3Gに限定することにより、かなり差異が少なく、敷居も低くなっています。 携帯用のサイトを作成したことがない方は、ここから手をつけてみてはいかがでしょうか。

2007年6月 4日

携帯におけるメールアドレスの制限について調べてみました
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

harukiです。
携帯サイトの開発は、いわば端末の制限との戦いとも言えます。
今回は、メールアドレスだけに絞って、端末での制限について調べてみました。

(会社にある端末で調べたので、すべての端末で当てはまるかどうかは保障できません)

    まず、携帯のメーラでは宛先に入れられるByte数が決まっています。
  • DoCoMo: 50Byte
  • au: 64Byte
  • SoftBank: 128Byte
  • 上記のByte数より長いメールアドレスへは端末からは絶対に送信できません。

    次に、local-partで使える文字を以下の機能が動くかどうかで調べてみました。
  • メールの送信
  • web(aタグのmailto)
  • メール(本文でのmailto機能)
文字RFC2822DoCoMoauSoftBank
送信aタグメール本文送信aタグメール本文送信aタグメール本文
!
"×××××××××
#
$
%
&×
'
(×××××××××
)×××××××××
*
+
,××××××××××
-
.
/
:××××××××
;××××××××
<×××××××××
=×
>×××××××××
?×
@×××××××××
[××××××××
\××××××××
]××××××××
^
_
`
{
|
}
~
"localpart"@example.com××××
"localpart@example.com"×××××
<localpart@example.com>××××
[localpart]@example.com×××××××
.localpart@example.com×

よほど特殊な事情がない限りは気にしなくていいことではありますが、何かの時に一から調べるのが面倒なのでまとめてみました。

2007年4月 2日

デコメールを使ってみる
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

harukiです。

1ヶ月ほど前になりますが、社内の勉強会でデコメールについて説明しました。

その際の資料をPDFファイルとしてULしておきます。

http://labs.unoh.net/deco.pdf (183KB)


これだけでは少しさみしいので、もう少し携帯を使ってみたいと思います。


最近の端末では、PDFファイルなどをドキュメントビューアで見ることができる端末があります。


携帯の液晶で、1画面1ページで見ることができる(240x320で倍率25%)ぐらいの、

小さい文字が使用されていないドキュメントは、閲覧も思っているほど、苦になりません。


閲覧する方法としては、

PDFファイルのURLをメールで送って、携帯のブラウザでアクセスするとダウンロードできたり、

PCから携帯へメールで送る際にPDFファイルを添付すると見ることができると思います。


各キャリアでの対応機種などの情報は以下にあります。


・DoCoMo

PDF対応ビューア

http://www.nttdocomo.co.jp/service/imode/content/pdf/index.html


・au

EZドキュメントビューアー

http://www.au.kddi.com/ezweb/service/document_viewer/index.html


・SoftBank

http://mb.softbank.jp/mb/product/3G/

※左下の「携帯電話 機能一覧(PDF)」 → オリジナル機能の項目


また、SoftBankのシャープ製の端末では、SVG Tiny(Scalable Vector Graphics Tiny)形式で表示が可能です。

変換するためのソフトウェアが提供されています。

シャープ - PCドキュメント変換ユーティリティ

http://k-tai.sharp.co.jp/download/tools/pcdc/


携帯でドキュメントを見たことがない方は、一度お試し下さい。

また、携帯で見るのに適した資料があれば、是非教えて下さい。

2007年3月 1日

auは絵文字を自動変換していたわけではなかった
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

こんばんは。harukです。

前回、絵文字の相互変換リストというエントリを書きましたが、

説明に正しく理解できていなかった箇所がありましたので訂正しておきます。


今回のリストを作っていた時や、前々から気にはなっていたんですが、

auのケータイではwebで表示されているDoCoMoの絵文字は
auの絵文字に自動で変換して表示していた。
というふうに理解していました。

携帯サイトを作り始めの頃に見た、↓↓のような技術資料によって記憶に刷り込まれたのかもしれません。

http://www.au.kddi.com/ezfactory/tec/spec/html_con004.html

http://www.au.kddi.com/ezfactory/tec/spec/html_con.html

http://www.au.kddi.com/ezfactory/tec/spec/i_mode.html

実際は、auの端末がformでの絵文字の入力・送信ができるようになった時には、もう違っていたようです。


まず、auがShift_JISのページのformで入力した場合の絵文字は以下の範囲です。

  • F340~F3FC
  • F440~F48D
  • F640~F6FC
  • F740~F7FC

一方、DoCoMoの絵文字の範囲は以下です。

  • F89F~F8FC
  • F940~F9FC

このDoCoMoの絵文字をauの端末で見た場合に表示されるのは、

それぞれのDoCoMoの絵文字に対応するauの絵文字です。


この文字をコピペしてフォームから送信すると・・・

そのまま(F8xx~F9xxの範囲)送られてきます。


auはサーバで変換しているのではなくて、

ただ、その範囲に絵文字を割り当てているだけのようです。

(普通に考えたらわかりそうなものですが。。。)


SoftBankの端末ではHTMLをコピーできる端末を知っていますが、

もし、auでそういう端末がある場合は、

DoCoMoの絵文字でauでの絵文字の表示も兼ねているサイトではHTMLからコピーして、

formでペーストして。。。とDoCoMoの絵文字が手軽に送られてくるのかもしれません。


厳密に行うには、

au(DoCoMoの絵文字) → au(本来のauの絵文字)

への変換をしてあげないといけません。

(そこまで面倒を見てあげる気にはなれませんが。。。)


もし同じ誤解をしている方がいましたら、気をつけてください。

2007年2月 2日

絵文字の相互変換リスト
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

こんばんは。harukです。

2週間前からビデオポップ担当になり、まず最初に、3キャリアの絵文字の変換から取り組みました。

検索して探してみたものの、いいものが見つからなかったのですが、幸いにも、3キャリアそれぞれメールでは絵文字の自動変換があるので、それを利用して作ることができます。(昔は手入力で一つ一つやってました)

Tab区切りのテキストファイル(TSV)を置いておきましたので使いたい方は使ってください。

絵文字の番号の付け方はそれぞれ以下のようになっています。

  • DoCoMo(i-mode)
    基本絵文字:%i(1~176)%
    拡張絵文字:%i(1001~1076)%
  • au(EZweb)
    絵文字番号=%e(1~822)%
  • SoftBank
    PAGE1(G):%s( 1~ 90)%
    PAGE1(E):%s(101~190)%
    PAGE1(F):%s(201~290)%
    PAGE1(O):%s(301~377)%
    PAGE1(P):%s(401~476)%
    PAGE1(Q):%s(501~562)%

ファイルは各キャリアごとになっています。

  • i-mode → EZweb, SoftBank
    [ファイルの内容]
    i-mode番号, Shift_JIS(hex), EZweb, SoftBank, EZweb(webでの自動変換)

    i-mode→EZwebはメールだけではなく、webでの自動変換もあります。 近似の絵文字を表示してくれます。
    メールとwebでの変換を見比べてみると、36文字も違っていました。
  • EZweb → i-mode, SoftBank
    [ファイルの内容]
    EZweb番号, Shift_JIS(web/hex), i-mode, SoftBank

    文字になってしまうものが多いので、気に入らない人は変えたほうがいいです。
  • SoftBank → i-mode, EZweb
    [ファイルの内容]
    SoftBank番号, Webコードの一部, i-mode, EZweb

    SoftBankからの場合は〓(ゲタ)になるものが多いです。
このデータが少しでもお役に立つのであれば幸いです。

2007年1月13日

SoftBank絵文字の対処法
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちは。harukです。

今回はSoftBankの絵文字の対処法の基礎的な部分についてです。

絵文字コードは以下のようになっています。

0x1B    0x24($)   【 ? 】    【 X 】…   0x0F

【 ? 】 = G / E / F / O / P / Q

【 X 】 = 0x21~0x7E

【 X 】の部分には、[ < ]や[ ' ]や[ \ ]などが含まれているので多少やっかいです。

入力された絵文字を含む文字列を表示する際などには HTMLエンコード(実体参照化)してあげなければいけませんが、

絵文字の中もエンコードされてしまいます。

(例)

こんにちは(0x1B)(0x24)G>(0x0F)

こんにちは(0x1B)(0x24)G&gt;(0x0F)

となってしまい、4文字の別の絵文字になってしまいます。

対応するにはPHPでは以下のように行います。


function SB_htmlspecialchars($str)
{
    $emoji_range = '[G|E|F|O|P|Q][\x21-\x7E]';
    $pattern = '/[\x1B][\x24]'.$emoji_range.'+[\x0F]/';
    $matches = array();
    $match_count = preg_match_all($pattern, $str, $matches);
    if (!$match_count) {
        return _htmlspecialchars($str);
    }

    $matches[0][] = '';
    $split = preg_split($pattern, $str);

    $split = array_map('_htmlspecialchars', $split);
    $htmlstr = '';
    foreach ($split as $key => $val) {
        $htmlstr .= $val.$matches[0][$key];
    }
    return $htmlstr;
}

function _htmlspecialchars($str)
{
    $encode = mb_internal_encoding();
    return htmlspecialchars($str, ENT_QUOTES, $encode);
}

さきほどの例文で、注意点が一つあります。

古い機種で、絵文字で終わっている場合に末尾の(0x0F)がつかない端末があります。。。

そのため、受け取った文字列に最初に以下の処理を通しておきます。


/* 末尾に0x0Fがない場合に追加 */
function SBEmoji($str)
{
    $emoji_range = '[G|E|F|O|P|Q][\x21-\x7E]';
    $pattern = '/[\x1B][\x24]'.$emoji_range.'+([\x0F]?)$/';
    $matches = array();
    preg_match_all($pattern, $str, $matches);
    if (isset($matches[1][0]) && $matches[1][0] === '') {
        $str .= pack("C*", 0x0F);
    }
    return $str;
}

こんな感じでSoftBankのエスケープシーケンスでの絵文字を対応しておけば問題はないと思います。

あとは、絵文字の相互変換のために、連続している絵文字を1文字ずつに分けたり、

2バイトの絵文字の対応を行ったり、という処理があるぐらいです。

基礎の部分でしたが、お役に立てれば幸いです。



最後に今年の目標を…「Vodafoneと言わないようにする」

修正(2007/10/19 18:15)

コメントにて指摘があり修正しました。ありがとうございます。

    // 修正前
    preg_match_all($pattern, $str, $matches);
    if (count($matches) == 0) {
        return _htmlspecialchars($str);
    }
    // 修正後
    $match_count = preg_match_all($pattern, $str, $matches);
    if (!$match_count) {
        return _htmlspecialchars($str);
    }

2006年12月19日

Mac OS Xで携帯サイトの開発環境を整える
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

尾藤正人(マカー3号)です。

家でも会社でも MacBook を使うようになって、名実共にマカーの仲間入りをしました。

最近はずっと携帯サイトの開発をやっているのですが、MacよりもWindowsの方が携帯サイト開発用のツールは充実してます。 携帯サイトを開発しているMacユーザの方で、本当はWindowsは使いたくないんだけど、Windowsマシンを使ってたり、Parallels Desktop使ってる方は多いんじゃないでしょうか。

新しいParallels Desktopでは、Coherenceモードを使えばWindows上のアプリがMac上のアプリかのように使えるので、大きな問題はないのかもしれませんが、やはりMacネイティブでできるようにしたいものです。

というわけでMacで携帯サイトの開発環境を整えてみたので、何をやったのかを具体的に書いてみたいと思います。

Macで絵文字を表示できるようにする

ピクチャ 1
ピクチャ 1 posted from フォト蔵

下記の記事を参考にしました。やってることは全く同じです。

imode用携帯サイトを開発する場合のメモ

  • i絵文字をダウンロードする。
  • Windowsの実行形式になってますが、LHAで解凍します。
  • mv iemoji.tte $HOME/Library/Fonts/iemoji.ttf
  • 各アプリで使用するフォントをi絵文字(i-emozi)を選択します。

これで Cocoa アプリで絵文字が表示できるようになります。 手元ではMac標準のテキストエディタでは問題なく絵文字を表示できましたが、Safariでは絵文字が化けて表示されます。 ブラウザでの表示の確認には未だにWindowsを使っているので、この辺の詳しい情報お持ちの方いたら、よろしくお願いします。

Macで絵文字を入力する

ピクチャ 2
ピクチャ 2 posted from フォト蔵

絵文字の表示ができるようになったので、次は入力です。 エモジモ2というソフトウェアを使うと絵文字の入力ができます。 普通にインストールして起動するとアプリが起動するので、後は入力した絵文字をテキストエディタまでドラッグアンドドロップするだけ。

まとめ

Macでも頑張れば、絵文字の表示、入力ができるようになります。 残念なのはブラウザでの表示ができないことです。 これができれば、ほぼ完全にMacだけで開発ができるのですが...


About 携帯

ブログ「ウノウラボ by Zynga Japan」のカテゴリ「携帯」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

前のカテゴリは勉強会です。

次のカテゴリは書評です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Zynga Japan