僕ならばここにいる2002
法林 浩之
(株)インターネット総合研究所
hourin@suplex.gr.jp
(page 1)
今日お話しすること
- 昨年、jus関西、jus東海の研究会でも発表したが、
それからシステムを更新しているので題名に「2002」をつけた
- 単にシステムを紹介するだけでは勉強にならないので、
「どうやって実現しているのか」をできるだけ紹介したい
(page 2)
僕ならばここにいる
- 自分が地球上のどこにいるかを記録し、Webに表示するシステム
- システム名は稲垣潤一の曲から取ったが深い意味はない
- 2001年4月開発、運用開始
- 以後ネタを思いつくたびに少しずつ機能拡張し、現在に至る
(page 3)
なんでこんなシステムを作ったのか
- もともと、自分の居場所を示すことに興味があるらしい
- 自分の居場所を継続的に記録し表示したいと思った
- よくある「行き先表示板」の類では現在地しか表せないが、
今回は履歴も必要
- 手軽に使えそうな既存のツールがなかったので、自作した
- どのように記録、表示したいか
- できるだけリアルタイムに記録し表示する
- どこにいても(屋内でも屋外でも)記録できる
- 記録結果は誰でもWebで閲覧できる
(page 4)
前提条件
私が使うための条件であって、一般的な制約ではない
- UNIXで入力/表示できること
- 電力が必要なデバイスはすべて電池で駆動する
- 徒歩/自転車/公共交通機関で移動するので、
継続的な電源供給を受けることができない
- 新しいデバイスの導入は最小限に
- 日常生活に取り入れても支障が出ないこと
(page 5)
システム構成
- いくつかの部分に分けられる
- 現在地の位置情報を取得
- 位置情報をサーバに送信
- サーバに届いた位置情報をデータベースに保存
- データベースから位置情報を取り出してWebに表示し、
地図にリンク
(page 6)
最初の実装
- 以下の道具を使って作ってみた
- 位置情報は緯度経度で表現しようと思ったので、GPSを使用
- 位置情報の送信は、ノートPCをインターネット接続して、
データはWebのフォームで入力
- データベースはPostgreSQLで構築
- Webへの表示とデータベース操作にはPHPを使用
- 地図にリンクするために地図Webサイトを利用
(page 7)
最初の実装に向けて行ったこと
- PHPを用いた各種処理プログラム作成
- フォームから入力されたデータをデータベースに保存
- データベースからデータを取り出してWebに表示
(page 8)
GPS(Global Positioning System)
- 地球を周回する衛星(24個)から電波を受信して位置を特定
- 3〜4個受信できれば現在地を特定できる
- 条件が良ければ誤差10m未満
- 時刻情報も精度が高いのでNTPサーバに使われる
- 受信機
- センサーのみのものは、データをPCに送って処理/表示
- 液晶画面がついているものは単体で位置情報がわかる
- メーカーは、世界的にはGARMINなどが有名、
日本ではソニーなど
- PCにデータ転送できる
- シリアル4800bpsが多いが最近はUSB接続の機器もあり
- データフォーマットはNMEA0183が標準だがメーカー独自形式も多い
- このシステムでは機械的なデータ転送はしていない
(手で書き写している(^_^;))
(page 9)
GPSを使ってみよう
現在使っているのはGARMIN eTrex
- 液晶画面つき
- 気に入っているところ
- 測定結果が出るまでの所要時間が短い
- バッテリーの持ち時間が長い
- 英語モデルを使用
- 日本語モデルもあるが、
PCにデータ転送したときに問題があるらしい
- 上位機種もいくつか出ているので、今買うならそちらの方がいいかも
(page 10)
地図Webサイトについて
著名な地図サイトは、URLで緯度経度を指定して地図を表示できる
http://www.mapion.co.jp/c/f?el=139/43/22.200&nl=35/41/03.600&
scl=10000&pnf=1&uc=1&grp=all&size=500,500
http://www.mapfan.com/index.cgi?ZM=11&MAP=E139.43.22.2N35.41.03.6
http://www.mapoo.or.jp/cgi-bin/gis.cgi?N=35.41.03.6&E=139.43.22.2
http://mapbrowse.gsi.go.jp/cgi-bin/nph-blsearch.cgi?b=354103.6&l=1394322.2
(page 11)
「位置情報」として記録する項目の具体化
- 緯度経度: 北緯/南緯、緯度、東経/西経、経度
- 例: 北緯35度41分23.0秒、東経139度41分54.0秒
- 数字は「xx度yy分zz.z秒」まで記録
- 南緯や西経にも対応しているが行く予定はない:-)
- コメント
- 時刻
(記録しないがフォームには入力する項目)
(page 12)
データベース作り
- テーブルの属性として以下のものを用意
- UNIX時刻
- 北緯/南緯
- 緯度
- 東経/西経
- 経度
- コメント
- UNIX時刻はサーバで取得、他は入力された値を使用
(page 13)
PostgreSQLによるテーブルの作成
- 初期作業として1回実行すればよい
- PostgreSQLによる記述
foo=> create table bartbl (unixtime integer, nanboku text, ido text, touzai text, keido text, comment text);
foo=> \d
Table "bartbl"
Attribute | Type |
-----------------------------
unixtime | integer | …… UNIX時刻
nanboku | text | …… 南北(SかN)
ido | text | …… 緯度(xx.xx.xx.x、xは数字)
touzai | text | …… 東西(EかW)
keido | text | …… 経度(xxx.xx.xx.x、xは数字)
comment | text | …… コメント(場所など)
(page 14)
PostgreSQLによるデータ入力
- 位置情報を入力するたびに実行する
- PostgreSQLによる記述
foo=> insert into bartbl values ('1033722220','N','35.41.23.0','E','139.41.54.0','新宿野村ビル');
foo=> select * from bartbl;
unixtime nanboku ido touzai keido comment
------------------------------------------------------------------------------
1033722220 | N | 35.41.23.0 | E | 139.41.54.0 | 新宿野村ビル
1034330710 | N | 35.41.49.1 | E | 139.46.41.7 | たん清
1034933548 | N | 35.41.03.6 | E | 139.43.22.2 | jus事務局
- 実際にはWebのフォームに入力し送信ボタンを押すと、
PHPプログラムがSQL文を実行しデータベースに保存する
(page 15)
PostgreSQLによるデータ検索
- 検索のSQL文と結果の表示
- 最近入力したものを上に表示したいので、UNIX時刻の降順でソート
foo=> select * from bartbl order by unixtime desc;
unixtime nanboku ido touzai keido comment
------------------------------------------------------------------------------
1034933548 | N | 35.41.03.6 | E | 139.43.22.2 | jus事務局
1034330710 | N | 35.41.49.1 | E | 139.46.41.7 | たん清
1033722220 | N | 35.41.23.0 | E | 139.41.54.0 | 新宿野村ビル
- 実際にはこのシステムのWebページにアクセスがあるたびに
PHPプログラムがSQL文を実行し、検索結果をHTMLで表示している
(page 16)
PHPを用いた各種処理プログラム作成
- とりあえず必要なプログラム
- フォームからデータを取り出してデータベースに保存
するプログラム
- データベースからデータを取り出してWebに表示
するプログラム
- PHPプログラムの中で、PostgreSQLを操作する組み込み関数を
使ってSQL文を実行
(page 17)
データベースに保存するPHPプログラム
アルゴリズムの概略(inputsamplephp.txt参照)
- ユーザ名とパスワードのチェック
- 入力時刻をサーバの時計から取得
- フォームから北緯/南緯、緯度、東経/西経、経度、コメントを取得
- 入力用SQL文を作成
- insert into bartbl values (......);
- SQL文を実行しデータベースに入力(pg_exec())
- 入力の成否や位置情報をHTMLで出力し、ブラウザに表示
(page 18)
データ検索と表示を行うPHPプログラム
アルゴリズムの概略(outputsamplephp.txt参照)
- 検索のSQL文を作成
- select * from bartbl order by unixtime desc;
- 検索を実行(pg_exec())
- ヒット件数を測る(pg_numrows())
- 以下をヒット件数分だけループ
- n件目の結果を取り出す
- UNIX時刻を人間が見やすい日時に変換して表示
- 緯度、経度を人間が見やすい表記に変換して表示
- コメントはそのまま表示
- 地図へのリンク用URLを作成し表示
- メモリに保持していた検索結果を解放(pg_freeresult())
(page 19)
位置情報から地図へのリンク用URLの作成
MapFanWebへのリンクの例
// 緯度を度/分/秒/小数に分解
if (ereg("([0-9]{1,2}).([0-9]{1,2}).([0-9]{1,2}).([0-9]{1})",$ido, $iregs)) {
print "$iregs[1]度$iregs[2]分$iregs[3].$iregs[4]秒";
}
// 経度を度/分/秒/小数に分解
if (ereg("([0-9]{1,3}).([0-9]{1,2}).([0-9]{1,2}).([0-9]{1})",$keido, $kregs)) {
print "$kregs[1]度$kregs[2]分$kregs[3].$kregs[4]秒";
}
// MapFanへのリンク用URLを作成(実際には1行)
$mapfanurl = "http://www.mapfan.com/index.cgi?ZM=8&MAP=" .
"$touzai$kregs[1].$kregs[2].$kregs[3].$kregs[4]
$nanboku$iregs[1].$iregs[2].$iregs[3].$iregs[4]";
// Webに表示
print("MapFan | \n");
(page 20)
最初の実装できました
- GPSを見ながらノートPCにデータを入力して送信し、
結果をWebで見られるようになった
(page 21)
第2期工事
- 使い始めるといろいろと改善したくなる
- GPSで測定して、ノートPCの電源を入れて、
インターネットに接続して…などというのは面倒
- 入力件数が増えてきたら出力も工夫したい
- 入力したデータを修正/削除したり再利用したい
(page 22)
携帯電話の活用
- そこで、携帯電話のWebで入力することを考えた
- 携帯電話Web用の入力フォームを用意
- GPSで測定した位置情報をフォームに入力して送信
- GPSと携帯電話さえあれば入力できるようになり、手間が削減される
(page 23)
携帯電話用Webページ
サービス名 プロトコル Web記述言語
--------------------------------------------------------------
au EZWeb WAP HDML
i-mode i-mode 独自 コンパクトHTML
J-Phoneもまた別の仕組み
- 最初はWAP用を作成
- HDMLによる入力フォーム
- 入力データをデータベースに保存するPHPプログラム
- WAP 2.0(Web記述言語はXHTML)も出ているが
このシステムでは未使用
- 後にi-mode用も作成
- 入出力の文字コードをShiftJISにする以外は、
基本的にHTML版と同じでよい
(page 24)
WAP用Webページ作成時の注意点
- HTMLによるWebページとは考え方から違う
- 「カード」と「デッキ」を基本に構成
- カード: 1画面に相当
- デッキ: カードの集合、1つの作業単位に相当
- HDMLはHTMLとタグの互換性がない
- HDMLで書いたページはPC用ブラウザで見ることができない
- 普通はシミュレータでテストしてからサーバに載せる
- しかしUNIX用シミュレータがないので
いきなりサーバに載せてテスト(^_^;)
- WebサーバにWAP用設定が必要
- Apacheの場合は、.htaccessもしくはhttpd.confに以下を追加
AddType text/x-hdml; charset=Shift_JIS hdml
(page 25)
HDMLで書く入力フォーム
(hdmlsample.txt参照)
- 入力フォーム全体を1つのデッキ、各入力項目をカードとする
- 各カードの入力項目
- ユーザ名(文字列)
- パスワード(文字列)
- コメント(文字列)
- 北緯/南緯(選択、デフォルトは北緯)
- 緯度(数字7けた、例: 3510061)
- 東経/西経(選択、デフォルトは東経)
- 経度(数字8けた、例: 13653534)
- 最後のカードで入力結果を表示し、確認してから送信
- 途中で「戻る」ボタンを押すと、前の項目に戻って訂正可能
(page 26)
出力の工夫
- 入力件数が増えてきたので、いろいろな条件で表示できるようにした
- 最近1週間のデータを表示(現在のデフォルト)
$sql = "select * from bartbl where unixtime >= $oneweekago order by unixtime desc";
$sql = "select * from bartbl order by unixtime desc limit 50";
- 場所/コメント欄に対するキーワード検索に合致したデータのみ表示
$sql = "select * from bartbl where comment ~* '$keyword' order by unixtime desc";
$sql = "select * from bartbl where unixtime >= $fromtime and unixtime <= $totime order by unixtime desc";
(page 27)
入力したデータの修正/削除
- 用途
- 間違えて入力したとき
- 入力した位置情報と本当にいた場所とのずれが大きいとき
- ユーザインターフェース
- 管理用画面を用意
- 修正/削除したい1件を選ぶと編集画面に移動
- 削除の場合は、ユーザ名とパスワードを付けてsubmit
- 修正の場合は、緯度、経度、コメントを編集してsubmit
- データベースでの処理
$sql = "delete from bartbl where unixtime='$unixtime'";
- 修正時は、SQLのdelete文で削除してからinsert文で修正後の
データを入力
- 時刻は修正できないことにした
- つまり、過去の出来事を後で入力することはできない
- 「その場で入力しないと記録に残らない」という試練を
自分に課した
(page 28)
入力したデータの再利用
- ユーザインターフェース
- 管理用画面から再利用したい1件を選ぶ
- その1件の位置情報とコメントを埋め込んだ
新規入力フォームが作られる
- 必要に応じて編集して送信
- 新規入力としてデータベースに保存される
(page 29)
かなり便利になったのですが…
- GPSの問題点
- 基本的に外に出ないと受信できない
- 周囲に高い建物があると受信できない
- 全体的に測位に時間がかかる(早くて10秒、遅いと数分)
- 誤差が気になる(誤差10mあると隣の店になってしまう)
- GPSを使わずに位置情報を取得する方法を考える
- 現在地の住所や施設名などでMapFanWebを検索し、
現在地の地図を表示
- URLに含まれる緯度経度をフォームにcut&pasteして送信
- この作業をもう少し簡単にできないか?
(page 30)
地図サイトの検索機能を使ったデータ入力(1)
- 動作概略
- Webのフォームに検索種別と検索語を入力して送信
- このシステムのWebサーバにおいて
地図サイト検索用URLを作成し、送信
- 地図サイトから返ってきたHTMLから
位置情報と地名を取り出し、ブラウザにリストアップ
(通常、複数件並ぶ)
- 入力したい地名をユーザが選ぶと、地名と位置情報を
埋め込んだ入力フォームをサーバから返す
- 必要に応じて編集し送信すると、情報がデータベースに保存される
- ちょっとやってみましょう → 実演
(page 31)
地図サイトの検索機能を使ったデータ入力(2)
- 現在はMapFanWebを対象に検索可能
- 検索手段
- 携帯電話でも同様のことができるようにした
- Webから必要な情報を自動的に取り出して何かに使うという手法は、
追究するといろいろな使い道があるかも
(page 32)
Googleへのリンク
- コメント欄をキーワードにしてGoogleを検索する機能
- 入力した場所の関連情報が出たら面白いかなと思って作ってみた
- 実装
- コメント欄の言葉をキーワードとする
Google検索用URLを作り、リンクを張る
$googleurl = "http://www.google.co.jp/search?ie=EUC_JP&oe=EUC_JP&q="
. urlencode($srchword);
print("Google | \n");
- コメントの"、""("より前だけ取り出してキーワードに使っている
$rplc_comment = str_replace("(","、",$comment); ……"("を"、"に置換
$pos = strpos($rplc_comment,"、"); ……"、"の位置を検出
if ($pos != False) {
$srchword = substr($rplc_comment,0,$pos); ……"、"より前だけ取り出す
} else {
$srchword = $comment;
}
(page 33)
すべての到達地点を白地図に描画
- たまったデータの活用法のひとつとして考えた
- GMT(The Generic Mapping Tools)を使用
- 描画プログラム
- 到達地点データをPostgreSQLから入手し、ファイルに保存
139.68594 35.62617
129.84711 32.75361
……
- GMTコマンド群を使って地図を描き、PNGに変換して保存
psbasemap -R125/142.5/25/37.5 -Ba5f2.5 -K > map.ps ……外枠を用意
pscoast -Jm -R -Di -G200 -K -O >> map.ps ……海岸線を描画
psxy -Jm -Sc0.1 -W1 -R -O < data.txt >> map.ps ……到達地点を描画
(page 34)
僕ならばここにいる予定
- 「僕ならばここにいる」を応用して作ったスケジュール表
- 実装のポイント
- 今まで入力してなかった時刻情報を入れる必要がある
- 「予定」に入れたものを「ここにいる」に流用したい
- データベースは「ここにいる」とは別テーブルで管理
(page 35)
今後の課題(1)
位置情報取得に関して
- GPS携帯電話(au)の利用
- 携帯電話の基地局情報とGPSを組み合わせて、
野外でも屋内でも位置情報が出るようにしている
- 現在地をメールで送信できるサービスがいくつかある
- NAVITIMEの例
http://map.navitime.jp/?datum=0&unit=0&lat=+35.41.23.00&lon=+139.41.54.00
http://www.at-navi.com/map/dispMap.jsp?datum=1&unit=0&
lat=+35.41.23.00&lon=+139.41.54.00&sc=1
- メールに書かれたURLから位置情報を取り出してデータベースに
保存するプログラムを書けば、GPS携帯電話だけで済む?
- 電話番号から位置情報を引き出したい
- 店の位置情報を調べたいときに使えそう
- インターネットタウンページを解析すればできる?
(page 36)
今後の課題(2)
その他
- 表示形式の改善
- 1件について表示する情報がかなり増えてきた
- 適当に減らすか、別ページに詳細情報が出るようにしたい
- プログラムもそろそろ整理した方がいいような気がする
- *.phpの合計が5000行近くなっている
- 特に「僕ならばここにいる予定」を作り始めてから
混乱するようになった
- 複数ユーザ対応
- テーブルをユーザごとに用意すれば可能?
- それ以前に、そもそも使いたい人がいるのか?
- 他にも面白いネタを思いついたらやってみたい
- 個人的に最大の関心事
- その時刻に確かにその地点から入力したことを証明する
手段はないか?
(page 37)
まとめ
- 参考文献
- 「PHP4徹底攻略」ソフトバンクパブリッシング
- 「PostgreSQL完全攻略ガイド」技術評論社
- 「ケータイで見るWebページの作り方」アスキー
- UNIX MAGAZINE 1999年3月号「インターフェイスの街角」
(page 38)
質問受け付けます
(page 39)