Hatena::¥Ö¥í¥°(Diary)

urekat¤Î¥¹¥«¥ó¥¯Æüµ­£³ ¤³¤Î¥Ú¡¼¥¸¤ò¥¢¥ó¥Æ¥Ê¤ËÄɲà RSS¥Õ¥£¡¼¥É

2009-08-01

¢£[][][]Sinatra on GAE

New!¢Í GAE/JRuby¥°¥ë¡¼¥×¤òºî¤Ã¤Æ¤ß¤Þ¤·¤¿

Rails on GAE¤è¤ê·Ú¤¯¤Æ¸½¼ÂŪ¤«¤â¤·¤ì¤Þ¤»¤ó¤¾¡£

ActiveRecord¤òÃæ¿´¤È¤·¤¿Rails¥Õ¥ë¥¹¥¿¥Ã¥¯¤ò»È¤¨¤Ê¤¤¤Ê¤éRails¤Ç¤¢¤ëɬÍפʤ¤¤â¤ó¤Í¡£


¥»¥Ã¥È¥¢¥Ã¥×

% cd path/to/your/projects
% git clone git://github.com/jugyo/sinatra_on_gae.git PROJECT_NAME
% cd PROJECT_NAME
% dev_appserver.sh -p 9999 .

¥Ö¥é¥¦¥¶¤Ç¡Öhttp://localhost:9999/¡×¤ò³«¤¯

´ðËÜ

WEB-INF/app.rb¤òÊÔ½¸¤¹¤ë¡£

require 'rubygems'
require 'sinatra'

def h(s)
  Rack::Utils.escape_html(s)
end

get '/' do
  html = ""
  html += h(params[:msg])
  html += "<hr />"
  html += h(request.env.inspect)
  html += "<hr />"
  return html
end

http://localhost:9999/?msg=hellow ¤ò³«¤¯

DataMapper¡õdatastore-adapter¤Î¥¤¥ó¥¹¥È¡¼¥ë

GAE¤Î¥Ç¡¼¥¿¥¹¥È¥¢¤Ë¥Ç¡¼¥¿¤òÊݸ¤¹¤ë¤¿¤á¤Î¥é¥¤¥Ö¥é¥ê¤ò¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ë¡£

#!/bin/bash
gem install -i WEB-INF/gems dm-core       --no-rdoc --no-ri
gem install -i WEB-INF/gems dm-aggregates --no-rdoc --no-ri
gem install -i WEB-INF/gems dm-types      --no-rdoc --no-ri
cd WEB-INF/lib
git clone git://github.com/genki/dm-datastore-adapter.git
cd dm-datastore-adapter/lib/
jar cf ../../dm-datastore-adapter.jar .
cd ../../
rm -rf dm-datastore-adapter

DataMapper¤Î»È¤¤Êý

require 'rubygems'
require 'sinatra'

require 'dm-core'
require 'dm-aggregates'
require 'dm-types'
require 'dm-datastore-adapter/datastore-adapter'

def h(s)
  Rack::Utils.escape_html(s)
end

DataMapper.setup(:datastore,
                 :adapter => :datastore,
                 :database => 'sinatratest')

class Post
  include DataMapper::Resource
  def self.default_repository_name; :datastore end
  property :id,         Serial
  property :body,       Text
  property :created_at, DateTime

  before :save do
    self.created_at = Time.now
  end
end

get '/' do
  body = <<-HTML
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF8">
</head>
<body>
  Hello Sinatra on JRuby World!!<br />
<form method="POST">
  <input type="text" name="post[body]" />
  <input type="submit" value="post" />
</form>
Posts:<br />
HTML
  Post.all(:order => [:created_at.desc]).each do |post|
    body += "<div>id:#{post.id} body:#{h(post.body)} created_at:#{post.created_at}</div>"
  end
  body += "</body></html>"
  body
end

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

¥Ç¥×¥í¥¤

appcfg.sh update .

²¿¤«¤¬Ê¸»ú²½¤±¤¹¤ë¾ì¹ç

which dev_appserver.sh¤Çõ¤·¤Æ

/path/to/appengine-java-sdk-1.2.1/bin/dev_appserver.sh

java -Dfile.encoding=UTF-8 -ea -cp "$SDK_LIB/appengine-tools-api.jar"

¤Î¤è¤¦¤Ë¡Ö-Dfile.encoding=UTF-8¡×¤òÆþ¤ì¤¿¤é¤Ê¤ª¤Ã¤¿¡£mac¤Î¾ì¹ç¡£

ÄɲÃgem¤Î¥¤¥ó¥¹¥È¡¼¥ë

gem install -i WEB-INF/gems json --no-rdoc --no-ri

ÀÅŪ¥Õ¥¡¥¤¥ë(²èÁü,CSS,JS)

WEB-INF/appengine-web.xml¤òÊÔ½¸¤·¤Æ

  <static-files>
    <include path="/static/**.*" />
  </static-files>

¤È¤·¡¢¡Ö/static/jquery-1.3.2.min.js¡×¤òÃÖ¤¤¤Æ¤ª¤±¤Ð

¡Öhttp://localhost:9999/static/jquery-1.3.2.min.js¡×¤Ç¥¢¥¯¥»¥¹¤Ç¤­¤ë¡£

¤Ç¤­¤Ê¤«¤Ã¤¿¤³¤È

  • OAuth : gem oauth,hmac,jruby-openssh¤ò¤¤¤ì¤¿¤¬¤À¤á¤Ã¤¹¡£
  • request.host¤¬ÊÑ¡£apache¤Îmod_proxy¤òÄ̤·¤¿¾ì¹ç¤Ëproxy¤Î¥Ø¥Ã¥À¸«¤Æ¤Ê¤¤¤ó¤¸¤ã¤Í¡©

TODO


»²¹Í£Õ£Ò£Ì

http://d.hatena.ne.jp/mizincogrammer/20090707/1246941205

http://jugyo.org/blog/3388

( http://d.hatena.ne.jp/rubynews/20090421/1240332997 )

¥¹¥Ñ¥àÂкö¤Î¤¿¤á¤Î¥À¥ß¡¼¤Ç¤¹¡£¤â¤·¸«¤¨¤Æ¤â²¿¤âÆþÎϤ·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤
¥²¥¹¥È

¥³¥á¥ó¥È¤ò½ñ¤¯¤Ë¤Ï¡¢¤Ê¤¾¤Ê¤¾Ç§¾Ú¤Ë²óÅú¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

¥È¥é¥Ã¥¯¥Ð¥Ã¥¯ - http://d.hatena.ne.jp/urekat/20090801/1249055759