2009-11-08

iappliTool for Star-1.1でビルドすると落ちる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
私の環境では、iappliTool for Star-1.1でビルドするとiappliToolが終了してしまいます。
iappliToolが終了していてもビルド自体は出来ています。
ビルドできているのでいいと言えばいいのですが、いちいち再起動が面倒なわけです。

これを回避するためには、
iappliToolの「設定」-「エミュレータ環境設定」の「ビルドの設定」タブを選び
「チェック処理」の
「ADFチェック処理(起動時必須項目)を実行する」のチェックをはずす
とよいようです。
これでビルドしても落ちなくなりました。

2009-11-05

PythonさんでGoogleカレンダーのイベント内容を取得する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
PythonでGoogleカレンダーに登録されているイベントを取得してみました。

データの取得にはgdata-python-clientというのを使うのがとても便利です。
以下から取得できます。
http://code.google.com/p/gdata-python-client/

使い方は、以下を見る感じです。
http://code.google.com/intl/ja/apis/calendar/data/1.0/developers_guide_python.html

認証には、AuthSub,OAuth,ClientLoginと種類があるのですが、以下の例ではClientLoginを利用しています。

import gdata.calendar.service

def print_event():
#認証部分
username = 'グーグルアカウント'
calendar_service = gdata.calendar.service.CalendarService()
calendar_service.email = username
calendar_service.password = 'グーグルアカウントのパスワード'
#適当にプログラム名を指定すればよい感じ
calendar_service.source = 'Google_Calendar_Event_Get_test'
calendar_service.ProgrammaticLogin()

#デフォルトのカレンダーから取得する
visibility = 'private'
projection = 'full'
query = gdata.calendar.service.CalendarEventQuery(username, visibility, projection)
#検索条件の指定
#検索範囲を指定
query.start_min = '2009-11-01'
query.start_max = '2009-12-02'
#繰り返しイベントを別のイベントとして取得
query.singleevents = 'true'
#イベントの開始日時の昇順でソート
query.orderby='starttime'
query.sortorder='a'
feed = calendar_service.CalendarQuery(query)

for ev in feed.entry:
for e in ev:
print '%s. [%s]-[%s]' % (ev.title.text,e.start_time,e.end_time)


ちなみにCalendarEventQueryの検索条件に指定できるのは、以下を参照すると分かります。
http://code.google.com/intl/ja/apis/calendar/data/2.0/reference.html#Parameters
テキストで検索するには以下を参照するとわかります。
http://code.google.com/intl/ja/apis/calendar/data/1.0/developers_guide_python.html#RetrievingWithQuery

2009-11-03

Djangoでいきなりテンプレートへ渡す

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Djangoで説明ページなどでなんの処理もしないでいきなりテンプレートに渡したいと時があります。
その際には、汎用ビューの一つの
django.views.generic.simple.direct_to_template
を使えばOKです。
例えば/testというページにリクエストが来たらtemplate/test.htmlに飛ばしたいときは
urls.py
に以下のような感じで書くとよい感じです。

urlpatterns = auth_patterns + patterns('',
('^test/$','django.views.generic.simple.direct_to_template',
{'template': 'test.html'}),
) + urlpatterns

どうやるんだろうと思っていたら、Google App Engine Patchのサンプルのトップページでも使っていました。

2009-10-19

「ソコニイク」なるものを作ってみました

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ソコニイクというのを作ってみました。
どっかに似たようなものがきっとあるような気もするのですが、地図を使ったサイトです。

コンセプトとしては、PCはソコソコ使えるけど、携帯はそんなに使いこなせていないなぁと言う私のような人が携帯をもうちょっと使ってみようというものです。

使い方としては、PCで事前に地図を調べておいて携帯に地図のURLを送っておいて、現場近くになったら携帯でその地図を見るというものです。
なので最後は携帯で利用することを前提としています。

携帯の地図サイトとか便利なんでしょうけど、現場近くで迷ったときは携帯でその場で地図を調べるのはどうもまどろっこしくて結局は人に聞いてしまう感じなのです。
なのでせめてPCで事前で調べておこうかなぁということで
ソコニイク
を作ってみました。

気が向いたら使ってみてください。

2009-10-15

ブラックライトつきのペン

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク



ブラックライトがついたペンで何ができるかというと通常は見えない文字が見えるようにできるということなのです。
使い道が正直あまり思いつかないのですが、そんなお子様スパイ的な感じのことがちょっとステキでキニナルのです。

紙和

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク


紙封筒みたいなものなのですが、シワの感じがステキでキニナルのです。

2009-10-10

Djangoでjsonを読み取る

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Djangoでjsonを使おうと思うとjson形式で出力することはいっぱい見つかるのですが、どっかのAPIとかを使った出力がjson形式でそれをパースしようと思ったときの情報が少ない感じがします。

json形式をパースするにはDjangoの中にsimplejsonというものが付属しているようなのでそれを利用すればよいそうです。

以下のような感じです。

import django.utils.simplejson as json

def parse_json(json_str):
obj = json.loads(json_str)
return obj


こんな感じで使う感じです。
json_str='["foo", {"bar":["aaa", "bbb", "ccc"]}]'
ret = parse_json(json_str)
foo = ret['foo']

でもDjango1.1からはsimplejsonがDjangoに組み込まれなくなったようなことをどっかで見たような気がしないでもないです。

simplejsonに関して詳しくは以下を参考にしてください。
http://undefined.org/python/#simplejson
ちなみにjson形式で出力を行うには、以下を参考にしてくみてください。
http://djangoproject.jp/doc/ja/1.0/topics/serialization.html

2009-10-03

携帯からgoogle mapにリンクをはったり、グーグルのiアプリを起動したり

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
携帯サイトなどえも自分でgoogleのapiを利用して地図を作るのもよいのですが、なんだかんだで携帯さんのgoogleさんを利用できると便利なことが多いわけです。

そんなわけで指定した場所で携帯googleマップにリンクを張る方法は、以下が参考になります。
http://imakoko.didit.jp/imakoko_html/memo/parameters_google.html
こちらでloncパラメータに緯度経度を指定できと書いてありますが、緯度経度は指定できずに地名しか指定できないようです。

緯度経度を利用するならば、逆ジオコーディングをして住所などを割り出す必要があります。
逆ジオコーディングは、以前書いた以下を参考にしていただけるとうれしいです。
pythonさんでジオコーディングと逆ジオコーディング

またdocomoでは、googleマップのiアプリも便利なわけなの起動のためのリンクなども用意すると便利な感じです。その方法は、以下が参考になります。
http://saya.s145.xrea.com/archives/2007/08/post_258.html
アプリ起動の際にqパラメータに緯度経度や地名を渡すことで指定した場所を中心にして起動できます。
qパラメータにはkml(簡易のようですが)も渡すことができるそうです。

2009-09-30

Google Static Maps APIのいい感じのズームサイズを決定する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google Static Maps APIを使っているとある2点が一画面に収まるような感じのズームサイズを決定したくなることがあります。

pythonで以下のような感じで求められそうです。

#2つの指定座標が収まるズームサイズを求める
#sizeは画像サイズ(正方形地図を利用としています)
# 長方形の場合は、二つの値を受け取ってそれぞれに対して
# zoomを計算して小さい方を選べばよいと思います。
#x1,y1はポイント1の緯度経度
#x2,y2はポイント2の緯度経度
def get_zoom_size(size,x1,y1,x2,y2):
dx = float(x1)-float(x2)
dy = float(y1)-float(y2)
d=math.sqrt(dx*dx+dy*dy)
if d==0:
return 14
zoom = math.log(float(size)/d)/math.log(2)
return int(math.floor(zoom))

floatやらintやらがこなれていない感じがビンビンしてますが、なんとなく出ている感じがするので、まぁよしとしましょう。
これは、
Google Static Maps API で表示した画像の端っこの緯度経度を調べる
で紹介した以下の式を変形させて出してみました。
lx=float(xsize)/pow(2,float(zoom))

2009-09-29

pythonでモバイルAdSenseを使ってみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
※この方法では、広告は表示されますがカウントがされていないことがわかりました。
※カウントされる方法はまだわかりません。
※※ カウントされないのはGoogle App Engineに配置したときのケースのようです。(追記 2010/5/20)

携帯用のAdSenseを利用する場合は、PHP,perlなどのコードを貼り付けなさいと最終的になります。
GoogleAppEngineを使っているならば、pythonで使ってみたくなるのです。
なのでPythonで使ってみました。
GoogleAppEngineでないならばurlfetchの部分は置き換えが必要です。
後は、自分用の設定にするにはモバイルAdSenseで生成されたPHPなどのコードを見ながら適切に自分用の値を設定する必要があります。

# -*- coding: utf-8; -*-
from time import time
from math import floor
from urllib import urlencode
from google.appengine.api import urlfetch

def google_append_color(color,dt):
color_array = color.split(',')
return color_array[int(dt % len(color_array))]

def google_ad(request):
scheme = 'https://' if request.is_secure() else 'http://'
dt = time()
params = {
'ad_type':'text_image',
'channel':'設定したいchannelのコードを設定',
'client':'ca-mb-' + '自分のAdSenseの値を設定',
'dt':repr(floor(dt*time())),
'format':'mobile_single',
'https':request.META.get('HTTPS', ''),
'ip':request.META.get('REMOTE_ADDR', ''),
'markup':'xhtml',
'oe':'utf8',
'output':'xhtml',
'ref':request.META.get('HTTP_REFERER', ''),
'url':scheme + request.META.get('HTTP_HOST', '') + request.META.get('REQUEST_URI', ''),
'useragent':request.META.get('HTTP_USER_AGENT', ''),
'color_border':google_append_color('ここは色をカスタマイズするならば利用',dt),
'color_bg':google_append_color('ここは色をカスタマイズするならば利用',dt),
'color_link':google_append_color('ここは色をカスタマイズするならば利用',dt),
'color_text':google_append_color('ここは色をカスタマイズするならば利用',dt),
'color_url':google_append_color('ここは色をカスタマイズするならば利用',dt),
}
screen_res = request.META.get('HTTP_UA_PIXELS', '')
delimiter = 'x'
if screen_res == '':
screen_res = request.META.get('HTTP_X_UP_DEVCAP_SCREENPIXELS', '')
delimiter = ','
if screen_res == '':
screen_res = request.META.get('HTTP_X_JPHONE_DISPLAY', '')
delimiter = '*'
res_array = screen_res.split(delimiter)

if len(res_array) == 2:
params['u_w'] = res_array[0]
params['u_h'] = res_array[1]

muid = request.META.get('HTTP_X_DCMGUID', '')
if muid != '':
params['muid'] = muid
muid = request.META.get('HTTP_X_UP_SUBNO', '')
if muid != '':
params['muid'] = muid
muid = request.META.get('HTTP_X_JPHONE_UID', '')
if muid != '':
params['muid'] = muid
muid = request.META.get('HTTP_X_EM_UID', '')
if muid != '':
params['muid'] = muid

url = 'http://pagead2.googlesyndication.com/pagead/ads?' + urlencode(params)
result = urlfetch.fetch(url)
if result.status_code != 200:
return None
return result.content

このgoogle_adで返された値を広告を貼り付けたい位置に出力するようにすればよいです。
一応、試したら見ることはできたので動いているようです。