ラベル gae の投稿を表示しています。 すべての投稿を表示
ラベル gae の投稿を表示しています。 すべての投稿を表示

2011/09/12

Google AppEngine の新料金体系

とっても久しぶりのブログ更新です。皆さんお元気ですか?僕は元気です。


最近、AppEngine の料金体系変更によって、大幅に料金が増えるという話題をよく目にします。

気になって自分も確認してみました。
そして、多分にもれず驚いたのでメモしておきます。


AppEngine 新料金体系


AppEngine の新料金体系は、従来(現行)の CPU Time での課金から、Instance Hours での課金に変更されます。


料金の詳細は、 Google cloud services – App Engine に記載されています。


また、気になる、新料金体系ではどのように見積もられるのか?は、Admin Console の Billing History から確認することができます。



via Managing Your App's Resource Usage - Google App Engine - Google Code

今なら半額キャンペーン中!


上記のレポートの一例では、 Frontend Instance Housrs は、 $12.41 となっています。

為替レートが 1米ドル /円 = 77.089115 (ほんと円高ですね)ということなので、約956円/日。一ヶ月で 28,700円です。


でもよくみると、「Frontend Instance Hour costs reflect a 50% price reduction active until November 20th, 2011.」となっています。

11月20日までは半額キャンペーン中みたいです。

確かに Frontend Instance Hours: $0.04/Hour となっています。正規の料金は $0.08/Hour ですよね!


キャンペーンが終了したらどうなるのでしょうか?

単純に倍なので、約1,912円/日。一ヶ月で 57,400円です。


これ、みんな気づいているんでしょうか?僕は最初気がつかなかったです。

ダブルでビックリしますね。


新料金体系対策


今まで無料枠で気軽にアップしていたアプリが、突然金食い虫になったらたまりません。


App Engine アプリケーションのリソースを管理する方法 - Kay's daddy のリソースの管理方法が参考になります。


要は、ちゃんとリソース意識してアプリ作ってね、ということですが、

一番手軽な方法は、Admin Settings にある、 Max Idle Instances を 1 にする ということでしょうか。


近頃は、フリーミアムモデルからフリーの部分がなくなる、もしくは縮小される傾向が強いように思います。

手軽な環境がなくなっていくのは残念ですね。

2009/09/07

Google App Engine Oil で twitter もどき STEP 1

前回、Webアプリケーションをさくっと手軽に構築できてしまう Google App Engine (GAE) を試してみましたが、今回は、もう少しまともなアプリケーションを作ってみます。

作成する前に、つい先日 GAEO が 0.3 にバージョンアップしているようなので、早速最新のリリースを試してみましょう。

バージョンアップ作業は、環境変数のパスを新しいバージョンのものに変更しただけです。

Twitter

Twitter は、140文字以下の短いメッセージをつぶやきあうシンプルなサービスです。現在とても注目されているサービスですね。
シンプルでわかりやすいですので、今回は Twitter もどきのアプリケーションを作成してみます。

mockker

それでは、Twitter もどきの「mockker」というプロジェクトを作成します。
とりえあず今回は、データの登録ができればOKとします。また、アカウントは Google App Engine の ユーザーサービスを使用し、Google アカウントと連携させます。

gaeo.py mockker
cd mockker

まずは、つぶやきの scaffold を作成します。

gaeogen.py scaffold status create show "text:StringProperty()" "user:UserProperty()" "created_at:DateTimeProperty(auto_now_add=True)"

ルーティング

デフォルトのルートへのルーティングを、welcome/index から status/index へ変更します。

gaeo/dispatch/router.py
class Router:

  """ Handles the url routing... """


  class __impl:

    def __init__(self):
      self.__routing_root = {'controller': 'status',
                   'action': 'index'}

model

scaffold により、 application/model/status.py が作成されます。

application/model/status.p
from google.appengine.ext import db
from gaeo.model import BaseModel, SearchableBaseModel

class Status(BaseModel):
  created_at = db.DateTimeProperty(auto_now_add=True)
  text = db.StringProperty()
  user = db.UserProperty()

controller

scaffold により作成された status コントローラを次のように修正します。

application/controller/status.py
import cgi
import logging

from google.appengine.ext import db
from google.appengine.api import users

from gaeo.controller import BaseController

from model.status import Status

class StatusController(BaseController):
    def create(self):
        r = Status(
            # Uncomment all required properties here.
            # text = self.params.get('text', None),
            # created_at = self.params.get('created_at', None),
            user = users.get_current_user(),
        )
        for prop in Status.properties():
            if prop in self.params:
                setattr(r, prop, self.params.get(prop))
        r.put()
        self.flash['notice'] = u"独り言を更新したよ"
        self.redirect('/')

    def index(self):
        notice = self.flash.get('notice', '')
        self.msg = notice
        if self.current_user:
            query = Status.all().filter('user = ', self.current_user)
            query.order("-created_at")
            self.result = query.fetch(limit=10)

    def show(self):
        r = Status.get(self.params.get('id'))
        if r:
            for prop in Status.properties():
                setattr(self, prop, getattr(r, prop))
        else:
            self.redirect('/')

ユーザー認証のため、base コントローラの before_action を次のように修正します。
これにより、全てのアクションの前にユーザー認証が実行されます。

gaeo/controller/__init__.py
from google.appengine.api import users

  def before_action(self):
    self.current_user = users.get_current_user()
    if not self.current_user:
      self.signed_in = False
      self.login_url = users.create_login_url(self.request.uri)
      #self.redirect(users.create_login_url(self.request.uri))
    else:
      self.signed_in = True
      self.logout_url = users.create_logout_url(self.request.uri)
      self.nickname = self.current_user.nickname()

view

view を次のように修正します。

application/templates/base.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>{% block title %}{% endblock %}</title>
  <link rel="stylesheet" href="/css/common.css" type="text/css" media="screen" />
  {% if signed_in %}
  <link rel="stylesheet" href="/css/login.css" type="text/css" media="screen" />
  {% endif %}
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
  <script type="text/javascript" src="/js/application.js"></script>

</head>
<body>
<div id="header">
  <div id="header_inner">
  <h3><a href="/" title="Mockker">Mockker</a></h3>
  {% if signed_in %}
  <ul id="nav">
    <li><a href="{{ logout_url }}" title="Logout">Logout</a></li>
  </ul>
  {% else %}
  <ul id="nav">
    <li><a href="{{ login_url }}" title="Login">Login</a></li>
  </ul>
  {% endif %}
  </div>
</div>
<div id="content">
  <div id="content_inner">
  {% if msg %}
  <div class="flash">
    <div class="notice">
    <p>{{ msg }}</p>
    </div>
  </div>
  {% endif %}
  {% if signed_in %}
  <div id="update">
    <form method="post" action="/status/create">
    <span id="countdown">140</span>
    <label for="text">何か言いたいことは?</label>
    <textarea id="text" name="text" rows="10" cols="10"></textarea>
    <input type="submit" name="update" value="Update" />
    </form>
  </div>
  {% endif %}

  {% block content %}{% endblock %}
  </div>
</div>

<div id="footer">
  <div id="footer_inner">
  <div class="column">
    <ul>
    <li><a href="/" title="Home">Home</a></li>
    </ul>
  </div>
  </div>
</div>
</body>
</html>
application/templates/status/index.html
{% extends "../base.html" %}

{% block title %}StatusController#index{% endblock %}

{% block content %}

<div id="statuses">
{% for r in result %}

  <div id="status_{{ r.key }}" class="status">
  <div class="info">

    <p class="who_when">
    {{ r.user.nickname }}<br />
    {{ r.created_at }}
    </p>

    <p class="actions">
    </p>
  </div>

  <div class="text">
    {{ r.text }}
  </div>
  </div>
{% endfor %}
</div>


{% endblock %}

あとは、Javascript や CSS などで、見栄えを整えます。

実行

dev_appserver.py .

登録したデータをクリアしたい場合は、「--clear_datastore」オプションをつけて実行します。

dev_appserver.py --clear_datastore .

以上で、自分だけがつぶやくことができる、独り言アプリケーションの完成ですw
次回は、他人のつぶやきを表示できるようにしてみたいと思います。

2009/08/04

Google App Engine Oil

Google App Engine Oil

Webアプリケーションをさくっと手軽に構築できてしまう Google App Engine (GAE) ですが、この Google 製のエンジンに、あるオイルを入れてやると、さらに激速なマシンができるようです。

Google App Engine Oil(GAEO) というこのオイルは、Ruby on Rails を参考にして作られた App Engine 専用の レーシングスペックのエンジンオイル(Webアプリケーションフレームワーク)です。

GAEO をインストール

まず、GAEO は GAE 上で実行されますので、予め Python や、GAE SDK をインストールします。
なお、以下は Windows での解説です。

プロジェクトホーム からパッケージ(gaeo-0.2.1.zip など)をダウンロードし、好きなところに解凍します。

GAEO スクリプトを利用するために、解凍先の bin ディレクトリへのパスを、環境変数 PATH に追加します。

パスを設定しましたら、gaeo.py コマンドを実行し、下記のようになるとインストール完了です。

>gaeo.py
Usage: C:\<install dir>\bin\gaeo.py <project name>

Hello GAEO

では、早速 Hello GAEOプロジェクトを作ってみます

GAEO でのプロジェクトを作成するには、作業ディレクトリで、次のコマンドを実行します。

gaeo.py hello

hello プロジェクトを作成すると、hello ディレクトリには、下記のコンテンツが生成されます。Rails そっくりです。

  • app.yaml, favicon.ico, main.py

    app.yaml と main.py は、GAE のメイン設定ファイルです。

  • application/

    アプリケーションのコードの置き場所。基本的にこの中のファイルを編集していきます。

  • assets/

    javascript や css ファイルの置き場所。app.yaml で設定可能です。

  • gaeo/

    GAEO のコアライブラリ。GAEO のアップグレードは、このディレクトリのファイルを入れ替えるとOKです。

  • plugins/

    プラグインのインストールディレクトリです。

アプリケーションの起動と確認

次のコマンドで GAE を起動し、作成したアプリケーションの動作を確認します。
なお、コマンドはアプリケーションのルートディレクトリで実行します。

hello>dev_appserver.py .
 Running application hello on port 8080: http://localhost:8080

http://localhost:8080/ にアクセスして、「It works!!」と表示されればOKです。

なかなか刺激的な体験ですが、次はちょっとしたアプリケーションを作ってみたいと思います。

Google App Engine Oil で twitter もどき
Google App Engine Oil で twitter もどき STEP 1

参考:

2009/01/23

[GAE]Google App Engine を使ってみる Hello, webapp World!

前回は、単純な CGI を試してみましたが、今回は、Google App Engine に提供されている webapp というフレームワークを使ってみます。



Hello, webapp!


webapp は次の3つのパートからなります。



  • リクエストの処理と、レスポンスを生成する、RequestHandler クラス

  • URL に従ってリクエストをルーティングする、WSGIApplication インスタンス

  • WSGIApplication を起動する、メインルーチン


さっそく、helloworld.py を書き換えてみます。


helloworld/helloworld.py
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class MainPage(webapp.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, webapp World!')

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

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()


開発サーバを起動し、http://localhost:8080 にアクセスします。

ブラウザに Hello, webapp World! が表示されれば成功です!




参考:


2009/01/22

[GAE]Google App Engine を使ってみる Hello, World!


昨年の4月にリリースされた、Google App Engine ですが、アカウントを申請したままずっと放置していました。


「一年の計は元旦にあり」ということで、今後ますますクラウド化していく世の中に備え、Google App Engine、Amazon Web Services は押さえておかなければなりません。


そこで、まずは Google App Engine を使ってみました。



使い始めるのは簡単で、



  1. Python のインストール

  2. Google App Engine SDK のインストール


これですぐにローカルで開発が始められます。


Hello, World!


なにはともあれ、まずは Hello, World! ですね。


シンプルな Request Handler を作成

helloworld ディレクトリを作成し、その中に helloworld.py を作成します。


helloworld/helloworld.py
print 'Content-Type: text/plain'
print ''
print 'Hello, World!'

設定ファイルを作成

helloworld ディレクトリに、app.yml を作成します。


helloworld/app.yml
application: helloworld
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
script: helloworld.py

アプリケーションのテスト

dev_appserver.py を実行し、ウェブサーバを起動します。実行するアプリケーションディレクトリのパスを渡します。


google_appengine/dev_appserver.py helloworld/

開発サーバが起動したら、http://localhost:8080 にアクセスします。

ブラウザに Hello, World! が表示されれば成功です!



参考: