初心者でもわかる『マチコ』解体新書~「読みたいとこだけ読め!」
投稿者: | カテゴリ PHP, モバイル | 2009 年 5 月 16 日
こんばんわ、私が最近アメブロで活躍している棟居です。
先日の「第1回 キテレツ巡業 キテレツ春場所」で発表したモバイルサービス『マチコ』の全貌です。
今回の開発にあたって、モバイルの現状、技術的な部分、その他知りたい情報など共有できれば良いし、アウトプットしたいので見たいところだけ見てください。
結局『マチコ』の全体構成って?

GPSやら位置情報がどうのこうの言ってるけど何?
携帯電話で位置情報を取得する方法は2つあります。
・基地局を使った位置情報
・GPSを使った位置情報
の2つです。今回は主に、後者のGPSを使った位置情報の取得の仕方を利用しています。
それでは両者のちがいを簡単に説明します。
[基地局を使った位置情報]

基地局の位置情報を利用した場合は各キャリア(docomo,au,softbankなど)のアンテナとなる基地局を利用することになります。
メリットはGPS対応機種でなくても利用できるところです。しかし、自分が今いる位置を正確に表してくれるとは限りません。
だいぶズレます。数kmずれるのなんかざらにあります。そういう面で、かなりアバウトなところがデメリットですね。
[GPSを使った位置情報]

GPSを利用した場合、衛星使っているのでかなり正確な位置情報を取得することができます。みなさんご存知のカーナビとかに使われているシステムですね!
ただ、位置を取得す場所によって測位レベルが低いとやはりズレちゃいます。それでも、基地局のアンテナを利用するよりも遥かに正確に位置を取得することができるのがメリットです。
デメリットは、まだGPSに対応している携帯の機種をもっている人が少ないというところです。
ただ、総務省が今年度4月から携帯電話にはGPS搭載を義務づけることが決まっています。今後必ずGPS対応のサービスが普及してくるでしょう。
ちなみにGPSがどれくらい精度が高いかというと、この写真(Google Earth)を見て頂ければわかると思います。

これは、先日の5月10日の発表会の後にデジハリ大阪校の前の道路で、実験で位置情報を取得した位置です。
右の黄色のピンの位置が実際に取得された位置です。
多少ずれてはいますが、ほぼあっています。おそらく誤差は数メートルといったところでしょう!やはり衛星のシステムを使うと精度が高いんですね~
実際の位置情報を取得するのって難しい?
実際に位置情報を取得する方法はメチャ簡単です。
『DoCoMOの場合』
<a href="http://www.example.com/index.php?" lcs>GPSで位置情報を取得</a>
『auの場合』
<a href="device:gpsone?url=http://www.example.com/index.php?ver=1&ver=1&datum=0&unit=0">GPSで位置情報を取得</a>
『softbankの場合』
<a href="location:auto?url=http://www.example.com/index.php?">GPSで位置情報を取得</a>
softbankの場合「location:auto」で簡易位置情報(基地局で取得する方)「location:cell」とGPSで取得する「location:gps」の優先度の高い方に自動的に選択されるので、GPSに非対応の機種でも簡易位置で取得できます。
設置するソースは簡単です。
ただ、設置しても今度レスポンスされたときの返される戻り値がまたキャリアによって変わってくるのです。3キャリアとも単純に「緯度」と「経度」が10進数で返ってこりゃ一番楽なのですが、そういうわけにはいかないです。
また、キャリアごとに設置するa要素のhref属性が違うので、振り分ける必要が出てきます。
よって、結果的に結構めんどくさいです。
このサービスの核になるPEARのNet_UserAgent_Mobile_GPS
ここはPHPの話になります。
各キャリアごとにアクセスしてきたユーザーエージェントを判別して、GETで取得するための(「3.実際の位置情報を取得するのって難しい?」)の記述を3つ書いて、更にまた、各キャリアごとのレスポンスのパラメータを分解させて・・・
みたいなことを1からやろうとすると、それだけで1ヶ月かかっちゃいます。
そこでPEARというところから提供されているPHPで有名なライブラリを使います。
使うライブラリ名はNet_UserAgent_Mobile_GPSです。
例えば、GPSで位置情報を取得するためのa要素(リンク)を設置するのと、それをクリックした後のレスポンスで緯度・経度を取得するソースは以下のような感じです。
[リンクの設置](PEARでNet_UserAgent_Mobile_GPSをインストールしていることを前提としています)
<?php
require 'Net/UserAgent/Mobile/GPS.php';
try {
$g = Net_UserAgent_Mobile_GPS::factory();
} catch (Net_UserAgent_Mobile_GPS_Exception $e) {
var_dump($e->getMessage());
exit();
}
$url = "http://machiko.kiteretsu-so.com/form.php";
$str = "GPS対応機種かどうかチェック";
$glink = $g->getGPSLink($url, $str);
?>
[返り値の緯度と経度を取得]
<?php
require 'Net/UserAgent/Mobile/GPS.php';
try {
$g = Net_UserAgent_Mobile_GPS::factory();
} catch (Net_UserAgent_Mobile_GPS_Exception $e) {
var_dump($e->getMessage());
exit();
}
$res = $g->getGPSResponse();
//array(2) { ["lat"]=> string(13) "+35.40.58.968" ["lon"]=> string(14) "+139.41.12.966" }
?>
めちゃくちゃ簡単です。
60進数で緯度と経度が配列で返ってくるので、超扱いやすいです。
これだけで、3キャリア統一したかたちで動かすことができるのだから、やはり先人に感謝せんといけませんね(^^)
僕の個人のブログにも詳細あります。
電話がかかってきたり、他の人からメールがきたらどうするの?
ユーザーを特定させる方法、つまりセッション管理の話です。
『マチコ』の使用中に電話がかかってきたり、他の人からメールがきたらどうするの?という問題です。
結論からいうと受信メールにユーザーを特定するアクセスURLを残しておくことでいったんサイトを離れたとしても、特定できるようにしました。
基本idは使い捨てにしていますので、再びちがう人と距離を感じたい場合はまた新たなIDが発行され、アクセス用URLが受信メールに残る仕組みです。
ここからはその、ユーザーを特定させるセッション管理の話です。
PCでログインを維持するために、あらかじめログイン名やパスワードを入力させるという方法をとります。かしこさんの得意なヤツですね!!
モバイルはPCとはちがって、文字の入力やボタン操作がしにくいのが特徴です。
いちいちモバイルサイトに訪問したときに、ログイン名やパスワードを入力させようとすると「うわ、めんどくせー」と思っちゃいユーザーは離れていきます。
モバイルのセッション管理の有効な方法は大きく3つあります。
・クッキーを利用
・URLにセッションIDを付与していく方法
・かんたんログイン(個体識別情報)を利用する
[クッキーを利用する]

上の表のように各キャリアがそれぞれcookieに対応しているわけではありません。
なので、cookieを利用したセッション管理は現状では3キャリア統一させた管理は難しいと思います。
[URLにセッションIDを付与していく方法]
URLにセッションIDを付与していく方法は、セッション ID という、各ユーザー固有の ID を保存し、各ページ間で共有することによって、同一のユーザからのアクセスかどうかを判断することによって実現されています。
URLに付与されるセッションIDの例
http://www.example.com/index.php?PHPSESSID=957e1ace99b2e12f36f295529e57d8aa
このように、[PHPSESSID=セッションID」というフォーマットでURLに付与されるようになります。
PHPSESSIDというのはデフォルトのセッション ID名になりますので変更することができます。
例えばユーザー管理の情報が
・名前:棟居
・住所:大阪
・年齢:25
の場合
[1ページ目]
<?php
ini_set('session.use_trans_sid', '1');
session_start();
?>
<html>
<body>
<p>session.phpのページ</p>
<?php
$_SESSION["name"] = "棟居";
$_SESSION["pref"] = "大阪";
$_SESSION["age"] = 25;
?>
<a href="session2.php">確認画面へ</a>
</body>
</html>
[2ページ目]
<?php
ini_set('session.use_trans_sid', '1');
session_start();
?>
<html>
<body>
<p>session2.phpのページ</p>
<?php
print htmlspecialchars($_SESSION["name"]) . "<BR>";
print htmlspecialchars($_SESSION["age"]) . "<BR>";
print htmlspecialchars($_SESSION["pref"]) . "<BR>";
?>
<a href="session3.php">session3.phpへ</a>
</body>
</html>
これは1ページ目にセットされたユーザー情報を2ページ目に持っていってブラウザに出力させるといことができます。
このようにしていくと、ページの遷移の際にURLにセッションIDが付与されながらユーザーの情報をいくらでも他のページに持ち回すことができます。
1行目の
ini_set('session.use_trans_sid', '1');
はphp.iniの設定を変えていることになります。
「’session.use_trans_sid’」はURLに自動的にセッションIDを埋め込むかどうかの設定になります。する場合「1」しない場合「0」です。
この設定はphp.iniに書くのが一般的ですが、全体が変更されてしまうため、セッションIDを利用するファイル数が少ないときなどはこのように直接phpファイルの先頭に書いやることもできます。
今回『マチコ』では一部この方法をとっています。
ただ、URLにセッションIDを付与していく方法はセキュリティ上よくありません。
URLにセッションIDが丸見えだからです。特にdocomo。
この辺はセキュリティ対策を考えながら利用する必要があります。
[かんたんログイン(個体識別情報)を利用する]

かんたんログインはセッション管理が必要なモバイルサイトで非常によく利用されています。
これは携帯電話端末の個体識別情報を利用しています。
携帯端末には一台一台「個体識別番号」という番号が割り振られていて、この番号を取得することによってユーザーがアクセスしてきた時に認証の判断を行ないます。
個体識別番号のパラメータの取得方法は各キャリアによってこれも違ってきます。
メリットはやはり、ID、パスワードを入力しなくてもクリック1回でログインでき、ユーザーにスムーズにコンテンツに入り込むんでもらうことができます。
デメリットはユーザ本人が個体識別番号を送信するかしないか選択するこができるようになっているところです。
[docomo]

僕はdocomoを使っているのですが、このようにdocomoでは1回目「FOMAカードの製造番号を送信しますか?」というダイアログのようなものがでてきます。
初めの1回だけですが、普通の人なら少し警戒してしまうこともあると思います。
[au]
auは端末を購入して最初の設定のときに、「EZ番号を送りますか?」とユーザに問いかけられていて、たいていのユーザは「はい」と答えていると思います。
[softbank]
softbankは端末を購入したままの設定で、「個体識別番号を送らない」という設定になっている機種があります。特に3G端末からなっているみたいです。
携帯の端末情報を送信しているだけなので、携帯電話番号、メールアドレス、住所、氏名が送信されているわけではないです。
その辺を安心してユーザーに利用してもらえるようにすればかなり便利な機能だと僕は思います。
取得した【緯度】【経度】【距離】【タイムスタンプ】をCSVで保存

取得した、【緯度】【経度】【距離】【タイムスタンプ】はCSV(カンマ区切り)データとして保存していきます。
先日とんかさんがAさんとBさんの距離を求める式の記事を公開してくれました。
最新のAさんとBさんの距離を求める場合、それぞれの最新の緯度と経度の値が必要になります。
そこで、CSVに保存していくことによって、CSVから相手の最新のデータをひっぱってきています。
IDがa45さんの人が「♪バイブで距離を感じる♪」ボタンを押すと、IDがb45さんのcsvデータの最新の緯度・経度を取り出して計算するという方法をとりました。
現在人気モバイルサイトの傾向

どんなモバイルサイトを作ろうかという打ち合わせをしたときに作った資料です。
僕はモバイルの知識が全くの0だったために、どういうサイトがあるのかも知らなかったです。今でも頻繁にモバイルサイトを利用しているわけではないですが・・・。
現状、モバイルのヘビーユーザーのほとんどが学生であるために、学生ぐらいをターゲットにしたコンテンツがやっぱり多いみたいですね。
傾向としては「自分をアピールできるサービス」がヒットしています。
最近は小学生や中学生でも「魔法のiらんど」や「mobilespace」などの有名な無料ホムペ開設サイトでホームページで自分のサイトを持ち「前略プロフィール」でプロフを公開し、自分をアピールしていっています。
アピールの仕方は開設した、ホムペやミニブログなどで写真をUPさせたり記事を書いたりしています。
特に、クリスマス、誕生日、夏休み、土曜日、日曜日などのモブログのUP率は非常高いらしいです。これは、学生が休みやイベント日に投稿している人がやはりたくさん多いということなんでしょうな~。
コミュニティ系はなんだかんだで結局mixiにたどりつく人が多いみたいです。
あと女子学生をターゲットにしている「@peps」はすごいです!
ユーザビリティもクソもありません!とにかくギラギラしたもん勝ち!
最近、小中高生の保護者が子供に携帯電話をどういうふうに持たせるかという社会問題がありますが、割かし「モバゲータウン」や「GREE」などはCM広告も打っているだけに保護者自身もアクセスしたことがあるみたいですが、@pepsは最強です!
「@peps」保護者は知りません!とにかく女子学生の利用数がすごいみたい!!
関連記事
- これに関係する記事はござーせん




超大作の記事ありがとうございます!
各キャリアごとのGPSの取得の仕方、セッション管理の部分など参考になりまくります。
PEARは便利そうね。
というか赤裸々にコンテンツ解説ご苦労様っす!
ところで、AUでPOSTでデータ送信すると変なバグでません?
わひゃひゃ!すごい記事だよこれは。
前回の記事で「長い記事を書いてやったぜ!」と思ってたら
それより全然長くて手がかかっておりますがな。
非常に分かりやすい解説本当にありがとう。
セッションIDやNet_UserAgent_Mobile_GPSの解説が特に助かりました。自分でも応用してみますな!
>韋駄天 太郎さん
GPS対応じゃないと、ってところでやっぱり結構敷居は高くなるみたいですね。「俺の携帯は対応してんのかな?もういいや」みたいになり兼ませんね~。
それにしても、韋駄天さんに作ってもらったマチコのキャラクターだいぶ「マチコ」に当てはまってますね~
>かしこ さん
マジっすか?バグでてます?マチコで?
今度どういうエラーになってるか教えてください。
実はauは無理矢理idのパラメータをつけてるんで・・・
>とんかさん
とんかさんの記事見て「これは大作記事だ!」と思って、今後誰も書かんくらい長い記事にしてやろうと思いまして、負けじと最長記録を作っちゃいました。暇人っすわ・・・。