2007/10/09に、SoftBankのゲートウェイIP帯域に追加があったようだ。
運営中のサイトや他のサイトの情報から、どうやら今日の午前3時ぐらいから追加されていたっぽい。

携帯サイトを作成する場合、PCから閲覧できないようにGWのIPアドレスのみ通すような閲覧制限をする場合がある。
これにより、UserAgentなどをある程度信用し、UIDやEZ番号といったヘッダの情報もIP制限範囲内では信用できるだろうということになる。

SoftBankにも一般ユーザ向けの情報の中に、IPアドレス帯域の情報がある。
SoftBank Developers Support Site IPアドレス
http://developers.softbankmobile.co.jp/dp/tech_svc/web/ip.php

しかし、今回の帯域追加はこちらには載っていない。
更新日時も古いままだ。「2006年11月17日現在(赤字は12月20日に追加されるIPアドレス帯域)」
その時点のキャプチャ>SoftBank IPアドレス一覧 2007/10/09 15時時点

公式サイト関連には、事前に連絡が来ているのに、こちらのサイトが更新されていない。
ここに追加されたIP帯域を書きたいが、情報元がコンフィデンシャルなので残念ながら書くことが出来ない。

最低限の情報更新ぐらいして欲しい。


これを書きかけで、仕事とかしてたら、SoftBank Developers Support Siteの方に追記されたようです。
追加された帯域

  • 123.108.236.0/24
  • 123.108.237.0/27
  • 202.253.96.224/27
  • 210.169.130.112/28 <帯域変更

他の大手サービスでも勝手サイトでは同様の問題があったようです。
勝手サイトは、UserAgentで制限でもしとけってことですかね?

DoCoMoで502エラーが出るという件がらみで、いろいろ調査をしていたら、こんなことがありました。

502のエラーとは。
502 Bad Gateway
ゲートウェイあるいはプロキシとして動作しているサーバが、リクエストを実行しようとしてアクセスした上位サーバから不正なレスポンスを受信した。 不正なゲートウェイ経由のアクセスなど。
http://www.asahi-net.or.jp/~AX2S-KMTN/ref/status.html

つまり、DoCoMoのゲートウェイがエラーを返している状態ですので、サービス側サーバが原因かDoCoMo側が原因か、切り分けがしづらいです。
いろいろと現象を追っていったところ、502のエラー発生時に、Apacheの error_log に以下のような記録が残っていました。

[Thu Sep 30 00:01:10 2007] [notice] child pid 13639 exit signal Segmentation fault (11)
[Thu Sep 30 00:01:15 2007] [notice] child pid 32389 exit signal Segmentation fault (11)
[Thu Sep 30 00:01:20 2007] [notice] child pid 13633 exit signal Segmentation fault (11)

Apacheの子プロセスがセグメンテーションフォルトで強制終了したというログです。

そもそもの強制終了の原因がいまだ不明ですが、phpにてセグフォルトを起こすプログラムを紹介してる記事を発見しました。
http://sonic64.com/2002-12-04.html

<?php
$base_str = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">';
$Zspace = '(?:\xA1\xA1)'; // 全角スペース
$ascii = '[\x00-\x7F]'; # 1バイト EUC-JP文字
$twoBytes = '(?:[\x8E\xA1-\xFE][\xA1-\xFE])'; # 2バイト EUC-JP文字
$threeBytes = '(?:\x8F[\xA1-\xFE][\xA1-\xFE])'; # 3バイト EUC-JP文字
$character = "(?:$ascii|$twoBytes|$threeBytes)"; # EUC-JP文字

$count = 1000;
$str = '';
for ($i = 0; $i < $count; $i++) {
  $str .= $base_str;
}

// $str が EUC-JP の場合
$str = preg_replace("/^($character*?)(?:\s|$Zspace)+$/", "$1", $str);

print htmlspecialchars($str);
?>

テストでは、$count を 149ではOKで 150でエラーになっていました。

実際にApacheがSegmentation faultで落ちた場合、の応答を FirefoxのLiveHTTPHeadersで調べてみると次のような感じです。

リクエスト
GET /Segmentation_fault.php HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cache-Control: max-age=0

レスポンス
HTTP/1.x 200 OK

本来、レスポンスのHTTPステータス・コードに続くヘッダや本文がまったく返されていません。
そのため、DoCoMoのゲートウェイでは、コンテンツの識別が出来ず、502のエラーを返していると想像できます。

phpでApacheを、子プロセスとはいえ、こんな簡単に落とせるなんて。。

先日 auのIPアドレス帯域が追加したばかりだが、
DoCoMoも追加をするようだ。

http://www.nttdocomo.co.jp/service/imode/make/content/ip/about/index.html#ip

9月下旬とのことなので
まだ先の話だがいまのうちに追加しておいた方がいいだろう。

ちなみに VodafoneのIPアドレス帯域はこちら。

http://developers.vodafone.jp/dp/tech_svc/web/ip.php

——-X8——————8X——

昨日は、飲み会の予定が入っていたのだが、
相変わらずのプロジェクトの山場でとても行けなかった。
それでも、月曜日にリリースした案件の打ち上げということで
10時ぐらいからプロジェクトメンバーで飲みにいった。

渋谷の吉成というお店。

http://r.gnavi.co.jp/a848000/

最近引っ越してきて会社の近くに来た。
お魚のおいしいお店。
あぶり鮭がおすすめ♪

モバイルサイトを作る場合、
UserAgentなどの偽装を避けるためにも
IPによる制限をかけることがよくある。

各キャリアでそれぞれ情報をHPに載せているが、
KDDIのIP帯域はこちら。

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

更新日時が「2006年6月20日現在」となっているが、
どうやら数日前から今回追加されたIPでの運用がされていたようである。
mixiモバイルでもそーいうトラブルがあったと聞いたし、
うちが持ってる案件でも問い合わせがあったりした。

確かに
「※ 本情報はEZサーバ以外のホストによる上記表のIPアドレスでのアクセスがないことを保証するものではありません。」
と書いてあるけど。

——-X8——————8X——

今日もタクシー帰りでした。
昨日個人タクシーに乗って
乗り心地いいし安いしってことで
今日も個人タクシーに乗ろうと決めて会社を出ました。

でも、いざ探すとなかなかいなかったりする。

やっとこさ見付けて捕まえて帰ってきたが、
運ちゃんがスキンヘッドの強面。。。
話すタイミグを逃して ひたすら沈黙の帰り道。。

しかも運転が乱暴で
加速減速しまくりで、前に他のタクシーが止まるとクラクション。

飲んでもいないの気持ち悪くなっちゃった。。

携帯やらPCのブラウザやらでWebサイトを見る場合、
HTTPというプロトコルでやり取りをして
その結果を人間にわかりやすいようにグラフィカルに表示をしている。

そのやり取りには当然ルールがあって、
そのルールに従って
「○○ってページをちょーだい~」
「OKこれだよ~」
みたいなやり取りを意識しなくても裏で勝手にやっている。

で、Locationとはその中の一つで
Locationレスポンスヘッダフィールドなんて言ったりするが
役割は、
「○○ってページをちょうだい~」
「ここじゃなくて、××に取りに行ってね」<これ
こんな返事のことだ。

で、phpで書くなら
header(“Location: http://xxxxxx/”);
みたいな感じ。

このURLは、RFC的には絶対URLでなければならないと定義されているが、
IEやFirefoxなどは相対URLでも動く。

通常、開発作業をする場合、
・ローカルネットワーク内の開発サーバ
・携帯で確認するためのインターネット上の開発サーバ
・本番サーバ
最低、この3つの環境がある。
本番サーバの前に、デザインチェックのためのUPサーバが入ることもある。

当然、各環境のURLが違う。
Locationさせようとするとその辺りに気をつけなければならないし
絶対URLじゃなきゃダメという仕様を知らないと、
確認環境やほとんどの携帯で動いてしまうため気づかずに使ってしまうことがある。

実際に手元にある端末でテストしてみると、
auの、Win系、A系
Vodafoneの、P系、3GC系
DoCoMoの、FOMA90x系、FOMA70x系
それぞれ相対パスであっても正常にリダイレクトしてくれる。
(「正常に」ではないのかな・・)

でも、
DoCoMoの50x系は、SO505iSとP506iCは動いたが
F505iGPSとN503iは動かずに、
「無効なデータを受信しました」
という、端末のメッセージが出る。

502系などはそろそろ対応端末から締め出されつつあるが
505,504,503系はまだまだ現役感がある。

ちなみに、SSLのページ内でリダイレクトする場合、
P506iCなどは、毎回メッセージがでるのでうざったかったりする。

Locationは、ダブルポスト防止や、
PC/携帯のページ振り分けに使うことがよくある。
最近、新人くんやバイトを開発に使うようになってきたので、
ソースチェックをしっかりしないと
うっかり相対パスで書いてあって、いらぬトラブルを起こしそうだ。

htmlのinputタグには、maxlengthという属性を指定できる。
閲覧者が入力するサイズを制限することが出来るものだ。

明らかに文字数が固定の場合、たとえば郵便番号や電話番などや
あまり長い文字を入力されると困るフィールドに指定することが出来る。

この「サイズ」というのが曲者だ。
大抵のPC用ブラウザや、au、Vodafoneでは、サイズとは文字数になる。
DoCoMoだけ違う。

作ろうiモードコンテンツ HTML INPUTタグ
http://www.nttdocomo.co.jp/service/imode/make/content/html/about/input.html

> maxlength=”最大文字数”
と、書いてある。

これを見てどう思うのだろうか?
文字数とは、一般的な感覚で文字数と書いたら
全角だろうが、半角だろうが1文字は1文字だろうと考えるだろう。
でも、違うらしい。

例えば
<input type=”text” name=”a” value=”" maxlength=”1″ />
1文字しか入力して欲しくないテキストボックスにこう書いてしまうと、
全角入力が出来なくなってしまう。

かといって、バイト数でもない。
このテキストボックスには半角カナなどを1文字入力することは出来る。

半角文字を1とした文字幅とでも言えばいいのか。そんな仕様だ。
知らないで文字数指定をしてしまうと、入力できないなんてことも発生してしまうだろう。

もっとも、あくまで入力チェックは、受け取った側のプログラムでするべきだが、
ユーザビリティ的には指定してあげた方が親切だと思う。
でも、その親切心があだになる場合もあるかもしれない。

他の人が担当で作っていたプロジェクトで、変な現象が起こった。
MOTOROLA社製の端末を使っているユーザから、テキストボックスにフォーカスが当たらないから、
入力が出来ないという問い合わせがあった。

対象機種はこの2つ。
702MO 702sMO

社内にある端末、602SH、603SH、703SH、902SH、903SHでは再現しない。
(なぜか社内にあるVodafone端末はSHARPばっかりだったりする)
海外製のNOKIAの702NKを持っている人が近くに居たので
借りてテストしたが再現しない。

なぞだ。

『Vodafone3G携帯を使っていて』
http://testkei.secret.jp/blog/jablog/archives/2005/09/vodafone3g.html
こちらのサイトで書かれているような
>1つのformタグの中に Aタグやinputタグなどの要素が 30個以上 あるページは動作保証しないとキャリアの仕様にあります。
>1ページにformタグは最大4つまでというキャリア仕様があります。
>1ページに配置できるフォーカスの当たる要素の数は50個までというキャリア仕様があります。
>1ページに配置できる要素の数は520個までというキャリア仕様があります。

こういったことや、仕様に書かれていることをチェックしたが、
それでも再現しない。。。

社内のテスト端末にそもそも無いので
ユーザが言っている現象が再現できないのが痛い。
すぐにVodafoneショップに問い合わせをしてMOの機種を買おうとしたが
販売も終わっていて在庫が無い。

結局、テスト端末を持っていてテストをしてくれる会社を探して
そこにお願いすることにした。

『ケータイコンテンツ実機テストはケータイ・ラボ』
http://www.m3c.co.jp/pc/products/keitailabo/index.html

スピードチェックなるものをお願いしたら、
再現する。
でも、原因が分からない。

こちらで可能性のある箇所を修正して、それをお願いして結果を待つということを
数回やったが埒が明かない。
結局、うちの会社の営業さんがケータイラボに行ってその場で見てもらいながら
こちらで修正をするということになった。

向こうに着くまで約40分ほど。
その間に、考えうるパターンのhtmlやphpファイルを作成し
それを見てもらうことにした。

時間は夜の10時近く。
しかも金曜日。
日曜の24時に終了するキャンペーンサイトなので、その日中になんとかしないとやばい。

テストを開始してみたところ、シンプルなページではもちろん問題がない。
でも、該当のページではダメだ。
formの数も1つだし、ページ全体でもAタグ等で20個もない。

めぼしをつけたタグをある程度消して、
それで更新してもらってその結果をTELで聞くという
なんともじれったいデバッグ作業になってしまった。

一見関係なさそうな、formより上にある文言系のタグをごっそり消したら、
テキストボックスが使えるようになる (・_・?
あとは、見当をつけて少しずつ消しながらの確認作業。

そんなこんなで原因は。。。
ページ上の移動に使うアンカータグ。
<a name=”aaa”> こんなやつ。
こいつが閉じていないのが原因だった。

aタグが閉じていないと、それ以降のテキストボックス等が、
タグの中身として判断されているようだ。
<a name=”aa”></a>
こーしてやってなんとか問題解決。。。

確かにxhtml的にはNGだし、
MOT君が対応しているマークアップ言語は
・WAPXHTMLMP1.0
・WAPWML1.3
この2つなんだけど、同じはずの他の端末ではOKなんだよなぁ…

ちなみに、モトローラの端末といえば、UserAgentが変なので有名
古いJ-PHONEのころのは
・J-PHONE/4.3/V602SH~
3GC系は
・Vodafone/1.0/V903SH~
社名変更したから、J-PHONEがVodafoneに変わるのはまだいいとして、
MOTOROLAさんとこの2台は
・MOT-V980/80.2F.2E.MIB~
・MOT-C980/80.2F.2E.MIB~

MOTって・・・
自己主張激しすぎ?

それ以外にも変なところがあったりする。
Vodafone端末の表示できる画像と言えば、JPEG・PNGだが、
MOTOROLAとNOKIAは、WBMP・GIF・JPEG だったりする。
かなり微妙だ。

この辺は、自社製のライブラリが吸収してくれるが、
仕様はそろえて欲しいものだ。

今日、同規模のキャンペーンサイトのキックオフミーティングがあったが、
ひっそりとMOTOROLA端末が対応機種から外れてた…

前に書いたVodafoneのmailtoリンクの件だが、
3Gを持っている人のを借りたりして調べてみたが、
試した3GはすべてUTF-8でエンコードしてあげないと駄目だった。

結局、3G端末のみSJISエンコードしてあるリンクを
outputフィルタでUTF-8に書き換えてあげることにした。
うちの会社で使っている独自ライブラリのフィルタクラスを拡張して
aタグのmailtoを抜き出し。
同じくライブラリ中のmobileinfoでVodafoneのシリーズを判別し、
一度urldecodeしてからmb_convert_encodingでSJIS→UTF-8に変換し
再度、urlencodeして書き戻してあげる。

懸念事項が1点。
VodafoneにはWシリーズという端末が2つだけある。
V801SH V801SA だ。

普及率も低いし、Wシリーズなるものが、P系か3GC系のどちらになるのだろうか。

あとは、ほかの機種では試していないが、
V902SHで本文が長いと変なエラー画面が表示される。
手元に端末が無いので、正確なエラー文言が今はわからないが、
通常のHTMLのページまで表示しなくなってしまう。

SJISからUTF-8にしてさらにurlencodeすると長くなる。
どうやらそれが問題のようだ。
文字数を削ってあげればちゃんと表示する。

vodafoneの公式サイトのドキュメントを見ると
http://developers.vodafone.jp/dp/tool_dl/web/tech.php
HTML編 1.3.0 2005-04-01

> 送付するメールの本文(body)をmailbody属性で与えることが出来る。
つまり、旧vodafone仕様の指定のしかた。

> また、P4(2)型およびW型では、mailAddrに続けるパラメータ指定でも可能である。
> ただし、指定可能なメール本体の最大長は1Kbytesである。
mailAddrに続けるパラメータ指定とは今話題にしている指定のしかただ。
1Kバイトとは 1024バイトだろうか。
でも、微妙にエラーになる場合のサイズが違う。
それに、subjectを指定した場合のサイズはここ含まれるのか。。
bodyのパラメータ文字列だけならば、900バイト弱でエラーになるし、
パラメータをすべて足したりすると1024バイトを超えてしまう。

もっと細かく調べないとよくわからないが、
いまいちはっきりしない。

Vodafoneの独自仕様は、どんな仕様になっていてもいいが、
せめてドキュメントをもっとしっかりしてほしい。

上記pdfに各タグや属性の対応状況が載っているが、
3GC型はほとんど「△」表示だ。

ってか△ってなによ?
未対応なら「×」対応なら「○」でしょう?
「△」ならば、何をもって△という意味不明な表記をしているのかが知りたい。

来年か再来年か、もっと先か。
新しいキャリアが今後は増えていくのだろう。
その時、Vodafoneがどーなっているのやら…

Aタグのhref属性のmailtoってのはご存知だろうか?

href=”mailto:user@example.com”というのをAタグに指定してあげる
例:user@example.comへメールを送る
みたいに使うやつだ

さらにサブジェクトや本文を指定できる
href=”mailto:user@example.com?subject=subject&body=body”
user@example.comへ subject body付き

古いVodafone端末の場合、
このmailtoではなくちょっと変わった指定のしかたをする必要があった。
まぁ、これは仕様ということで納得できる。

ちなみに
href=”mailto:user@example.com” mailbody=”body”
という指定の仕方だ。
本文が属性として別途指定する形だ。

新しい機種は、PCと同じような指定の仕方が出来るはずだ。
仕様書には「body 本文である。ISO-2022-JPをescaped encodingで表記すること。」と書いてある。
escaped encodingってのは、PHPならば urlencode関数 or rawurlencode関数を使用すればいい。

問題なのは文字コード

会社にあるテスト端末と個人携帯を借りてテストをしてみた。
全て SHARPの端末だ。

V301SH 旧指定方法ならばOK
V602SH SJISならばOK
V902SH UTF-8ならばOK

え~っと・・・・

V301SHはOK。だって旧式指定ですから。

V602SHとV902SHは、ISO-2022-JP つまり JISだとめちゃめちゃ文字化けしちゃう。
適当に文字コードを変えたら
上記のような組み合わせならばちゃんとメール作成画面で表示される。

探した限りだとこれに関する仕様が見つけられなかった。
が、文字化けするのは確実。

xml宣言やmetaタグ等、本文中に文字など
考え付く文字コード関連の回避はしてみたけど
結局ダメ。

まぁ、機種判別してもいいけどそもそもその機種の情報が無い。

Vodafoneユーザの人いますか??
出来れば以下のページのmailtoリンクを開いてみて結果を教えてください!
http://www.nextftp.com/maru/a.htm
メールで携帯に送る

ボーダフォン 技術資料

http://developers.vodafone.jp/dp/tool_dl/web/tech.php

HTML編 1.3.0、XHTML編 1.1.0 参照