GAE/Pで画像をリサイズして定形のサイズにはめ込む

2011-09-26
このエントリーをはてなブックマークに追加

日本語としてややわかりにくいタイトルなのですが、つまり縦長の画像だろうが横長の画像だろうが、正方形にフレームに押し込んでしまいましょうということです。

縦横を統一のサイズにしておくことで、画像のタイリング、というか一覧表示が楽になります。これはHTML+CSSでもできそうな気がしたのですが、元画像をいじくってしまいました。

from google.appengine.api import images

_image = self.cleaned_data[‘upload_image’]
_temp = images.resize(_image.read(), 200, 200)
image_list = [(_temp, 0,0,1.0, images.CENTER_CENTER,),]

image = images.composite(image_list, 200, 200, 0)
_names = _image.name.split(‘.’)

_up = Image()
_up.image = image
_up.ext = _names[1].lower()
_up.put()

以上です。簡単ですね。

元画像はフォームからアップロードされた前提です。Djangoのフォーム使ってますので、webappとか使ってる人は読み替えていただければ。

上記の例では、resizeは縦横の長いほうが200pxになるようにリサイズしてくれます。縦横比は変わりません。これを200×200の土台の真ん中に貼りつけてやるという流れです。

それが、「images.composite()」になります。

 

Tags: ,

GAE Pythonでログ出力する方法

2011-08-25
このエントリーをはてなブックマークに追加

Python+Djangoで開発しているときはprintで出力できるからいいのですが、GAEだとPrintするとブラウザ上に表示されてしまって困ります。

あ、ハセテツはDjangoで開発するときはコンソールでrunserverしているので、printがコンソール上に表示されるんです。

import logging

logging.getLogger().setLevel(logging.DEBUG)
logging.debug(‘ログメッセージ’)

これだけですね。これでGoogleAppEngineLauncherから起動したLog Consoleに表示されます。

「logging.getLogger().setLevel(logging.DEBUG)」はなくても大丈夫です。その場合、「debug」じゃなくて「info」で出力されます。

まぁ、debugにしておけば本番運用時には出力されないってことでしょうね。

Tags: ,

GAE(Python)でYahoo!知恵袋APIを叩いてXMLをパースする

2011-08-17
このエントリーをはてなブックマークに追加

PHPでYahoo!知恵袋APIを叩く方法は先日書いたので、今度はPythonで。しかもGAEを使ってみようかと。

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

from django.http import *
from django.shortcuts import render_to_response
from google.appengine.api import urlfetch
from xml.dom import minidom
import logging
import urllib

def index(request):

_url = “http://chiebukuro.yahooapis.jp/Chiebukuro/V1/questionSearch?appid=「自分で取得するアプリID」&query=”+ urllib.quote(‘焼肉’)
_result = urlfetch.fetch(_url)
_dom = minidom.parseString(_result.content)
_list = _dom.getElementsByTagName(“Question”)

for item in _list:

logging.info(u”ID:%srn” % item.getElementsByTagName(‘Id’)[0].firstChild.data)
logging.info(u”質問:%srn” % item.getElementsByTagName(‘Content’)[0].firstChild.data)
logging.info(u”回答:%srn” % item.getElementsByTagName(‘BestAnswer’)[0].firstChild.data)

return render_to_response(‘index.html’)

まぁ、これだけなんです。あ、Django使ってます。が、その部分は関係ないですね。XMLのパースはもうちっとスマートにならないかなあ。これはモジュールを知らないだけかなぁ。

ちなみに、BestAnswerがないと、というか、ノードに値がないとエラーが出ます。ので、実際に使う場合はその判定が必要になりますね。

 

Tags: ,

GAEでwebappを使った場合とDjangoを使った場合のパフォーマンスを計測してみた

2011-07-28
このエントリーをはてなブックマークに追加

フレームワーク使うとモジュール等の読み込みでステップが増え、その分レスポンスが遅れます。これは必然です。

GoogleAppEngine(GAE)でwebappとDjangoを使った場合、どっちが速いのか。多機能になればなるほど遅くなりそうだから当然Djangoの方が遅いだろうが、どれくらいの差があるものか検証してみました。

webapp

def get(self):

path = os.path.join(os.path.dirname(__file__), ‘index.html’)
self.response.out.write(template.render(path, {‘now’:datetime.datetime.now() }))

Django

def index(request):

return render_to_response(‘index.html’, {‘now’: datetime.datetime.now() })

両方共テンプレートに現在時刻を書き出すだけ。いちいちテンプレートのパスを指定してるwebappが不利かな?それぞれ本番環境で5回ずつ計測(ApacheBench)して結果(Time per request、mean)は、

webapp

  1. 46ms
  2. 39ms
  3. 32ms
  4. 37ms
  5. 32ms

Django

  1. 39ms
  2. 33ms
  3. 32ms
  4. 32ms
  5. 44ms

大して変わんないという、驚きの結果でした。本番環境だとキャッシュが効くからフレームワークの重さなんて関係なくなるんですかね。これなら「多機能フレームワークは重いから」っていう理由でマイクロフレームワークを選択することはないかと。まぁこれだけの計測で結論出すのは尚早だとは思いますが。

webappはセッション使えないしFormもないので、そのへんの機能必要なのであればDjangoかな。まぁ速度変わらないのであれば全部Djangoでもいいんですけどね。あ、ちなみにDjangoは以前紹介したGoogle App Engine Helper for Djangoは使用しないで計測しました。

Google App Engine PythonでDjango1.2を使うまでの道のり

2011-07-22
このエントリーをはてなブックマークに追加

GoogleAppEngine(GAE)はPythonが使えるのでぜひ利用させていただくべしなのですが、ずっとDjangoありきで書いてきちゃったもんで、GAEでもDjango使いたいんです。しかも、1.2。

まぁ別にwebapp使えばいいだけの話なんですけど、やはり使い慣れたDjangoが一番ですよね。まぁDjangoじゃヘビーすぎるからもっと軽快にwebappやFlaskでいいじゃんっていうのもありますが。

Pythonは2.5、Djangoは1.2.5を使います。simplejsonも事前にインストールしておきましょう。AppEngineSDKのインストールとかはGoogleさんが詳しく説明してくれています。今回使ったSDKのバージョンは1.5.2。古いとDjango1.2は動かなかったりするようです。

Djangoでプロジェクトを作るときは「django-admin.py startproject hogehoge」ですが、今回は別の手法を取ります。「Google App Engine Helper for Django」という便利なものを使わせて頂きます。事前にダウンロードしておいてください。

  1. 例えば「guestbook」というアプリを作りたいという前提で進めます。任意の場所のguestbookというフォルダを作ります。中は空でいいです。
  2. そして、ダウンロードしてきたGoogle App Engine Helper for Djangoを解凍し、生成されたフォルダの中身をguestbookフォルダの中にコピーします。guestbookフォルダの直下にappengine_djangoフォルダがあればOK。
  3. app.yamlをテキストエディタで開き、一行目の「application: google-app-engine-django」を「application: guestbook」に書き換え、manage.pyとmain.pyの「InstallAppengineHelperForDjango()」を「InstallAppengineHelperForDjango(‘1.2’)」に書き換えます。まぁアプリケーション名と使用するDjangoのバージョンを書くだけですね。
  4. GoogleAppEngineLauncherを起動し、アプリケーションを登録します。新規じゃなくて、既存のアプリケーションを登録してください。ここではguestbookフォルダを選択するだけです。
  5. GoogleAppEngineLauncherでguestbookを選択、「Run」をクリック。左のアイコンが緑の矢印になったら起動成功です。「Browse」をクリックしてDjangoのいつもの「It workd!」が出たら成功!

長くなったので今回はここまで。アプリケーションの追加とかは後日続き書きます。というか、そっから先は普通のDjangoなので不要かな。