JavaScriptでモグラ叩きを作ってみました
JavaScriptでモグラ叩きを作ってみました。
http://raiteu.appspot.com/game/mogu/index.html
音楽に合わせてリズミカルにモグラが出て来ると言う非常に画期的なまあぶっちゃけアレの丸パクリなんですが。
一応、HTML5のaudioを使ってみたり、iPhoneのタッチに対応させてみたりと技術的に美味しそうな所を触ってみたりしてるんですが……。audioタグの先行読み込みが効いて無い感じです。音楽の再生を開始して貰って(音声データをキャッシュして貰って)一旦停止して最初から再生して貰わないと音声と譜面が合わないとか酷い仕様。何か設定を間違っているのでしょうか。
あと、iPhoneとかだと性能的に苦しい感じです。赤とか無理ゲー。
pythonでgoogle mapを弄る
何をするか
・住所から緯度経度を検索する
・google mapのマイマップに場所情報を登録する
何が出来たか
jubeat設置店MAP_北海道・東北
jubeat設置店MAP_北陸・甲信越・東海
jubeat設置店MAP_北関東
jubeat設置店MAP_東京都
jubeat設置店MAP_南関東
jubeat設置店MAP_近畿
jubeat設置店MAP_中国・四国
jubeat設置店MAP_九州・沖縄
導入
jubeatというゲームがあります。アミューズメント施設(平たく言うとゲームセンター)などに設置されているゲームなんですが、設置台数が少なめです。
なので、有志が設置店舗の情報を集めてwikiに纏めています。ありがたやありがたや。
しかし。
住所の羅列なので、例えば「横浜市内の設置店舗を調べたい」ってときには有効ですが、「通勤経路上で設置店舗無いかな〜」って時には使い辛いんです。
そこで。
地図上にポイントすれば直感的に分かり易いんじゃないかな〜と思ってgoogle mapを使ってやってみました。
実践
1.wikiのhtmlから住所を抽出
特に捻りも無くSAX parserを使って解析し、「店の名前」「店の詳細」「住所」の一覧を作成します。
(詳細は割愛)
2.住所を緯度経度に変換
詳細はThe Google Geocoding API http://code.google.com/intl/en/apis/maps/documentation/geocoding/
を参照してください。
Google Geocoding APIに住所を投げるとxmlまたはjson形式で情報を返してくれます。
import urllib ENCODING = 'utf-8' def geocode(address): url = u"http://maps.google.com/maps/api/geocode/xml?&language=ja&sensor=false®ion=ja&address=" url = url + urllib.quote(address.encode(ENCODING)) buffer = urllib.urlopen(url).read() return buffer
json形式で取得したい場合は、上記コード中のURLにあるxmlをjsonに換えます。
ここではxml形式で取得して必要な情報を抽出します。
import xml.dom.minidom dom = xml.dom.minidom.parseString(buffer) location = dom.getElementsByTagName('location') if location.length > 0: # 緯度 lat = location[0].getElementsByTagName('lat')[0].firstChild.data # 経度 lng = location[0].getElementsByTagName('lng')[0].firstChild.data
3.緯度経度その他情報をgoogle mapのマイマップに登録
ライブラリのダウンロードが必要です。
詳細はGoogle Maps Data API
http://code.google.com/intl/en/apis/maps/documentation/mapsdata/
を参照。
ライブラリのダウンロードは以下のリンクから。
Client Libraries
http://code.google.com/intl/en/apis/gdata/docs/client-libraries.html
MapsClientクラスのインスタンスを作成して各種操作を行います。
import gdata.maps.client client = gdata.maps.client.MapsClient() # ログイン client.client_login('(google id)', '(パスワード)', source="myApp") # マイマップ作成 targetMap = client.create_map(u'テスト地図') map_id = targetMap.get_map_id() content = '<Placemark><name>%s</name><description><![CDATA[%s]]></description><Point><coordinates>%s,%s</coordinates></Point></Placemark>' % (u'店の名前', u'店の詳細', lng, lat) # マイマップにポイントを追加 client.add_feature(map_id, u'店の名前', content.encode(ENCODING))
(google id)、(パスワード)の部分は各自のgoogleアカウントの物を使用して下さい。
ポイント追加に使用しているcontent文字列は、KML形式と呼ばれる記法です。coordinates要素で位置を指定します。経度、緯度、高さの順に指定できるのですが、今回は高さは使用していません。
このコードによって、マイマップにテスト地図が作成され、ポイントが追加されます。
起床なうキャストってツールを作ってみました
http://raiteu.appspot.com/nowcast.html
その名の通りtwitterに「起床なう」とツイートするだけのツール。
朝起きたらまずPCの電源を入れる習慣があるので、スタートアップに入れておけばとりあえず起床時にツイート出来るかなあと思って作ってみました。
似たようなツールは既にあるようにも思いますが、まあPythonの勉強も兼ねてるってことで。
使用したライブラリは
http://code.google.com/p/python-twitter/
- simplejson
http://pypi.python.org/pypi/simplejson/
http://code.google.com/p/oauth-python-twitter/
- oauth
http://oauth.googlecode.com/svn/code/python/
もうすぐOAuth認証が必須になるから、気軽に試せる内に色々試せて良かったと思います。
*1:pinコードの設定でバグがあるのでhttp://code.google.com/p/oauth-python-twitter/issues/detail?id=3を参照
dabrを玄箱にインストールしたときの記録
twitterのクライアントdabrを玄箱にインストールしたときの記録です。
1.とりあえず導入
PHP5.2.0とApache2は導入済みなんでまあ簡単だろうと、適当に開始。
PHPモジュール(curl,mcrypt)をインストール。
dabrのダウンロードページからzipファイルをダウンロードしてきて展開。PHP実行用ディレクトリにコピー。
2.一応動いたが……
該当ページにアクセスしたところ、ページ表示はあっさり成功。ログインも出来た。
しかしタイムラインにツイートが1件しか表示されない。しかも最新でも無く妙に古い。
何ぞこれ?
dabrのFAQを参照すると似たような現象についての言及があった。
ツイート数が膨大な数になっててIDに割り振られる数値がPHPのint型の限界を超えてるから全部同じ数値扱いになっちゃってどうとか。
でもこれ結構前のバージョンでFIXされてるって書いてあるんだけど……。
オンラインで公開されてるdabrのサイトではちゃんと表示されてるし。
4.更に仕方が無いのでソースを見る
twitter.phpのタイムライン解析処理辺りを流し読む。
APIを使ってJSON形式で取得したデータをデコードしてる辺りが怪しい。
ということで解析結果を表示させてみたら……ちゃんと解析されてる。
でも良くみたらIDが全部同じ値(2147483647)だ。
つーかこれint型の限界値じゃないか?
json_decode 2147483647で検索してみるとjson_decodeの既知のバグで、数値を解析するときにintの限界を超えていると同じ値になるとか何とか。
PHPのバージョンをあげるとFIXされてるそうだ。
6.で、結局どうしたか
数値じゃなきゃ良いんだろ!
ってことでソースに手を入れて、json_decodeする前の文字列を加工してIDを無理やり文字列に変換するように…… こんな感じ。
$ diff -c twitter.php.org twitter.php *************** *** 290,295 **** --- 290,296 ---- { case 200: case 201: + $response = ereg_replace('"id":([0-9]+),', '"id":"\1",', $response); $json = json_decode($response); if ($json) {
こんなので良いのかとも思いますが、まあ一応動いてるんで良いかなと。