ニコ厨の俺歓喜。ついげきの貼り付けでダメージは加速した。
キタコレ!
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 CodeSSL(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 CodePer
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とは
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 .

日本語が文字化けるのは謎。
% 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 .

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