ストーキングやばい

Standard
ストーキングやばい

仕事でAndroid端末から位置情報をサーバに送信して、その情報をマップ上に表示するっていうシステムを作りました、こないだ。テストがおもしろくてやばかったです。Androidアプリを起動してバスに乗ってもらって渋谷区界隈をグルッと回ってもらいました。ボクらは会社からマップ見ながらどんぐらいズレてるかを確認してたわけなんですが、意外とそんなにズレなくて、Androidが衛星をつかまえれてさえいれば、どこにいるか世界まる見えなわけですよ。なんていうかこう、他人の私生活のぞき見感満載な気分を味わえました。浮気調査の依頼はぜひウチにですよ奥さん。テスト終わったっつってキャバクラに直行してくれたらおもしろかったのになー 
 
 
マップの描画はGoogle Map APIのVersion3を使いました。マップ上にルートを描画するDirectionsサービスを初めて使ったわけですが、賢さにビックリしてオシッコちょっと出そうになったのでメモ。Travel Modesやばしなのでそれについて。
 
Directionsサービスを利用するときにリクエストパラメータに入れないといけないTravel Modes。指定できるのは以下の3つ。

  • DirectionsTravelMode.DRIVING → 車
  • DirectionsTravelMode.WALKING → 歩き
  • DirectionsTravelMode.BICYLING → チャリ

 
DirectionsTravelMode.BICYLINGについてはVersion3から追加されたモードで今のところアメリカの地図でしか使えない。DRIVINGモード使ったら一通とかちゃんと避けて線が引かれたから会社で思わず「Uho」って言ってしまった。Google携帯にはGoogleカーナビが標準装備されててもいいと思った。
 
サンプルはこんな感じ。モードを選ぶと鶴ヶ峰駅か横浜駅までのルートを描画するよ。途中で三ツ沢公園を経由するばいね。いんたーねっとえくすぷろーらーで見れるのか知りませーん
  サンポー
 
ソース

<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head>
<title>Google Map Directions Sample</title>
<style>
html {
  height: 100%;
}
body {
  height:100%;
  margin:20px;
  padding:0px;
}
#map {
  height:90%;
  width:90%;
}
#selector {
  margin-top:15px;
}
#select_walk {
  margin:0px 20px 0px 5px;
}
#select_drive {
  margin:0px;
}
</style>
<script src="http://www.google.com/jsapi"></script>
<script>google.load("jquery","1.4.2");</script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script>
$(function() {
  var otsuru = new google.maps.LatLng(35.47469,139.549029);
  var op = {
    zoom:18,
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    center: otsuru
  }
  map = new google.maps.Map(document.getElementById("map"), op);
  $('#select_walk,#select_drive').bind('click', function() {
    var directionsService = new google.maps.DirectionsService();
    var directionDisplay = new google.maps.DirectionsRenderer();
    var hama = new google.maps.LatLng(35.466464,139.620802);
    var request = {
      origin:otsuru,
      destination:hama,
      waypoints:[{
        location:'35.4705,139.606876',
        stopover:true
      }],
      travelMode: ($(this).attr('id')=='select_walk')? google.maps.DirectionsTravelMode.WALKING : google.maps.DirectionsTravelMode.DRIVING
    };
    directionsService.route(request, function(result, status) {
      if(status == google.maps.DirectionsStatus.OK) {
        directionDisplay.setDirections(result);
      }
    });
    map = new google.maps.Map(document.getElementById("map"), op);
    directionDisplay.setMap(map);
  });
});
</script>
</head>
<div id="map"></div>
<div id="selector">
<span id="select_walk"><a href="#">横浜まで歩く</a></span>
<span id="select_drive"><a href="#">横浜まで車で行く</a></span>
</div>
<body>
</body>
</html>

緯度経度を知りたいときは、Googleマップで知りたい場所を右クリック→「この場所について」で取得できるよ。
 
 
マイミクをストーキングできるmixiアプリを作ろうかな。
 
 

Cover image is not found
amazon.co.jpで詳細情報を見る


Google App Engine で select distinct

Standard
Google App Engine で select distinct

Python のSet クラスに感動したのでメモ。
Google App Engine でアプリケーションを開発するとき、データはGoogle Data Store 上に保存する。保存したデータを参照するときはGQLのクエリーを発行するんだけど、GQLにはSQLでいうところのdistinct関数がない。で、distinct使いたいときはアプリ側で処理する必要があるんだけど、Python には Set クラスっていうイケメンなやつがいた。
 

>>> a = [1,1,1,2,2,3,4,5,6,6,6,7,8,9,9,9]
>>> b = set(a)
>>> b
set([1, 2, 3, 4, 5, 6, 7, 8, 9])

 
 
しかもSet 先輩は in っていうしゃかりきな舎弟を連れてる。
たとえば、↓みたいなStreetFighterモデルが保存されてたとして、
ID | name | from
——————
1000 | Ryu | Japan
1001 | Ken | USA
1002 | EHonda | Japan
1003 | Chun-Li | China
1004 | Blanka | Brasil
2001 | Zangief | Russia
2002 | Guile | USA
2003 | Dhalsim | India
 
この中から出身地の一覧を取得したいときは↓みたいな感じに書く。
 

fighters = StreetFighters.all()
fighters_from = []
for f in fighters:
  fighters_from.append(f.from)
results_fighters_from = []
for result in fighters_from:
  if result not in results_fighters_from:
    results_fighters_from.append(result)

 
これで、
results_fighters_from = ['Japan','USA','China','Brasil','Russia','India']
になる。んー、かっこいい。オレが女ならとりあえず同じ部活にマネージャーで入部しとく。