2013年05月10日

Python と Java 各種サービスの違い

Datastore 以外に、Google App Engine には各種のサービスが提供されています。 Google developers にある文書では左のリストの中に「Services」という項目が各言語にあります。 それを開いていただければ判りますが、Python でも Java でも基本的に同じサービスが提供されています。 しかし、その呼び出し方はそれぞれの言語で違いがあります。 ここでは代表例として Blobstore と Images を見てみましょう。

Python での Blobstore

Python では blobstore パッケージをインポートして使います。 あとはパッケージで定義された関数やクラスをごく普通に使うだけです。

from google.appengine.ext import blobstore
# key で指定された blob を取得する
blob_info = blobstore.BlobInfo.get(key)
# Blobstore に新しくアップロードする URL を生成する
blobstore.create_upload_url('/upload')

ただし、Blobstore に関しては、直接ウェブに口を設けるための blobstore_handlers というパッケージが別にあります。例えばダウンロード用のハンドラーは次のように用意します。

from google.appengine.ext.webapp import blobstore_handlers
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self, resource):
    ...

Java での Blobstore

Java では BlobstoreService というクラスのインスタンスを経由します。 関係するクラスは com.google.appengine.api.blobstore パッケージにあります。 通常、Servlet クラスの private フィールドとして

private BlobstoreService blobstore = BlobstoreServiceFactory.getBlobstoreService();

のように初期化します。(XService インスタンスを XServiceFactory.getXService() で取得するこのパターンは他のサービスでもよく使われています。) あとは、以下のように blobstore オブジェクトのメソッドを呼び出してサービスを利用します。

// リクエストで受け取ったファイルを Blobstore に放り込む
Map blobs = blobstore.getUploadedBlobs(req);
// blobKey で指定された blob をレスポンスに返す
blobstore.serve(blobKey, res);
// Blobstore に新しくアップロードする URL を生成する
blobstore.createUploadUrl("/upload")

Python での Images

写真 original_image のサムネイルを作るのは以下のようにします。

from google.appengine.api import images
img = images.Image(original_image)
img.resize(width=80, height=100)
img.im_feeling_lucky()
thumbnail = img.execute_transforms(output_encoding=images.JPEG)

Java での Images

Python と同じように写真 original_image のサムネイルを作るのは以下のようにします。 com.google.appengine.api.images にある各クラスは import 済みだと思って下さい。

ImagesService imagesService = ImagesServiceFactory.getImagesService();
Image img = ImagesServiceFactory.makeImage(original_image);
Transform resize = ImagesServiceFactory.makeResize(80, 100);
Transform lucky = ImagesServiceFactory.makeImFeelingLucky();
Transform composite = ImagesServiceFactory.makeCompositeTransform().preConcatenate(resize).concatenate(lucky);
Image thumbnail = imageService.applyTransform(composite, img, new OutputSettings(JPEG));

ここでは ServiceFactory も大活躍です。

サードパーティ

Python では 多数のサードパーティ・ライブラリーが app.yaml に libraries を追加するだけで使用できます (Third-party Libraries in Python 2.7)。 Java にはそのような仕組みは導入されていません。以下の例では import django と記述したときに django 1.4 が使えるようにしています。

app.yaml 記述例:
libraries:
-name: django
 version: "1.4"
ラベル:GAE
posted by mft at 12:48| Comment(0) | TrackBack(0) | 技術文書 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック