夜猫

ビニール袋の音で誘き寄せてパシャリ。

ごめん、この中には蒼天航路11巻しか入ってないんだよ。

ニコ厨の俺歓喜。ついげきの貼り付けでダメージは加速した。

GAEOでルート('/')へのroutingを指定したい場合。(デフォルトはWellcome#index)

# main.py
def initRoutes():
    r = router.Router()
    r.connect('/', controller='top', action='index')
    r.connect('/:controller/:action/:id')
    r.connect('/:controller/:action/:id.:format')

railsノリでこう書いても駄目。(GAEO 0.3の話)

# main.py
def initRoutes():
    r = router.Router()
    r.root(controller='top', action='index')
    r.connect('/:controller/:action/:id')
    r.connect('/:controller/:action/:id.:format')

こう書かなきゃ駄目。(railsの場合はどっちでもOKなのでちょっとハマッた)

GAEOのroutingは200行程度なのでgaeo/dispatch/router.pyを読めばすぐわかりますな。

Google App Engine の一般的質問 - Google App Engine - Google Code

SSL(HTTPS)を Google Apps ドメインの App Engine で使用できますか

Google App Engine のすべてのセキュアなトラフィックは、appspot.com ドメイン(https://your-app-id.appspot.com)から提供される必要があります。アプリケーションを Google Apps ドメイン以外から提供している場合、すべてのセキュアなトラフィックをアプリケーションの appspot ドメイン経由で転送する必要があります。

なんと。

独自ドメインでSSL使えないんだったら殆どの仕事で使えなくない?

要は、"セキュアな通信が簡単に行える環境"が無いのであれば使えないよねえ。

改善か代替案が提供される予定が無いんだとしたらやっても意味ないからどうなる予定なのか気になるなあ。

どなたかご存じでしょうかー。

2009/11/03 追記

Issue 792 - googleappengine - SSL/HTTPS Support on Google Apps domains - Project Hosting on Google Code

Per Issue #15 , SSL/HTTPS is available on *.appspot domains.

We also need it on arbitrary Google Apps domains.

とっくにAcknowledgedなIssueが上がってるんですね。

技術的にはSNI使えば楽なんじゃないかってことでこれがStartedになることはありえそうですね。(みんなでStar押そうぜ!)

現状ではEC2をproxyにして使ってる野郎どももいるみたいですが、こりゃ面倒ですな。

% dev_appserver.py .
INFO     2009-11-01 17:55:28,394 appengine_rpc.py:157] Server: appengine.google.com
INFO     2009-11-01 17:55:28,401 appcfg.py:348] Checking for updates to the SDK.
INFO     2009-11-01 17:55:28,959 appcfg.py:362] The SDK is up to date.
WARNING  2009-11-01 17:55:28,960 datastore_file_stub.py:443] Could not read datastore data from /var/folders/GS/GSaHrqM6HwiPHzeXj3bhL++++TI/-Tmp-/dev_appserver.datastore
WARNING  2009-11-01 17:55:28,966 dev_appserver.py:3370] Could not initialize images API; you are likely missing the Python "PIL" module. ImportError: No module named _imaging
INFO     2009-11-01 17:55:28,971 dev_appserver_main.py:478] Running application docs on port 8080: http://localhost:8080

GAEをローカルで立ち上げる時にいつも出てるPILが無いとかいうエラー。「なんぞこれ」ということでググったらImages系の機能は本番上にあるのでローカルでは動かないのだとか。PILというライブラリを入れればローカルでも動くらしいので入れた。

% sudo port install py25-pil
% dev_appserver.py .
INFO     2009-11-01 18:01:04,527 appengine_rpc.py:157] Server: appengine.google.com
INFO     2009-11-01 18:01:04,534 appcfg.py:348] Checking for updates to the SDK.
INFO     2009-11-01 18:01:04,906 appcfg.py:362] The SDK is up to date.
WARNING  2009-11-01 18:01:04,906 datastore_file_stub.py:443] Could not read datastore data from /var/folders/GS/GSaHrqM6HwiPHzeXj3bhL++++TI/-Tmp-/dev_appserver.datastore
INFO     2009-11-01 18:01:04,974 dev_appserver_main.py:478] Running application docs on port 8080: http://localhost:8080

ひゃっほい

しかし意味はわかるけどdatastoreが無いってのも何とかならないのかな?

多言語、多フレームワークを見ていると、Webアプリ開発に欲しい機能の本質がわかりますな。

  • Packagingシステム
  • ORM
  • Routing
  • Templateのパーツだけでなく、枠を共有する機能
  • Deployツール
  • Migration
  • TestSuite
  • Plugin機構

僕にもSyntaxの好き嫌いはありますが、まずは上記の機能をもってるかどうか。中でもMigrationは結構贅沢な部類ですな。

RubyStation

RubyStationとは

RubyにはたくさんのWebフレームワークがあります。Rails, Sinatra, Merb, Ramaze, などなど。これらを使って、Webアプリを作ったことがあるかも 知れません。では、デスクトップアプリが作れることは ご存じでしたか?

素敵です。

miyagawaさんの発表されていたmicro Web appというコンセプトを実現するプラットフォームはRubyGemsのおかげでRubyが一番手っ取り早いのではないかと思いました。

参照:Remedie Internal Talk at YAPC10 - Remedie

関連:

先週の金曜の深夜に何故かひらめいてpythonはじめたとき放置してたGAEjの方をアップしておきます。

% sudo port install jruby
% sudo gem install google-appengine
% mkdir hello-gae-sinatra-dm-haml
% cd hello-gae-sinatra-dm-haml
必要なファイル・ディレクトリを自動作成しつつ各種gemを入れます。(カレントディレクトリの.gem以下に入る)
% appcfg.rb gem install sinatra dm-appengine addressable extlib haml
% vi config.ru 
require 'appengine-rack'
AppEngine::Rack.configure_app(
  :application => 'application-id',
  :version => 1)
require 'application'
run Sinatra::Application
% vi application.rb
require 'rubygems'
require 'sinatra'
require 'dm-core'
require 'haml'
require 'sass'

DataMapper.setup(:default, "appengine://auto")

class Post
  include DataMapper::Resource

  property :id, Serial
  property :body, Text
end

helpers do
  include Rack::Utils
  alias_method :h, :escape_html
end

get '/' do
  @posts = Post.all
  haml :index
end

post '/' do
  post = Post.create(params[:post])
  redirect '/'
end

get '/stylesheet.css' do
  content_type 'text/css', :charset => 'utf-8'
  sass :stylesheet
end

DataMapperパターンはActiveRecordパターンより抽象度が高いのでadapterさえあればKVSにも対応可能。凄いですね。

% mkdir views
% vi views/index.haml 
!!! XML
!!!
%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "ja", :lang => "ja"}
  %head
    %title Guestbook using GAEj Sinatra DataMapper Haml
    %link{:href => "/stylesheet.css", :rel => "stylesheet", :type => "text/css", :media => "screen"}
  %body
    %form{:action => "/", :method => "post"}
      %input{:type => "text", :name => "post[body]"}
      %input{:type => "submit"}
    %ul
      - @posts.each do |post|
        %li
          = post.body
% vi views/stylesheet.sass
body
  :font
    :size 42px

最終的なディレクトリ構成はこんな感じ。

% tree
.
|-- WEB-INF
|   |-- appengine-generated
|   |   |-- build_status.yaml
|   |   |-- datastore-indexes-auto.xml
|   |   `-- local_db.bin
|   |-- appengine-web.xml
|   |-- lib
|   |   |-- appengine-api-1.0-sdk-1.2.5.jar
|   |   |-- appengine-jruby-0.0.4.jar
|   |   |-- appengine-jruby-rubygems-0.0.4.jar
|   |   |-- gems.jar
|   |   `-- jruby-rack-0.9.5.jar
|   `-- web.xml
|-- application.rb
|-- config.ru
|-- public
`-- views
    |-- index.haml
    `-- stylesheet.sass

必要なファイルは殆ど自動生成(or コピー)してくれてます。

% dev_appserver.rb .
Guestbook using GAEj Sinatra DataMapper Haml

日本語が文字化けるのは謎。

Start - Bottle Web Framework

Powered by Google App Engine

% mkdir hello-gae-bottle
% cd hello-gae-bottle
% cp /opt/local/lib/python2.5/site-packages/bottle.py .

Bottleは1ファイルなんですね。素敵です。

% vi hello.py
from bottle import route, default_app
from google.appengine.ext.webapp.util import run_wsgi_app

@route('/')
def index():
    return 'Hello, GAE Bottle!'

run_wsgi_app(default_app())

webappに含まれてるrun_wsgi_appを使うところ以外は普通のwsgiアプリですね。

% vi app.yaml 
application: hello-gae-bottle
version: 1
runtime: python
api_version: 1

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

CGIの時と同じ。

% dev_appserver.py .
http://localhost:8080/

やはりpythonでやると一番手っ取り早いですね。