JavaScriptでモグラ叩きを作ってみました

JavaScriptモグラ叩きを作ってみました。
http://raiteu.appspot.com/game/mogu/index.html
音楽に合わせてリズミカルにモグラが出て来ると言う非常に画期的なまあぶっちゃけアレの丸パクリなんですが。

一応、HTML5のaudioを使ってみたり、iPhoneのタッチに対応させてみたりと技術的に美味しそうな所を触ってみたりしてるんですが……。audioタグの先行読み込みが効いて無い感じです。音楽の再生を開始して貰って(音声データをキャッシュして貰って)一旦停止して最初から再生して貰わないと音声と譜面が合わないとか酷い仕様。何か設定を間違っているのでしょうか。

あと、iPhoneとかだと性能的に苦しい感じです。赤とか無理ゲー。

pythonでgoogle mapを弄る

何をするか

・住所から緯度経度を検索する
google mapのマイマップに場所情報を登録する

導入

jubeatというゲームがあります。アミューズメント施設(平たく言うとゲームセンター)などに設置されているゲームなんですが、設置台数が少なめです。
なので、有志が設置店舗の情報を集めてwikiに纏めています。ありがたやありがたや。
しかし。
住所の羅列なので、例えば「横浜市内の設置店舗を調べたい」ってときには有効ですが、「通勤経路上で設置店舗無いかな〜」って時には使い辛いんです。
そこで。
地図上にポイントすれば直感的に分かり易いんじゃないかな〜と思ってgoogle mapを使ってやってみました。

手順

1.wikiのhtmlから住所を抽出
2.住所を緯度経度に変換
3.緯度経度その他情報を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&region=ja&address="
    url = url + urllib.quote(address.encode(ENCODING))
    buffer = urllib.urlopen(url).read()
    return buffer

json形式で取得したい場合は、上記コード中のURLにあるxmljsonに換えます。
ここでは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要素で位置を指定します。経度、緯度、高さの順に指定できるのですが、今回は高さは使用していません。
このコードによって、マイマップにテスト地図が作成され、ポイントが追加されます。

dabr on 玄箱でOAuth認証

そろそろやらなきゃなと思って、試しにログイン画面からSign in with Twitterボタンを押してみると401エラー。
おかしいなあと思って最新のソースを調べてみたりhttpsをやめてhttpにしてみたり色々調べてみた結果。
……自分でTwitterアプリ申請をしてConsumer keyとConsumer secretを取得して、user.phpに設定しなければならないというオチ。まあ考えてみれば当たり前っちゃ当たり前だよね。

起床なうキャストってツールを作ってみました

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のサイトではちゃんと表示されてるし。

3.仕方が無いので最新版を導入

ダウンロードページじゃなくてSVNリポジトリから最新版(r316)を取得してやり直し。
位置情報が云々って言うチェックボックスは追加されたけどツイートは1件のみ。

4.更に仕方が無いのでソースを見る

twitter.phpのタイムライン解析処理辺りを流し読む。
APIを使ってJSON形式で取得したデータをデコードしてる辺りが怪しい。
ということで解析結果を表示させてみたら……ちゃんと解析されてる。
でも良くみたらIDが全部同じ値(2147483647)だ。
つーかこれint型の限界値じゃないか?
json_decode 2147483647で検索してみるとjson_decodeの既知のバグで、数値を解析するときにintの限界を超えていると同じ値になるとか何とか。
PHPのバージョンをあげるとFIXされてるそうだ。

5.PHPのバージョンをあげる?

軽く検索してみたら何か面倒そう。ていうか玄箱じゃ無理?

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)
                        {

こんなので良いのかとも思いますが、まあ一応動いてるんで良いかなと。

引越しの見積もり

月末に引っ越すんで引越し屋を呼んで見積もってもらいました。
複数呼んで別々に見積もって比較するとか考えたんですけど、もう面倒なんで1社しか頼みませんでした。
でも見積もりが終わって金額を提示された後、何か変な見栄が働いて、
「あと2社ほど呼んでますんで、比較検討が終わってから返答します」って言ったら引っ越し屋さんが
「今決めてくれたら更に値引きしますよ」って言ってきて。
てことでさらに御安くして頂いて、ちょっと得したかなと。


向こうもそんなのは折込済みで、「こんな値段で契約してやったぜ。勝った!」とか思ってるのかも知れませんが。
これがWin-Winの関係ってやつですね(違