2011年05月31日

GAE/P向け統合開発環境 Eclipse PyDev。

GAE for Python で開発する場合でも、やっぱり便利なIDE(統合開発環境)を使いたいことだろう。

そこで今回は、Javaエンジニアにはお馴染みの Eclipse を GAE for Python 用にカスタマイズする方法を紹介する。

PythonやGAEのSDKは既にインストール済みという前提で書いていくので、まだの人はこちらを参考にして環境を整えてくれ。

では、始めようか。
まず、Eclipse本体をインストールする。
既にパソコンへインストールされている人は読み飛ばして結構だが、未だの人は以下から落としてくるといいだろう。
以下は Pleiades と言って便利なプラグインを予めインストールしてあるEclipseの日本語ディストリビューションだ。

日本語 Eclipse / Pleiades All in One

Eclipseのバージョンとインストール済みプラグインにより選択肢は何種類かあるが、取り敢えず俺はソコソコ軽そうでホドホドに枯れたバージョンである Eclipse 3.5.2 Galileo - Platform - Full All in One (JRE あり) をダウンロードしてみた。

さて、Eclipseのインストール(といっても解凍するだけだが)が完了したら、次はEclipse用Pythonプラグイン PyDev をインストールする。

まず、Eclipseを起動し、メニューから「ヘルプ」-「新規ソフトウェアのインストール」を選択する。

"インストール" という画面が開くので、"追加" ボタンを押す。

次の画面で、"名前" に PyDev、"ロケーション" に http://pydev.org/updates/ と入力し、OKボタンを押す。

"作業対象" から PyDev - http://pydev.org/updates/ を選択し、PyDev チェックボックスにチェックを入れ、"次へ" ボタンを押す。
以降は後は画面に従ってインストールすれば良い。


■PyDev Google App Engine Project の作成

PyDevのインストールが終わったら、早速GAE用プロジェクトを作成してみよう。

まず、メニューから「ファイル」-「新規」-「その他」を選択。
PyDev フォルダアイコン内の PyDev Google App Engine Project を選択し、"次へ" ボタンを押す。

次の画面で、「Please configure an interpreter in the related preferences before proceeding.(リストされていないインタープリターを構成するにはここをクリックしてください。)」の文字リンクをクリック、"Python インタープリター" パネルで "新規" ボタンを押す。

自分のマシンにインストールされている Python インタープリターを選択。例えば "C:\Python27\python.exe" みたいな感じで。そして、OKボタンを押す。
次の画面でもOKボタンを押すと、PyDevプロジェクト作成画面に戻るので、そこでプロジェクト名を入れて、先程選んだインタープリターを指定して、OKボタンを押す。

次の画面で Google App Engine のインストール先を指定する。例えば "C:\Program Files (x86)\Google\google_appengine" な感じで。GAE系ライブラリがずらりと出てきたらOKボタンを押す。

以上で PyDev のプロジェクトが完成したはずだ。


■Eclipse でのデバッグ方法
新しく出来た PyDev プロジェクトの src フォルダを右クリックし、「デバッグの構成」を選択。

"メイン" タブの "メイン・モジュール" の入力ボックスに自分のGAE環境の dev_appserver.py のパスを入力する。例えば、"C:\Program Files\Google\google_appengine\dev_appserver.py" みたいな感じで。

次に "引数" タブの "プログラムの引数" というテキストエリアに ${project_loc}/src と入力。
※メールの送信を行う場合は、引数に ${project_loc}/src -enable_sendmail と入力する。

最後に "インタープリター" タブの "インタープリター" の入力コンボボックスに先程設定したPythonインタープリターを選択。例えば "C:\Python27\python.exe" みたいな感じで。そして適用ボタンを押す。

以上でデバッグ実行が可能となる。


シンプルなプロジェクトなら Eclipse+PyDev を使うよりも使い慣れたテキストエディタでやる方がサクサク開発できて良い場合もあるので、そこは場面に合わせて使いわけよう。




ここはひとつポチっとよろしく。
人気ブログランキングへ


プログラミング Google App Engine
Dan Sanderson
オライリージャパン
売り上げランキング: 92707

posted by 寄り道退屈男 at 09:40 | Comment(0) | TrackBack(0) | GAE for Python

2011年05月30日

GAE/PとjQueryでJSONデータを簡単にAjax。

GAE for Python と jQeury を利用して、JSONデータのAJAX通信を行ってみる。

下のサンプルは、サーバへブログ情報パラメータ(ブログ題名とリンクURL)を渡すと、サーバ側は受け取ったブログ情報をそのままJSON形式に変換してクライアント(ブラウザ)へ返すという単純なものだ。

helloworld.py
# -*- coding: utf-8 -*-
import cgi
import os

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext.webapp import template


class MainHandler(webapp.RequestHandler):
def get(self):
template_values = {}
path = os.path.join(os.path.dirname(__file__), 'json_ajax.html')
self.response.out.write(template.render(path, template_values))


# 受け取ったリクエストパラメータ(ブログ情報)を
# そのままJSON文字列にして返すだけのリクエストハンドラ。
class OutputJSON(webapp.RequestHandler):
def get(self):
title = self.request.get('title').encode('UTF-8')
link = self.request.get('link').encode('UTF-8')
res = '{"title":"%s", "link":"%s"}' % (title, link)
self.response.out.write(cgi.escape(unicode(res, 'UTF-8')))

application = webapp.WSGIApplication([('/', MainHandler),
('/OutputJSON', OutputJSON)],
debug=True)

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()


json_ajax.html
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
<title>GAE/P+jQueryでJSONをAJAXしてみる</title>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
$(function() {

$("#btn").click(function() {
// JSONレスポンスを返すURL
url = "http://localhost:8080/OutputJSON";
// リクエストパラメータ作成
req = {
"title":$("#title").val(),
"link":$("#link").val(),
"callback":"?" /* 他ドメインにリクエストする場合には必要 */
};
// AJAX
$.getJSON(url, req, callback);
});

/* コールバック関数 */
var callback = function(json){
message = '<a href="' + json.link + '">' + json.title + '</a>';
$('#res').html(message);
};
});
</script>
</head>
<body>
<p>リクエスト</p>
<input type="text" id="title" value="俺の砂箱" /><br/>
<input type="text" id="link" value="http://sunabako.sblo.jp" /><br/>
<button id="btn">送信</button>
<p>レスポンス</p>
<div id="res"></div>
</body>
</html>


ちなみに、GAEのSDKにも便利なJSON系ライブラリ django.utils.simplejson が標準装備されていて、場合によってはそちらを利用してJSONデータの変換を行うほうが断然楽である。使い方を以下に示しておく。
from django.utils import simplejson

# JSON形式文字列をディクショナリ(連想配列)へ変換
dect = simplejson.loads(str)
# ディクショナリ(連想配列)をJSON形式文字列へ変換
str = simplejson.dumps(dect)



posted by 寄り道退屈男 at 13:38 | Comment(0) | TrackBack(0) | GAE for Python

2011年05月25日

google-code-prettifyでソースコードを美しく装飾。

以前にソースコード表示を綺麗にする SyntaxHighlighter の使い方を紹介したが、js や css 等をダウンロードして自分のサーバへアップロードして使うのはちょっとめんどくさい。

そこで今回は、少し横着をして google api(google-code-prettify + jQuery) を使って自動的且つ簡単にソースコード装飾を行ってみる。

やり方は非常に簡単で、以下のソースコードを自分のブログ内に埋め込めばいいだけだ。
<link rel="stylesheet" href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" type="text/css" media="screen" />
<script type="text/javascript" src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
prettyPrint();
});
</script>


そして以下のようにしてソースコードを表示する。
<pre class="prettyprint">
#!/usr/bin/python

print 'Hello World!'
print 'Goodbye World!'
</pre>



ここはひとつポチっとよろしく。
人気ブログランキングへ


Web制作の現場で使う jQueryデザイン入門 (WEB PROFESSIONAL)
西畑 一馬
アスキー・メディアワークス
売り上げランキング: 2341




posted by 寄り道退屈男 at 19:24 | Comment(2) | TrackBack(0) | Webデザイン

GAE+Pythonの標準モジュールだけでXML解析。簡単なRSSリーダーを作ってみる。

今回は GAE for Python でサードパーティモジュールを一切使わずにXMLをパースする方法を紹介する。

折角なので簡単なRSSリーダーでも作ってみようか。

※その前に、、、
ここでの説明は GAE for Python な開発の基本が分かっていることが前提になっているので、もしよく分かってないならこちらで予習しておこう。

では始めようか。
まず、いつもの helloworld.py を以下のように編集する。
# -*- coding: utf-8 -*-
import cgi
import os

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext.webapp import template
from google.appengine.api import urlfetch
from xml.dom import minidom


class MainHandler(webapp.RequestHandler):
def get(self):
url = 'http://sunabako.sblo.jp/index.rdf'
result = urlfetch.fetch(url)
dom = minidom.parseString(result.content)

# ブログ題名取得
blogTitle = dom.getElementsByTagName('channel')[0].getElementsByTagName('title')[0].firstChild.data

# エントリ情報(エントリ題名、URL、作成日の連想配列)のリスト作成
elems = dom.getElementsByTagName('item')
entries = []
for elem in elems:
entry = {}
entry['title'] = elem.getElementsByTagName('title')[0].firstChild.data
entry['link'] = elem.getElementsByTagName('link')[0].firstChild.data
entry['date'] = elem.getElementsByTagName('dc:date')[0].firstChild.data
entries.append(entry)

template_values = {'blogTitle':blogTitle, 'entries':entries}
path = os.path.join(os.path.dirname(__file__), 'rss_reader.html')
self.response.out.write(template.render(path, template_values))
dom.unlink()

application = webapp.WSGIApplication([('/', MainHandler)],
debug=True)

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()


そしてデザインHTMLのテンプレートは以下の通りだ。
rss_reader.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{{ blogTitle }}のRSS</title>
</head>
<body>
<ul>
{% for entry in entries %}
<li>{{ entry.date }} <a href="{{ entry.link }}" target="_blank">{{ entry.title }}</a></li>
{% endfor %}
</ul>
</body>
</html>


今回のポイントは、以下の通り。
  1. google.appengine.api.urlfetch でRSSのXMLデータ取得
  2. 取得したXMLを xml.dom.minidom で解析
  3. getElementsByTagName() で該当タグのリスト取得


今回利用したXML解析用の標準モジュール xml.dom.minidom はI/FがJavascriptに似ていて直感的に理解しやすく、尚且つ軽いので、ちょっとしたXML解析には適していると思う。

サードパーティ製モジュールを使えば、ソースコードをもっとスッキリさせることも可能なんだけど、まずは標準モジュールを使ってやる方法を理解しておくことも大切だよね。

ここはひとつポチっとよろしく。
人気ブログランキングへ


プログラミング Google App Engine
Dan Sanderson
オライリージャパン
売り上げランキング: 48590



posted by 寄り道退屈男 at 16:52 | Comment(0) | TrackBack(0) | GAE for Python

2011年05月24日

GAE+Pythonでテンプレートの共通化。

以前に GAE for Python の webapp フレームワークでテンプレートエンジンを使ったデザインの外部化を行ったわけだが、今度は更にデザインのメンテナンス性を高めるためにテンプレートの共通化を行ってみる。

まず、各画面共通のテンプレートを作成する。
ファイル名は base.html とした。
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
{% block content %}{% endblock %}
<br/>
<a href="{% block linkURL %}{% endblock %}">{% block linkName %}{% endblock %}</a>
</body>
</html>


次に、上記の共通テンプレートへ挿し込む画面(というか文字列)を定義する。
ここではそれぞれ page1.htmlpage2.html とした。それぞれのページで共通テンプレートを適用してみるということだ。

page1.html
{% extends "base.html" %}

# タイトル部分
{% block title %} Page1 - Helloworld App {% endblock %}

# コンテンツ部分
{% block content %}
This is Page1.
{% endblock %}

# リンク先URL
{% block linkURL %}/page2{% endblock %}
# リンク先名
{% block linkName %}page2へ{% endblock %}


page2.html
{% extends "base.html" %}

# タイトル部分
{% block title %} Page2 - Helloworld App {% endblock %}

# コンテンツ部分
{% block content %}
This is Page2.
{% endblock %}

# リンク先URL
{% block linkURL %}/page1{% endblock %}
# リンク先名
{% block linkName %}page1へ{% endblock %}


重要なのは先頭行の {% extends "base.html" %} という部分だ。これは共通テンプレート "base.html" を読み込むための記述である。

で、お馴染みの helloworld.py を以下のように編集する。
# -*- coding: utf-8 -*-
import cgi
import os

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext.webapp import template


class Page1(webapp.RequestHandler):
def get(self):
template_values = {}
path = os.path.join(os.path.dirname(__file__), 'page1.html')
self.response.out.write(template.render(path, template_values))

class Page2(webapp.RequestHandler):
def get(self):
template_values = {}
path = os.path.join(os.path.dirname(__file__), 'page2.html')
self.response.out.write(template.render(path, template_values))

application = webapp.WSGIApplication(
[('/page1', Page1),
('/page2', Page2)],
debug=True)

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()


開発用サーバを起動し、 http://localhost:8080/page1http://localhost:8080/page2 へアクセスしてみよう。
それぞれのページ(page1.html, page2.html)が同じテンプレート(base.html)を使い回していることが分かるはずだ。

これで画面のメンテナンス性がグッと向上するわけである。


ここはひとつポチっとよろしく。
人気ブログランキングへ


プログラミング Google App Engine
Dan Sanderson
オライリージャパン
売り上げランキング: 48590



posted by 寄り道退屈男 at 23:45 | Comment(0) | TrackBack(0) | GAE for Python