2009-06-27

Djangoのローカルテスト環境でGoogle map apiを利用する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google map APIを利用するには、サイトのurlが必要になります。

本番環境は、問題ないとしてローカルでテストしているときですが、Djangoの場合
http://localhost:8000
となっているわけです。

ここでテストするにはどうしたらよいかと思っていたら
普通にGoogle map APIのkeyの申請のところで
http://localhost:8000
と申請すればよいだけでした。

で、Google App EngineのDjango環境でためしに住所から緯度経度を取ってみるサンプルです。
まずsettings.pyに
MAP_KEY = 'xxxxxxxxx'
と定義しておきます。

適当なところで以下のような感じで

# -*- coding: utf-8; -*-

from django.conf import settings
import xml.etree.ElementTree as etree
from google.appengine.api import urlfetch
import urllib

def test_gmap():
url = 'http://maps.google.com/maps/geo?'
url = url + 'key=' + settings.MAP_KEY
url = url + '&sensor=false'
url = url + '&output=xml'
url = url + '&q=' + urllib.quote('千代田区丸の内1-9-1')
result = urlfetch.fetch(url)

if result.status_code == 200:
dom = etree.fromstring(result.content)
namespace ='http://earth.google.com/kml/2.0'
retunrn dom.findtext('.//{%s}coordinates' % namespace)


ちょっとはまったポイントとしては、日本語を利用するならばファイルの先頭に
# -*- coding: utf-8; -*-
を忘れずに。
manage.py startapp
で生成するviews.pyとかにはcodingが入っていないので入れ忘れていてエラーが出てちょっと考えちゃいました。

あと、xmlの解析に利用しているElementTreeについては、
http://python.matrix.jp/modules/ElementTree.html
が参考になります。

Djangoのsettings.pyに独自設定を定義する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Djangoの設定はsettings.pyにいろいろ書かれています。
なので自分が作成するアプリケーション用の設定も同じく書いておきたいわけです。
それは、
http://djangoproject.jp/doc/ja/1.0/topics/settings.html#topics-settings
にちゃんと書いてあるので、そこを見ればOKです。

要約すると
settings.pyには、普通にオリジナルの設定を他の既存のパラメータと同様な感じで定義できます。
例えば、
MY_CONF = 'test conf'
とか普通に書きます。

使うときですが、利用するファイルで
from django.conf import settings
として、
val = settings.MY_CONF
で利用できます。

2009-06-24

Djangoで携帯サイト向けサイトを作るためにuamobileを使う

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
pythonで携帯サイトを作るためには、uamobileが便利なわけです。
SOBARCOでもuamobileは使っているのですが、ちょっとバージョンが古く、今では結構変更されていました。

そして今度は、Djangoで利用できるようしてみたのでその手順です。

Djangoの環境作成は、ココをごらんください。

まずuamobileを以下から取得します。
http://pypi.python.org/pypi/uamobile/
今回は、0.2.5を利用しています。
取得したファイルを解凍してできたディレクトリにあるuamobileディレクトリをDjangoプロジェクトのルートディレクトリの直下にコピーします。

uamobileではIPyというのも使っているようなので取得します。
http://pypi.python.org/pypi/IPy
今回は、0.63を利用しています。
取得したファイルを解凍してできたディレクトリにあるIPy.pyをDjangoプロジェクトのルートディレクトリの直下にコピーします。

私の環境ではuamobile/cidr.pyの先頭をコメントアウトしないいけませんでした。
#from pkg_resources import resource_string


これで使う準備が整いました。

せっかくDjangoで利用するのでmiddlewareとしてどのページを見るときでも勝手にサイトを見ている端末を判別できるようにします。

Djangoプロジェクトの直下にcommonディレクトリを作成します。
commonディレクトリに内容が空の__init__.pyファイルを作ります。
また、以下のmiddleware.pyを作成します。
from uamobile import detect

class UserAgentMobileMiddleware(object):
def process_request(self, request):
request.device = detect(request.META)

こちらは、http://labs.unoh.net/2007/08/python_3.htmlを参考にさせていただきました。

そしてsetting.pyのMIDDLEWARE_CLASSESに
'common.middleware.UserAgentMobileMiddleware',
を追加します。

ちゃんと動いている確認します。
Dyangoプロジェクト直下で
python manage.py startapp myapp
を実行します。

そしてsetting.pyのINSTALLED_APPSにmyappを追加する。

myapp/view.pyを以下のように編集する。
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response

def index(request):
payload = dict()
payload['docomo'] = request.device.is_docomo()
payload['au'] = request.device.is_ezweb()
payload['softbank'] = request.device.is_softbank()
payload['pc'] = request.device.is_nonmobile()
return render_to_response('index.html', payload)


テンプレートも準備します。templates/index.htmlを以下のように編集します。
<html>
<head>
<title>test</title>
</head>
<body>
aaa<br>
docomo:{{docomo}}<br>
au:{{au}}<br>
sofubank:{{softbank}}<br>
pc:{{pc}}<br>
</body>
</html>


urls.pyを以下のように変更する。
urlpatterns = patterns('myapp.views',
(r'^$', 'index'),
)


ここまで準備できたらrunserverでhttp://localhost:8000/にいろんな端末でアクセスしてみることで端末判別が行われていることがわかります。
携帯サイトのテストには、FirefoxのアドオンであるFireMobileSimulatorがむちゃむちゃ便利です。

ちょっとまとめるとDjangoの環境とは別にここまで追加したものは以下のような感じです。
Djangoルート
|-uamobile
|-IPy.py
|-common
| |-__init__.py
| |-middleware.py
|-myapp
| |-views.py
|-templates
|-index.html

パワーフィルム PowerFilm 「USB + AA SOLAR CHARGER」(ソーラー・チャージャー)

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


最近、太陽光で充電するものがいろいろ出ている気がします。
そんな中、こいつはキニナルのです。

充電池を充電するものですが、そのスタイルがいい感じです。

2009-06-20

真空保温調理器 シャトルシェフ

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


余熱で調理しちゃうのです。
じっくりコトコトと同じことが出来る感じなのです。
鍋をバスタオルとかでくるんでも同じことができるのですが、
ぐるぐる巻いたりするのがちょっと面倒だし、巻いたもの鍋が安定しないしのです。
こういう専用の調理器具をあるのを知らなかったので、ちょっとキニナルのです。

ポトフとかおでんならば、朝にざっと食材と調味料をざっと仕込んで一回沸騰させてそのままこれに入れれば夜にはいい感じのものができそうな気がして、料理の手間も省ける予感。

こんな本もあるので、結構いろんなものが作れるのかもしれないです。

2009-06-19

Google App EngineのDjangoでチュートリアルをやってみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google App Engine上のDjangoは、使えるデータベースが特殊なため以下のDjangoのマニュアルにあるチュートリアルはそのままではできないようです。
http://djangoproject.jp/doc/ja/1.0/index.html

なのでGoogle App Engine上のDjangoでのチュートリアルが
http://webos-goodies.jp/archives/51337216.html
にあるので、こちらを参考にしたわけですがそのままでは動きませんでした。
私の作成した環境が
Google App EngineでDjangoを利用する
で紹介させていただいたように、Djangoは1.0.2を利用していて更にGoogle App Engine Helperを利用している環境のためだろうと思います。

というわけで私の環境で
http://webos-goodies.jp/archives/51337216.html
で紹介してあるチュートリアルを動くようするための変更点を紹介させていただきます。

まずhelperを入れているので
python manage.py startapp poll
の前まではすでに準備が出来ているので何もしません。

settings.pyのINSTALLED_APPSだけを以下のように変更します:

INSTALLED_APPS = (
'appengine_django',
'poll',
)


url.pyは、以下のように変更します。

from django.conf.urls.defaults import *

urlpatterns = patterns('poll.views',
(r'^$', 'index'),
(r'^create/$', 'create'),
(r'^poll/(?P[^\.^/]+)/$', 'poll_detail'),
(r'^poll/(?P[^\.^/]+)/results/$', 'poll_results'),
)


models.pyは紹介しているままです。

bforms.pyは、以下のようにします。
formsのimportとcleaned_dataの部分を修正しています。
このファイルは、pollディレクトリに作成します。

from django import forms
import models
from google.appengine.ext.db import djangoforms

class PollForm(djangoforms.ModelForm):
class Meta:
model = models.Poll
exclude = ['created_by']

class ChoiceForm(forms.Form):
choice = forms.CharField(max_length = 100)

def __init__(self, poll=None, *args, **kwargs):
self.poll = poll
super(ChoiceForm, self).__init__(*args, **kwargs)

def save(self):
choice = models.Choice(poll = self.poll, choice = self.cleaned_data['choice'])
choice.put()


views.pyは、
from pollango.poll import models
となっているものを
from poll import models
に直すだけです。

後は、http://webos-goodies.jp/archives/51337216.htmlに書いてある通りで動くようになりました。

friendfeedを使ってみることにしてみました

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ブログの更新とSOBARCOへの登録をTwitterに飛ばすためにTwitterfeedとかいくつか使ってみたのですが、SOBARCOの登録がいい感じでTwitterに飛ばないものが多かったのです。
そんなわけでfriendfeedがうまくいくかどうかわからないのですが使ってみることにしました。
設定は、
http://www.ideaxidea.com/archives/2009/06/twitter_via_friendfeed.html
を見れば完璧です!

2009-06-14

Google App EngineでDjangoを利用する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google App Engine for javaを勉強しようかなぁと思っていましたが、気が変わりDjangoの方を勉強してみようと思い立ったのです。

ちなみに開発環境はwindowsです。

Google App Engineには、0.96.1のDnangoが
C:\Program Files\Google\google_appengine\lib\django
にあったりして、そのまま利用できるバージョンはこのバージョンのようですが、
最新は、1.0.2のようです。
なので、この1.0.2が利用できてeclipseで開発できる環境までを構築してみました。

pythonはインストール済みなのが前提です。

最初に、Djangoをインストールします。
http://www.djangoproject.com/download/
から
Django-1.0.2-final.tar.gz
を取得して解凍します。
コマンドプロンプトで解凍したディレクトリの中の
Django-1.0.2-finalのディレクトリに移動して
python setup.py install
を実行します。

更にこのディレクトリ内のdjangoディレクトリをzip圧縮したdjango.zipを作っておきます。

Djangoが正しくインストールできたことを確認するためにコマンドプロンプトで
C:\Python25\Lib\site-packages\django\bin\django-admin.py --version
(PythonがPython25にインストールされている場合です)
を実行して
1.0.2 final
と表示されることを確認します。

Google App EngineをDjangoを利用するには、
Google App Engine Helperを利用すると便利なようなので利用します。
http://code.google.com/p/google-app-engine-django/downloads/detail?name=appengine_helper_for_django-r86.zip&can=2&q=
から
appengine_helper_for_django-r86.zip
を取得して解凍します。

Djangoでは、プロジェクトという単位が一番大きな管理単位のようです。
そのプロジェクトを作成します。
ここではC:\temp\pythonとします。
プロジェクトのためのディレクトリを作成します。
ここでは
test_django
とします。

このディレクトリに
helperのzipを解凍してできたディレクトリの中身をコピーします。
また、このディレクトリを事前に作っておいたzip圧縮して作成したdjango.zipもコピーします。

helperをwindowsで利用するには、
http://sourceforge.net/projects/pywin32
にある
pywin32-212.win32-py2.5.exe
を取得してインストールしておく必要があるようです。
(参考:http://code.google.com/intl/ja/appengine/articles/appengine_helper_for_django.html

helperが動作することを確認します。
コマンドプロンプトでDjangoプロジェクトのディレクトリに移動します。
cd C:\temp\python\test_django
Djangoのサーバーを起動します。
python manage.py runserver
そして
http://localhost:8000
にアクセスしてDjangoのページが表示されることを確認します。
また、
http://localhost:8000/_ah/admin
で、Google App Engineのadminページも利用できることも確認します。

ここまでの内容は、
http://code.google.com/intl/ja/appengine/articles/appengine_helper_for_django.html
http://mars.shehas.net/~tmatsuo/misc/appengine_helper_for_django-ja.html
が参考になります。

次にeclipseで作成したDjangoプロジェクトを開発できるようにします。
私はEclipseは3.3を利用しています。
そしてPythonが開発できるためのPydevはインストール済みのものとします。

eclipseを起動して
「ファイル」-「新規」-「プロジェクト」を選択
「Pydevプロジェクト」を選んで「次へ」
djangoプロジェクトを作成したディレクトリを
プロジェクト・コンテンツのディレクトリーに指定
(ここではC:\temp\python\test_django)
プロジェクト名を作成したdjangoプロジェクトと同じにする
(ここではtest_django)
デフォルトのsrc・・・のチェックをはずす
そして「完了」
これでeclipseでDjangoプロジェクトが見れるようになります。

次に、manage.pyでrunserverが動作するようにします。

作成されたプロジェクト名を右クリック
「プロパティ」を選択
「Pydev」-「PYTHONPATH」-「Project source folder」-「ソースフォルダの追加」
でプロジェクトのディレクトリを指定する
(ここではtest_django)

manage.pyを右クリックして
「実行」-「実行ダイアログを開く」
「Python実行」を右クリックして「新規」を選択
 「プロジェクト」にdjangoプロジェクトを選ぶ(ここではtest_django)
 「メイン・モジュール」にmanage.pyを選ぶ
「引数タブ」をクリックして
 「program argument」にrunserverを記述し
 「作業ディレクトリ」-「その他」を選択してワークスペースをクリックしてプロジェクトのルートを選択する(ここではtest_django)
そして「実行」をクリックするとhttp://localhost:8000で最初に確認したdjangoのページが見れるようになります。

ちなみに
python.exe manage.py startapp polls
のようにプロジェクトの下に新しいファイルをコマンドプロンプトで追加した場合、
eclipse上でプロジェクトを右クリックして「更新」をすると新しく作成されたファイルが見えるようになります。

こんな感じでは、まずは開発環境を作ってみました。


*最初は、0.96.1でやろうとしましたが、helperの最新版では1.0以上が必要で、更に0.96に対応しているr52では、Google App Engineのバージョンが新しいとなんかうまく使えなかったので使うのをやめました。新しいVersionが使えることに越したことはないですしね。