バリケンのRuby日記 RSSフィード

2009-10-23

[][][] Scanty on GAE/J  Scanty on GAE/J - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  Scanty on GAE/J - バリケンのRuby日記  Scanty on GAE/J - バリケンのRuby日記 のブックマークコメント

Rubyの軽量Webアプリケーションフレームワーク「Sinatra」で実装されたブログエンジン「Scanty」を、Google App Engine for Java上でJRubyを使って動かすための、自分用のメモだよ。

ここでの手順は、Debian GNU/Linux 5.0.3 (lenny)で行うことを想定しているよ。

Java SDKのインストール

まだJava SDKをインストールしていない人は、インストールしてね。インストールするには/etc/apt/sources.list

deb http://ftp.jp.debian.org/debian/ lenny main

となっているところにnon-freeを追加して、

deb http://ftp.jp.debian.org/debian/ lenny main non-free

そのあと「apt-get install sun-java6-jdk」と入力すればインストールできるよ。

# apt-get install sun-java6-jdk

Google App Engine for Java SDKのダウンロードと展開

まだGoogle App Engine for Java SDKを入手していない人は、ダウンロードしてね。Linuxの場合、wgetコマンドでダウンロードするのが便利だよ。まだwgetコマンドをインストールしていない場合は、

# apt-get install wget

としてインストールしてね。あと、zipファイルの展開にはunzipコマンドが必要だから、同様に

# apt-get install unzip

としてインストールしてね。wgetコマンドとunzipコマンドが使えるようになったら、次のようにコマンドを入力して展開してね。

$ cd ~
$ wget http://googleappengine.googlecode.com/files/appengine-java-sdk-1.2.6.zip
$ unzip appengine-java-sdk-1.2.6.zip

scantyディレクトリの作成

$ cd ~
$ mkdir scanty
$ cd scanty

Scantyのソースコードの入手

Scantyのソースコードを入手するにはgitコマンドが必要だよ。まだgitコマンドをインストールしていない場合は、

# apt-get install git-core

としてインストールしてね。Google App Engineにデプロイするので、WEB-INFというディレクトリ名でgit cloneするよ。

$ git clone git://github.com/adamwiggins/scanty.git WEB-INF

jruby-complete-1.4.0RC1.jarのダウンロード

$ wget http://dist.codehaus.org/jruby/1.4.0RC1/jruby-complete-1.4.0RC1.jar

Scantyを動作させるのに必要なgemのインストール

JRubygemコマンドを使って、必要となるライブラリを入手するよ。

$ mkdir WEB-INF/gems
$ java -jar jruby-complete-1.4.0RC1.jar -S gem install -i WEB-INF/gems sinatra --no-ri --no-rdoc
$ java -jar jruby-complete-1.4.0RC1.jar -S gem install -i WEB-INF/gems dm-core --version 0.9.11 --no-ri --no-rdoc
$ java -jar jruby-complete-1.4.0RC1.jar -S gem install -i WEB-INF/gems dm-aggregates --version 0.9.11 --no-ri --no-rdoc
$ java -jar jruby-complete-1.4.0RC1.jar -S gem install -i WEB-INF/gems dm-types --version 0.9.11 --no-ri --no-rdoc
$ java -jar jruby-complete-1.4.0RC1.jar -S gem install -i WEB-INF/gems dm-datastore-adapter --no-ri --no-rdoc
$ java -jar jruby-complete-1.4.0RC1.jar -S gem install -i WEB-INF/gems builder --no-ri --no-rdoc
$ rm WEB-INF/gems/cache/*

jruby-core.jarruby-stdlib.jarlibフォルダに作成

次のようにコマンドを入力して、「jruby-complete-1.4.0RC1.jar」から「jruby-core.jar」と「ruby-stdlib.jar」を作成するよ。ここでは元となる「jruby-complete-1.4.0RC1.jar」は削除しているけど、削除したくない人は他のディレクトリにコピーしておいてね。

$ mkdir tmp_unpack
$ cd tmp_unpack
$ jar xf ../jruby-complete-1.4.0RC1.jar
$ cd ..
$ mkdir jruby-core
$ mv tmp_unpack/org jruby-core
$ mv tmp_unpack/com jruby-core
$ mv tmp_unpack/jline jruby-core
$ mv tmp_unpack/jay jruby-core
$ mv tmp_unpack/jruby jruby-core
$ cd jruby-core
$ jar cf ../jruby-core.jar .
$ cd ../tmp_unpack
$ jar cf ../ruby-stdlib.jar .
$ cd ..
$ rm -rf jruby-core
$ rm -rf tmp_unpack
$ mv jruby-core.jar WEB-INF/lib
$ mv ruby-stdlib.jar WEB-INF/lib
$ rm jruby-complete-1.4.0RC1.jar

appengine-api-1.0-sdk-1.2.6.jarのコピー

次のコマンドを入力して、「appengine-api-1.0-sdk-1.2.6.jar」ファイルをコピーするよ。

$ cp ../appengine-java-sdk-1.2.6/lib/user/appengine-api-1.0-sdk-1.2.6.jar WEB-INF/lib

jruby-rack-0.9.5.jarのダウンロード

$ wget http://kenai.com/projects/jruby-rack/downloads/download/jruby-rack-0.9.5.jar
$ mv jruby-rack-0.9.5.jar WEB-INF/lib

ソースコードにパッチを適用

テキストエディタで次の内容のファイルをscanty_gae_patch.diffという名前で保存してね。

diff -cr scanty_orig/lib/post.rb scanty_gae/lib/post.rb
*** scanty_orig/lib/post.rb	2009-10-23 15:16:31.000000000 +0900
--- scanty_gae/lib/post.rb	2009-10-23 15:08:46.000000000 +0900
***************
*** 1,20 ****
  require File.dirname(__FILE__) + '/../vendor/maruku/maruku'
  
  $LOAD_PATH.unshift File.dirname(__FILE__) + '/../vendor/syntax'
  require 'syntax/convertors/html'
  
! class Post < Sequel::Model
! 	unless table_exists?
! 		set_schema do
! 			primary_key :id
! 			text :title
! 			text :body
! 			text :slug
! 			text :tags
! 			timestamp :created_at
! 		end
! 		create_table
! 	end
  
  	def url
  		d = created_at
--- 1,28 ----
+ gem "dm-core", "0.9.11"
+ 
+ require 'dm-core'
+ require 'dm-aggregates'
+ require 'dm-types'
+ require 'dm-datastore-adapter/datastore-adapter'
+ 
+ DataMapper.setup(:datastore,
+                  :adapter => :datastore,
+                  :database => 'posts')
+ 
  require File.dirname(__FILE__) + '/../vendor/maruku/maruku'
  
  $LOAD_PATH.unshift File.dirname(__FILE__) + '/../vendor/syntax'
  require 'syntax/convertors/html'
  
! class Post
!   include DataMapper::Resource
!   def self.default_repository_name; :datastore end
!   property :id,         Serial
!   property :title,      Text,     :lazy => false
!   property :body,       Text,     :lazy => false
!   property :slug,       Text,     :lazy => false
!   property :tags,       Text,     :lazy => false
!   property :created_at, DateTime
  
  	def url
  		d = created_at
diff -cr scanty_orig/main.rb scanty_gae/main.rb
*** scanty_orig/main.rb	2009-10-23 15:16:31.000000000 +0900
--- scanty_gae/main.rb	2009-10-23 15:08:48.000000000 +0900
***************
*** 1,11 ****
  require 'rubygems'
  require 'sinatra'
  
! $LOAD_PATH.unshift File.dirname(__FILE__) + '/vendor/sequel'
! require 'sequel'
  
  configure do
! 	Sequel.connect(ENV['DATABASE_URL'] || 'sqlite://blog.db')
  
  	require 'ostruct'
  	Blog = OpenStruct.new(
--- 1,11 ----
  require 'rubygems'
  require 'sinatra'
  
! #$LOAD_PATH.unshift File.dirname(__FILE__) + '/vendor/sequel'
! #require 'sequel'
  
  configure do
! 	#Sequel.connect(ENV['DATABASE_URL'] || 'sqlite://blog.db')
  
  	require 'ostruct'
  	Blog = OpenStruct.new(
***************
*** 44,55 ****
  ### Public
  
  get '/' do
! 	posts = Post.reverse_order(:created_at).limit(10)
  	erb :index, :locals => { :posts => posts }, :layout => false
  end
  
  get '/past/:year/:month/:day/:slug/' do
! 	post = Post.filter(:slug => params[:slug]).first
  	stop [ 404, "Page not found" ] unless post
  	@title = post.title
  	erb :post, :locals => { :post => post }
--- 44,56 ----
  ### Public
  
  get '/' do
! 	posts = Post.all(:limit => 10, :order => [:created_at.asc])
! #	posts = Post.all(:order => [:created_at.asc])
  	erb :index, :locals => { :posts => posts }, :layout => false
  end
  
  get '/past/:year/:month/:day/:slug/' do
! 	post = Post.first(:slug => params[:slug])
  	stop [ 404, "Page not found" ] unless post
  	@title = post.title
  	erb :post, :locals => { :post => post }
***************
*** 60,79 ****
  end
  
  get '/past' do
! 	posts = Post.reverse_order(:created_at)
  	@title = "Archive"
  	erb :archive, :locals => { :posts => posts }
  end
  
  get '/past/tags/:tag' do
  	tag = params[:tag]
! 	posts = Post.filter(:tags.like("%#{tag}%")).reverse_order(:created_at).limit(30)
  	@title = "Posts tagged #{tag}"
  	erb :tagged, :locals => { :posts => posts, :tag => tag }
  end
  
  get '/feed' do
! 	@posts = Post.reverse_order(:created_at).limit(20)
  	content_type 'application/atom+xml', :charset => 'utf-8'
  	builder :feed
  end
--- 61,80 ----
  end
  
  get '/past' do
! 	posts = Post.all(:order => [:created_at.asc])
  	@title = "Archive"
  	erb :archive, :locals => { :posts => posts }
  end
  
  get '/past/tags/:tag' do
  	tag = params[:tag]
! 	posts = Post.all(:tags => tag, :limit => 30, :order => [:created_at.asc])
  	@title = "Posts tagged #{tag}"
  	erb :tagged, :locals => { :posts => posts, :tag => tag }
  end
  
  get '/feed' do
! 	@posts = Post.all(:limit => 20, :order => [:created_at.asc])
  	content_type 'application/atom+xml', :charset => 'utf-8'
  	builder :feed
  end
***************
*** 107,120 ****
  
  get '/past/:year/:month/:day/:slug/edit' do
  	auth
! 	post = Post.filter(:slug => params[:slug]).first
  	stop [ 404, "Page not found" ] unless post
  	erb :edit, :locals => { :post => post, :url => post.url }
  end
  
  post '/past/:year/:month/:day/:slug/' do
  	auth
! 	post = Post.filter(:slug => params[:slug]).first
  	stop [ 404, "Page not found" ] unless post
  	post.title = params[:title]
  	post.tags = params[:tags]
--- 108,121 ----
  
  get '/past/:year/:month/:day/:slug/edit' do
  	auth
! 	post = Post.first(:slug => params[:slug])
  	stop [ 404, "Page not found" ] unless post
  	erb :edit, :locals => { :post => post, :url => post.url }
  end
  
  post '/past/:year/:month/:day/:slug/' do
  	auth
! 	post = Post.first(:slug => params[:slug])
  	stop [ 404, "Page not found" ] unless post
  	post.title = params[:title]
  	post.tags = params[:tags]
diff -cr scanty_orig/views/feed.builder scanty_gae/views/feed.builder
*** scanty_orig/views/feed.builder	2009-10-23 15:16:31.000000000 +0900
--- scanty_gae/views/feed.builder	2009-10-23 15:08:46.000000000 +0900
***************
*** 2,17 ****
  xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do
  	xml.title Blog.title
  	xml.id Blog.url_base
! 	xml.updated @posts.first[:created_at].iso8601 if @posts.any?
  	xml.author { xml.name Blog.author }
  
  	@posts.each do |post|
  		xml.entry do
! 			xml.title post[:title]
  			xml.link "rel" => "alternate", "href" => post.full_url
  			xml.id post.full_url
! 			xml.published post[:created_at].iso8601
! 			xml.updated post[:created_at].iso8601
  			xml.author { xml.name Blog.author }
  			xml.summary post.summary_html, "type" => "html"
  			xml.content post.body_html, "type" => "html"
--- 2,17 ----
  xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do
  	xml.title Blog.title
  	xml.id Blog.url_base
! 	xml.updated @posts.first.created_at if @posts.any?
  	xml.author { xml.name Blog.author }
  
  	@posts.each do |post|
  		xml.entry do
! 			xml.title post.title
  			xml.link "rel" => "alternate", "href" => post.full_url
  			xml.id post.full_url
! 			xml.published post.created_at
! 			xml.updated post.created_at
  			xml.author { xml.name Blog.author }
  			xml.summary post.summary_html, "type" => "html"
  			xml.content post.body_html, "type" => "html"
diff -cr scanty_orig/views/index.erb scanty_gae/views/index.erb
*** scanty_orig/views/index.erb	2009-10-23 15:16:31.000000000 +0900
--- scanty_gae/views/index.erb	2009-10-23 15:08:46.000000000 +0900
***************
*** 16,23 ****
  <div id="content">
  	<% posts.each do |post| %>
  	<div class="post">
! 		<p class="date"><%= post[:created_at].strftime("%b") %><b><%= post[:created_at].strftime("%d") %></b></p>
! 		<h2 class="title"><a href="<%= post.url %>"><%= post[:title] %></a></h2>
  		<p class="meta"><small>
  			<%= post.linked_tags %>
  			<% if Blog.disqus_shortname %>
--- 16,23 ----
  <div id="content">
  	<% posts.each do |post| %>
  	<div class="post">
! 		<p class="date"><%= post.created_at.strftime("%b") %><b><%= post.created_at.strftime("%d") %></b></p>
! 		<h2 class="title"><a href="<%= post.url %>"><%= post.title %></a></h2>
  		<p class="meta"><small>
  			<%= post.linked_tags %>
  			<% if Blog.disqus_shortname %>
diff -cr scanty_orig/views/tagged.erb scanty_gae/views/tagged.erb
*** scanty_orig/views/tagged.erb	2009-10-23 15:16:31.000000000 +0900
--- scanty_gae/views/tagged.erb	2009-10-23 15:08:46.000000000 +0900
***************
*** 1,8 ****
  <h1>Posts tagged <%= tag %></h1>
  <% posts.each do |post| %>
  <div class="post">
! 	<p class="date"><%= post[:created_at].strftime("%b") %><b><%= post[:created_at].strftime("%d") %></b></p>
! 	<h2 class="title"><a href="<%= post.url %>"><%= post[:title] %></a></h2>
  	<p class="meta"><small><%= post.linked_tags %> | <a href="<%= post.url %>#disqus_thread">comments</a></small></p>
  	<div class="entry">
  		<%= post.summary_html %>
--- 1,8 ----
  <h1>Posts tagged <%= tag %></h1>
  <% posts.each do |post| %>
  <div class="post">
! 	<p class="date"><%= post.created_at.strftime("%b") %><b><%= post.created_at.strftime("%d") %></b></p>
! 	<h2 class="title"><a href="<%= post.url %>"><%= post.title %></a></h2>
  	<p class="meta"><small><%= post.linked_tags %> | <a href="<%= post.url %>#disqus_thread">comments</a></small></p>
  	<div class="entry">
  		<%= post.summary_html %>

次のコマンドでパッチを適用してね。

$ patch -p1 -d WEB-INF < scanty_gae_patch.diff

WEB-INF/appengine-web.xmlの作成

テキストエディタで次の内容を入力して、WEB-INFディレクトリの中にappengine-web.xmlという名前で保存してね。

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <application>scanty</application>
    <version>1</version>
    <static-files>
      <include path="/public/**.*" />
    </static-files>
    <resource-files />
    <sessions-enabled>false</sessions-enabled>
    <system-properties>
      <property name="jruby.management.enabled" value="false" />
      <property name="os.arch" value="" />
      <property name="jruby.compile.mode" value="JIT"/> <!-- JIT|FORCE|OFF -->
      <property name="jruby.compile.fastest" value="true"/>
      <property name="jruby.compile.frameless" value="true"/>
      <property name="jruby.compile.positionless" value="true"/>
      <property name="jruby.compile.threadless" value="false"/>
      <property name="jruby.compile.fastops" value="false"/>
      <property name="jruby.compile.fastcase" value="false"/>
      <property name="jruby.compile.chainsize" value="500"/>
      <property name="jruby.compile.lazyHandles" value="false"/>
      <property name="jruby.compile.peephole" value="true"/>
   </system-properties>
</appengine-web-app>

WEB-INF/web.xmlの作成

テキストエディタで次の内容を入力して、WEB-INFディレクトリの中にweb.xmlという名前で保存してね。

<!DOCTYPE web-app PUBLIC
  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

  <context-param>
    <param-name>public.root</param-name>
    <param-value>/</param-value>
  </context-param>

  <context-param>
    <param-name>rackup</param-name>
    <param-value>require 'rubygems'
require 'sinatra'

root_dir = File.dirname(__FILE__)

#set :environment, :production
set :environment, :development
set :root,        root_dir
set :app_file,    File.join(root_dir, 'main.rb')
disable :run

require 'main'

run Sinatra::Application

</param-value>
  </context-param>

  <context-param>
    <param-name>jruby.min.runtimes</param-name>
    <param-value>1</param-value>
  </context-param>

  <context-param>
    <param-name>jruby.max.runtimes</param-name>
    <param-value>1</param-value>
  </context-param>

  <context-param>
    <param-name>jruby.init.serial</param-name>
    <param-value>true</param-value>
  </context-param>

  <filter>
    <filter-name>RackFilter</filter-name>
    <filter-class>org.jruby.rack.RackFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>RackFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <listener>
    <listener-class>org.jruby.rack.RackServletContextListener</listener-class>
  </listener>

</web-app>

開発用サーバの起動

次のコマンドを入力して、開発用サーバを起動してね。

$ ../appengine-java-sdk-1.2.6/bin/dev_appserver.sh .

Webブラウザで開発用サーバにアクセス

http://localhost:8080/にアクセスして、動作確認してね。デフォルトではログインパスワードは「changeme」だよ。

Google App Engineにデプロイ

「appengine-web.xml」の「application」と「version」を適切に設定して、次のコマンドを実行してね。

$ ../appengine-java-sdk-1.2.6/bin/appcfg.sh update .
トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20091023

2009-02-05

[][] Warblerでwarファイルを作る  Warblerでwarファイルを作る - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  Warblerでwarファイルを作る - バリケンのRuby日記  Warblerでwarファイルを作る - バリケンのRuby日記 のブックマークコメント

じゃあ、このあいだの日記でインストールしたWarblerを使って、このあいだ作ったWebアプリをwarファイルにしてみよう!

まずはwarファイルにしたいRailsプロジェクトのディレクトリに移動するよ。

D:\>cd rails

D:\rails>cd cookbook

D:\rails\cookbook>

つぎに、Warblerのconfigファイルを作成するよ。「warble config」と入力してね。

D:\rails\cookbook>warble config
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/gems/warbler-0.9.12/generators/warble/templa
tes/warble.rb config/warble.rb

D:\rails\cookbook>

できあがったconfig/warble.rbを適当なテキストエディタ(メモ帳だと改行コードをうまく解釈できないみたいだから、メモ帳以外のテキストエディタを使ってね)で編集してね。具体的には、このあいだインストールしたactiverecord-jdbcsqlite3-adapterjruby-opensslを指定するよ。

  # Gems to be included. You need to tell Warbler which gems your application needs
  # so that they can be packaged in the war file.
  # The Rails gems are included by default unless the vendor/rails directory is present.
  config.gems += ["activerecord-jdbcsqlite3-adapter", "jruby-openssl"]
  # config.gems << "tzinfo"

あとは「warble war」と入力すれば、必要なファイルを集めてwarファイルを作ってくれるよ。

D:\rails\cookbook>warble war
mkdir -p tmp/war/WEB-INF/gems/specifications
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/specifications/rails-2.2.2.gemspec tmp/war/W
EB-INF/gems/specifications/rails-2.2.2.gemspec
mkdir -p tmp/war/WEB-INF/gems/gems
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/specifications/rake-0.8.3.gemspec tmp/war/WE
B-INF/gems/specifications/rake-0.8.3.gemspec
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/specifications/activesupport-2.2.2.gemspec t
mp/war/WEB-INF/gems/specifications/activesupport-2.2.2.gemspec
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/specifications/activerecord-2.2.2.gemspec tm
p/war/WEB-INF/gems/specifications/activerecord-2.2.2.gemspec
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/specifications/actionpack-2.2.2.gemspec tmp/
war/WEB-INF/gems/specifications/actionpack-2.2.2.gemspec
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/specifications/actionmailer-2.2.2.gemspec tm
p/war/WEB-INF/gems/specifications/actionmailer-2.2.2.gemspec
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/specifications/activeresource-2.2.2.gemspec
tmp/war/WEB-INF/gems/specifications/activeresource-2.2.2.gemspec
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/specifications/activerecord-jdbcsqlite3-adap
ter-0.9.gemspec tmp/war/WEB-INF/gems/specifications/activerecord-jdbcsqlite3-ada
pter-0.9.gemspec
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/specifications/activerecord-jdbc-adapter-0.9
.gemspec tmp/war/WEB-INF/gems/specifications/activerecord-jdbc-adapter-0.9.gemsp
ec
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/specifications/jdbc-sqlite3-3.5.8.gemspec tm
p/war/WEB-INF/gems/specifications/jdbc-sqlite3-3.5.8.gemspec
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/specifications/jruby-openssl-0.3.gemspec tmp
/war/WEB-INF/gems/specifications/jruby-openssl-0.3.gemspec
mkdir -p tmp/war/WEB-INF/app
mkdir -p tmp/war/WEB-INF/config
mkdir -p tmp/war/WEB-INF/lib
mkdir -p tmp/war/WEB-INF/log
mkdir -p tmp/war/WEB-INF/vendor
mkdir -p tmp/war/WEB-INF/tmp
mkdir -p tmp/war/WEB-INF/app/controllers
mkdir -p tmp/war/WEB-INF/app/helpers
mkdir -p tmp/war/WEB-INF/app/models
mkdir -p tmp/war/WEB-INF/app/views
cp app/controllers/application.rb tmp/war/WEB-INF/app/controllers/application.rb

cp app/controllers/recipes_controller.rb tmp/war/WEB-INF/app/controllers/recipes
_controller.rb
cp app/helpers/application_helper.rb tmp/war/WEB-INF/app/helpers/application_hel
per.rb
cp app/helpers/recipes_helper.rb tmp/war/WEB-INF/app/helpers/recipes_helper.rb
cp app/models/recipe.rb tmp/war/WEB-INF/app/models/recipe.rb
mkdir -p tmp/war/WEB-INF/app/views/layouts
mkdir -p tmp/war/WEB-INF/app/views/recipes
cp app/views/layouts/recipes.html.erb tmp/war/WEB-INF/app/views/layouts/recipes.
html.erb
cp app/views/recipes/edit.html.erb tmp/war/WEB-INF/app/views/recipes/edit.html.e
rb
cp app/views/recipes/index.html.erb tmp/war/WEB-INF/app/views/recipes/index.html
.erb
cp app/views/recipes/new.html.erb tmp/war/WEB-INF/app/views/recipes/new.html.erb

cp app/views/recipes/show.html.erb tmp/war/WEB-INF/app/views/recipes/show.html.e
rb
cp config/boot.rb tmp/war/WEB-INF/config/boot.rb
cp config/database.yml tmp/war/WEB-INF/config/database.yml
cp config/environment.rb tmp/war/WEB-INF/config/environment.rb
mkdir -p tmp/war/WEB-INF/config/environments
mkdir -p tmp/war/WEB-INF/config/initializers
mkdir -p tmp/war/WEB-INF/config/locales
cp config/routes.rb tmp/war/WEB-INF/config/routes.rb
cp config/warble.rb tmp/war/WEB-INF/config/warble.rb
cp config/environments/development.rb tmp/war/WEB-INF/config/environments/develo
pment.rb
cp config/environments/production.rb tmp/war/WEB-INF/config/environments/product
ion.rb
cp config/environments/test.rb tmp/war/WEB-INF/config/environments/test.rb
cp config/initializers/inflections.rb tmp/war/WEB-INF/config/initializers/inflec
tions.rb
cp config/initializers/mime_types.rb tmp/war/WEB-INF/config/initializers/mime_ty
pes.rb
cp config/initializers/new_rails_defaults.rb tmp/war/WEB-INF/config/initializers
/new_rails_defaults.rb
cp config/locales/en.yml tmp/war/WEB-INF/config/locales/en.yml
mkdir -p tmp/war/WEB-INF/lib/tasks
mkdir -p tmp/war/WEB-INF/vendor/plugins
mkdir -p tmp/war/WEB-INF/tmp/cache
mkdir -p tmp/war/WEB-INF/tmp/pids
mkdir -p tmp/war/WEB-INF/tmp/sessions
mkdir -p tmp/war/WEB-INF/tmp/sockets
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/gems/warbler-0.9.12/lib/jruby-complete-1.1.6
.jar tmp/war/WEB-INF/lib/jruby-complete-1.1.6.jar
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/gems/warbler-0.9.12/lib/jruby-complete-1.1.6
.jar tmp/war/WEB-INF/lib/jruby-complete-1.1.6.jar
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/gems/warbler-0.9.12/lib/jruby-rack-0.9.3.jar
 tmp/war/WEB-INF/lib/jruby-rack-0.9.3.jar
cp D:/jruby-1.1.6/lib/ruby/gems/1.8/gems/warbler-0.9.12/lib/jruby-rack-0.9.3.jar
 tmp/war/WEB-INF/lib/jruby-rack-0.9.3.jar
cp public/404.html tmp/war/404.html
cp public/422.html tmp/war/422.html
cp public/500.html tmp/war/500.html
cp public/dispatch.cgi tmp/war/dispatch.cgi
cp public/dispatch.fcgi tmp/war/dispatch.fcgi
cp public/dispatch.rb tmp/war/dispatch.rb
cp public/favicon.ico tmp/war/favicon.ico
mkdir -p tmp/war/images
cp public/index.html tmp/war/index.html
mkdir -p tmp/war/javascripts
cp public/robots.txt tmp/war/robots.txt
mkdir -p tmp/war/stylesheets
cp public/images/rails.png tmp/war/images/rails.png
cp public/javascripts/application.js tmp/war/javascripts/application.js
cp public/javascripts/controls.js tmp/war/javascripts/controls.js
cp public/javascripts/dragdrop.js tmp/war/javascripts/dragdrop.js
cp public/javascripts/effects.js tmp/war/javascripts/effects.js
cp public/javascripts/prototype.js tmp/war/javascripts/prototype.js
cp public/stylesheets/scaffold.css tmp/war/stylesheets/scaffold.css
mkdir -p tmp/war/WEB-INF

D:\rails\cookbook>

プロジェクトのディレクトリに「cookbook.war」というファイルができているはずだよ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20090205

2009-02-01

[][] JRubyRuby on Rails  JRubyでRuby on Rails - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  JRubyでRuby on Rails - バリケンのRuby日記  JRubyでRuby on Rails - バリケンのRuby日記 のブックマークコメント

昨日の日記でせっかくRuby on Railsをセットアップしたから、チュートリアルを参考に簡単なWebアプリ(クックブック)を作ってみるよ。

D:\Users\muscovyduck>cd \

D:\>mkdir rails

D:\>cd rails

D:\rails>rails cookbook
      create
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      create  config/environments
      create  config/initializers
      create  config/locales
      create  db
      create  doc
      create  lib
      create  lib/tasks
      create  log
      create  public/images
      create  public/javascripts
      create  public/stylesheets
      create  script/performance
      create  script/process
      create  test/fixtures
      create  test/functional
      create  test/integration
      create  test/performance
      create  test/unit
      create  vendor
      create  vendor/plugins
      create  tmp/sessions
      create  tmp/sockets
      create  tmp/cache
      create  tmp/pids
      create  Rakefile
      create  README
      create  app/controllers/application.rb
      create  app/helpers/application_helper.rb
      create  test/test_helper.rb
      create  test/performance/browsing_test.rb
      create  config/database.yml
      create  config/routes.rb
      create  config/initializers/inflections.rb
      create  config/initializers/mime_types.rb
      create  config/initializers/new_rails_defaults.rb
      create  config/locales/en.yml
      create  config/boot.rb
      create  config/environment.rb
      create  config/environments/production.rb
      create  config/environments/development.rb
      create  config/environments/test.rb
      create  script/about
      create  script/console
      create  script/dbconsole
      create  script/destroy
      create  script/generate
      create  script/performance/benchmarker
      create  script/performance/profiler
      create  script/performance/request
      create  script/process/reaper
      create  script/process/spawner
      create  script/process/inspector
      create  script/runner
      create  script/server
      create  script/plugin
      create  public/dispatch.rb
      create  public/dispatch.cgi
      create  public/dispatch.fcgi
      create  public/404.html
      create  public/422.html
      create  public/500.html
      create  public/index.html
      create  public/favicon.ico
      create  public/robots.txt
      create  public/images/rails.png
      create  public/javascripts/prototype.js
      create  public/javascripts/effects.js
      create  public/javascripts/dragdrop.js
      create  public/javascripts/controls.js
      create  public/javascripts/application.js
      create  doc/README_FOR_APP
      create  log/server.log
      create  log/production.log
      create  log/development.log
      create  log/test.log

D:\rails>cd cookbook

ここで、config/database.ymlを適当なテキストエディタ(メモ帳だと改行コードをうまく解釈できないみたいだから、メモ帳以外のテキストエディタを使ってね)で編集してね。具体的には「adapter: sqlite3」となっているところ(3ヶ所)を「adapter: jdbcsqlite3」に変更してね。以下のような内容になるよ。

# SQLite version 3.x
#   gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
  adapter: jdbcsqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: jdbcsqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

production:
  adapter: jdbcsqlite3
  database: db/production.sqlite3
  pool: 5
  timeout: 5000

じゃあ、続けるよ。

D:\rails\cookbook>jruby script/generate scaffold Recipe title:string chef:string
 instructions:text
      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/recipes
      exists  app/views/layouts/
      exists  test/functional/
      exists  test/unit/
      exists  public/stylesheets/
      create  app/views/recipes/index.html.erb
      create  app/views/recipes/show.html.erb
      create  app/views/recipes/new.html.erb
      create  app/views/recipes/edit.html.erb
      create  app/views/layouts/recipes.html.erb
      create  public/stylesheets/scaffold.css
      create  app/controllers/recipes_controller.rb
      create  test/functional/recipes_controller_test.rb
      create  app/helpers/recipes_helper.rb
       route  map.resources :recipes
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/recipe.rb
      create    test/unit/recipe_test.rb
      create    test/fixtures/recipes.yml
      create    db/migrate
      create    db/migrate/20090131143104_create_recipes.rb

D:\rails\cookbook>rake db:migrate
(in D:/rails/cookbook)
==  CreateRecipes: migrating ==================================================
-- create_table(:recipes)
   -> 0.3493s
   -> 0 rows
==  CreateRecipes: migrated (0.3670s) =========================================

D:\rails\cookbook> jruby script/server
=> Booting WEBrick...
=> Rails 2.2.2 application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2009-01-31 23:36:51] INFO  WEBrick 1.3.1
[2009-01-31 23:36:51] INFO  ruby 1.8.6 (2008-12-17) [java]
[2009-01-31 23:36:51] INFO  WEBrick::HTTPServer#start: pid=2452 port=3000

チュートリアルルのとおり、Webブラウザでhttp://127.0.0.1:3000/recipes/newにアクセスして、レシピを追加してみてね。

まだじっくりと使い込んだわけじゃないけど、JRubyでもとりあえずRuby on Railsが動くんだねえ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20090201

2009-01-31

[] JRubyRubyGems  JRubyでRubyGems - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  JRubyでRubyGems - バリケンのRuby日記  JRubyでRubyGems - バリケンのRuby日記 のブックマークコメント

RubyにはRubyGemsというパッケージマネジメントシステムがあって、いろいろなRubyのライブラリをパッケージとしてインターネットから取ってくる機能があるんだけど、JRubyでもちゃんとRubyGemsを利用することができるよ。RubyGemsについては、るびまの記事を参考にしてね。

RubyGemsを利用するには、gemコマンドを使うよ。このあいだインストールしたJRuby 1.1.6には、RubyGems 1.3.1が付属しているみたい。

D:\>gem -v
1.3.1

D:\>

じゃあ、ためしにJRubygemコマンドを利用してRuby on Railsをインストールしてみよう!コマンドラインで「gem install rails」と入力してね。

D:\>gem install rails
JRuby limited openssl loaded. gem install jruby-openssl for full support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
Successfully installed activesupport-2.2.2
Successfully installed activerecord-2.2.2
Successfully installed actionpack-2.2.2
Successfully installed actionmailer-2.2.2
Successfully installed activeresource-2.2.2
Successfully installed rails-2.2.2
6 gems installed
Installing ri documentation for activesupport-2.2.2...
Installing ri documentation for activerecord-2.2.2...
Installing ri documentation for actionpack-2.2.2...
Installing ri documentation for actionmailer-2.2.2...
Installing ri documentation for activeresource-2.2.2...
Installing RDoc documentation for activesupport-2.2.2...
Installing RDoc documentation for activerecord-2.2.2...
Installing RDoc documentation for actionpack-2.2.2...
Installing RDoc documentation for actionmailer-2.2.2...
Installing RDoc documentation for activeresource-2.2.2...

D:\>

あれ、最初のほうで「jruby-openssl」というパッケージもインストールするように言われたから、入れてみるよ。コマンドラインで「gem install jruby-openssl」と入力してね。

D:\>gem instal jruby-openssl
JRuby limited openssl loaded. gem install jruby-openssl for full support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
Successfully installed jruby-openssl-0.3
1 gem installed
Installing ri documentation for jruby-openssl-0.3...
Installing RDoc documentation for jruby-openssl-0.3...

D:\>

Ruby on Railsを利用するにはRakeも必要だから、インストールするよ。インストールはコマンドラインで「gem install rake」と入力してね。

D:\>gem install rake
Successfully installed rake-0.8.3
1 gem installed
Installing ri documentation for rake-0.8.3...
Installing RDoc documentation for rake-0.8.3...

D:\>

あとはRuby on Railsで利用するデータベースアダプタをインストールするよ。JRubyで利用するデータベースアダプタは、JDBCと呼ばれるJavaのアダプタ経由で利用するみたいだよ。たとえばSQLite3を利用する場合は、jdbc-sqlite3アダプタと、それをActiveRecordから利用するactiverecord-jdbcsqlite3-adapterが必要になるみたい。

インストールはコマンドラインで「gem install activerecord-jdbcsqlite3-adapter」と入力してね。依存関係のあるjdbc-sqlite3もいっしょにインストールされるよ。

D:\>gem install activerecord-jdbcsqlite3-adapter
Successfully installed jdbc-sqlite3-3.5.8
Successfully installed activerecord-jdbcsqlite3-adapter-0.9
2 gems installed
Installing ri documentation for jdbc-sqlite3-3.5.8...
Installing ri documentation for activerecord-jdbcsqlite3-adapter-0.9...
Installing RDoc documentation for jdbc-sqlite3-3.5.8...
Installing RDoc documentation for activerecord-jdbcsqlite3-adapter-0.9...

D:\>

もちろんSQLite3自体もインストールしないとね。Windowsの場合は、SQLite3のダウンロードサイトからsqlitedll-3_6_10.zipをダウンロードして、アーカイブファイルの中にあるsqlite3.dllを\Windows\System32フォルダにコピーすればインストール完了だよ。

2008-03-01

[][] OneBody  OneBody - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  OneBody - バリケンのRuby日記  OneBody - バリケンのRuby日記 のブックマークコメント

Ruby on Railsで実装された「キリスト教徒のためのSNSOneBodyを試してみたよ。どうして「キリスト教徒のため」に特化しているのかはよくわからないけど、別にキリスト教徒じゃなくても使っていいんだよね?

インストールにはRMagickが必要みたいだから、まだRMagickをインストールしていない人は先にインストールしておいてね。

$ gem install rmagick

RMagickのインストールにはImageMagickを先にインストールしておく必要があるから、注意してね。

OneBody自体はgemのパッケージになっているから、gem install onebodyでインストールできるよ。

$ gem install onebody

そうするとonebodyコマンドが使えるようになっているはずだよ。このコマンドは、指定したディレクトリにOneBodyアプリをセットアップしてくれるよ。セットアップのときにデータベースを聞かれるから、指定してね。ここではSQLite3を使うようにしているよ。

$ onebody /home/your_home/onebody
Creating a new instance of OneBody at /home/your_home/onebody
16 of 17 copied
Done copying files.

Setting up the database configuration...
Choose your database (sqlite3 or mysql) [sqlite3]:

Now, cd to your instance directory and run the following command: rake init
$

あとはセットアップしたディレクトリに移動して、rake initすればデータベースを作ってくれるよ。

$ cd onebody
$ rake init

管理者アカウントを作るように聞かれるから、ここで作成しておくよ。

データベースができたら、起動してみよう!起動はruby script/serverでいいみたい。

$ ruby script/server

Webブラウザでhttp://localhost:3000/にアクセスしてね。

あと、現在gemでインストールされるバージョン(onebody-0.3.0)だと自分の写真をアップロードするときに不具合があるみたい。まずは写真アップロード用のディレクトリを作るよ。

$ mkdir db/photos
$ mkdir db/photos/people

次にコントローラーを修正するよ。

$ vi app/controllers/people_controller.rb

修正箇所は、get_personメソッドの定義部分で

      @person = Person.find_by_id(params[:id])

となっているところを、

      @person = Person.find_by_id(params[:id].to_i)

に変更すればいいみたい。

「自分の写真」以外の部分でも、写真をアップロードするところで引っかかるみたい(たとえばグループ用の写真とか)。そのときは同じようにディレクトリの作成とかコントローラーの修正をして対処してね。

最新のバージョンではこの不具合は直っているみたいだから、gemでインストールしないでSubversionで最新のソースを取ってくるほうがいいかも。

$ svn export svn://beonebody.org/onebody/trunk onebody

自分でSNSを作ってみたい人には、けっこうソースコードとか参考になるんじゃないかな?

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20080301