Info

Posts from the RubyOnRails Category

Portが3000のやつがたくさん出てきたので、Railsのデフォルトポートを変えてみる。

1. script/rails

APP_PATH = File.expand_path('../../config/application',  __FILE__)
require File.expand_path('../../config/boot',  __FILE__)

# THIS IS NEW:
require "rails/commands/server"
module Rails
  class Server
    def default_options
      super.merge({
        :Port        => 3001,
        :environment => (ENV['RAILS_ENV'] || "development").dup,
        :daemonize   => false,
        :debugger    => false,
        :pid         => File.expand_path("tmp/pids/server.pid"),
        :config      => File.expand_path("config.ru")
      })
    end
  end
end
# END OF CHANGE
require 'rails/commands'

メリット:プロジェクトごとに変更可能。
デメリット:gitなどの共有される時にpushすると他人に影響を及ぼす

2. server.rb 編集

$ pwd
/Users/dongri/.rvm/gems/ruby-1.9.3-p374/gems/railties-3.2.13/lib/rails/commands
$ vim server.rb
    def default_options
      super.merge({
        :Port        => 3001,
        :environment => (ENV['RAILS_ENV'] || "development").dup,
        :daemonize   => false,
        :debugger    => false,
        :pid         => File.expand_path("tmp/pids/server.pid"),
        :config      => File.expand_path("config.ru")
      })
    end
$

メリット:自分だけの環境なので、gitなどで共有されず、他人に影響なし
デメリット:プロジェクト共通になる。

Advertisements

前回の続き 「Mac ( Snow Leopard ) に RubyOnRails3 環境構築」でMySQL編です。

1. MySQLインストール
Mac OS X に MySQL をインストール

2. database.xml

development:
  adapter: mysql2
  database: railsdev
  host: localhost
  username: dongrikim
  password: test
  encoding: utf8

3. Gemfile

gem 'mysql2'

4. bundle install

$ bundle install

5. libmysqlclient.18.dylib

$ sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /opt/local/lib/ruby1.9/gems/1.9.1/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle

rvm 使ってた場合:

$ sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /Users/dongri/.rvm/gems/ruby-1.9.3-p374/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle 

以上で、設定完了。

エラー編:
1. エラーその1

Gem files will remain installed in /Users/dongrikim/.bundler/tmp/98945/gems/mysql2-0.2.6 for inspection.
Results logged to /Users/dongrikim/.bundler/tmp/98945/gems/mysql2-0.2.6/ext/mysql2/gem_make.out
	from /opt/local/lib/ruby1.9/1.9.1/rubygems/installer.rb:486:in `block in build_extensions'
	from /opt/local/lib/ruby1.9/1.9.1/rubygems/installer.rb:446:in `each'
	from /opt/local/lib/ruby1.9/1.9.1/rubygems/installer.rb:446:in `build_extensions'
	from /opt/local/lib/ruby1.9/1.9.1/rubygems/installer.rb:198:in `install'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/source.rb:96:in `install'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/installer.rb:55:in `block in run'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/spec_set.rb:12:in `block in each'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/spec_set.rb:12:in `each'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/spec_set.rb:12:in `each'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/installer.rb:44:in `run'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/installer.rb:8:in `install'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/cli.rb:225:in `install'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/vendor/thor/task.rb:22:in `run'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/vendor/thor/invocation.rb:118:in `invoke_task'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/vendor/thor.rb:246:in `dispatch'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/vendor/thor/base.rb:389:in `start'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/bin/bundle:13:in `'
	from /opt/local/bin/bundle:19:in `load'
	from /opt/local/bin/bundle:19:in `'

解決方法「1. MySQLインストール」 を行う。

2. エラーその2

/opt/local/lib/ruby1.9/gems/1.9.1/gems/mysql2-0.2.6/lib/mysql2.rb:7:in `require': dlopen(/opt/local/lib/ruby1.9/gems/1.9.1/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle, 9): Library not loaded: libmysqlclient.18.dylib (LoadError)
  Referenced from: /opt/local/lib/ruby1.9/gems/1.9.1/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle
  Reason: image not found - /opt/local/lib/ruby1.9/gems/1.9.1/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/mysql2-0.2.6/lib/mysql2.rb:7:in `'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/runtime.rb:68:in `require'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/runtime.rb:68:in `block (2 levels) in require'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/runtime.rb:66:in `each'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/runtime.rb:66:in `block in require'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/runtime.rb:55:in `each'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler/runtime.rb:55:in `require'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/bundler-1.0.12/lib/bundler.rb:120:in `require'
	from /Users/dongrikim/Dropbox/Developer/Rails/dislike/config/application.rb:7:in `'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/railties-3.0.3/lib/rails/commands.rb:28:in `require'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/railties-3.0.3/lib/rails/commands.rb:28:in `block in '
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/railties-3.0.3/lib/rails/commands.rb:27:in `tap'
	from /opt/local/lib/ruby1.9/gems/1.9.1/gems/railties-3.0.3/lib/rails/commands.rb:27:in `'
	from script/rails:6:in `require'
	from script/rails:6:in `'

解決方法「5. libmysqlclient.18.dylib」を行う。

Rails3インストールしたのでscaffoldを使ってみる。

$ rails new blog
      create  
      create  README
      create  Rakefile
      create  config.ru
      create  .gitignore
....
      create  tmp/sockets
      create  tmp/cache
      create  tmp/pids
      create  vendor/plugins
      create  vendor/plugins/.gitkeep
$ 
$ cd blog/

$ rails generate scaffold Post id:integer title:string body:text created:date
      invoke  active_record
      create    db/migrate/20110123154529_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/unit/post_test.rb
....
      create      app/helpers/posts_helper.rb
      invoke      test_unit
      create        test/unit/helpers/posts_helper_test.rb
      invoke  stylesheets
      create    public/stylesheets/scaffold.css
$

$ rake db:migrate
(in /Users/dongrikim/Dropbox/Developer/Rails/blog)
rake aborted!
uninitialized constant Bundler
/Users/dongrikim/Dropbox/Developer/Rails/blog/rakefile:4
(See full trace by running task with --trace)
$

エラーだ。 gem bundler インストールする。

$ sudo gem install bundler
$ bundle install

$ rake db:migrate
(in /Users/dongrikim/Dropbox/Developer/Rails/blog)
rake aborted!
uninitialized constant Bundler
/Users/dongrikim/Dropbox/Developer/Rails/blog/rakefile:4
(See full trace by running task with --trace)
$

それでも駄目だ。しょうがないのでtraceを見てみる。

$ rake db:migrate --trace
(in /Users/dongrikim/Dropbox/Developer/Rails/blog)
rake aborted!
uninitialized constant Bundler
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:2465:in `const_missing'
/Users/dongrikim/Dropbox/Developer/Rails/blog/config/boot.rb:9
......

どうも古いrakeを参照してるみたい。

$ rake --version
rake, version 0.8.3
$

$ sudo mv /usr/bin/rake /usr/bin/rake.old
$ sudo ln -s /opt/local/bin/rake1.9 /usr/bin/rake
$ rake db:migrate
(in /Users/dongrikim/Dropbox/Developer/Rails/blog)
==  CreatePosts: migrating ====================================================
-- create_table(:posts)
   -> 0.0017s
==  CreatePosts: migrated (0.0020s) ===========================================

$ rails server

rake できたっぽい!

http://localhost:3000/posts/

snowleopard   rails
 
 
1. Snow Leopardでのデフォルト環境確認

$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]
$ gem -v
1.3.1
$ rails -v
Rails 2.2.2

 
2. mysql インストール

http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg こちらから Mac OS X 10.5 (x86_64) をダウンロード。ディスクイメージを開いたら、デフォルトのオプションのまま、まず「mysql-5.1.38-osx10.5-x86_64.pkg」をインストール。次に、同じくデフォルトオプションのまま「MySQLStartupItem.pkg」をインストールし、さらに「MySQL.prefPane」をダブルクリック
 
3. mysql 操作

$ /usr/local/mysql/bin/mysql -u root -p
Enter password:
データベース作成:
mysql> create database mysqldemo default character set utf8;
ユーザー作成、権限付与:
mysql> grant all privileges on mysqldemo.* to
    testuser@localhost identified by 'password';

 
4. gem install mysql

$ sudo env ARCHFLAGS="-arch x86_64" gem install mysql --
   --with-mysql-config=/usr/local/mysql/bin/mysql_config

(以下のエラーが発生した場合はXcodeをインストールしてください)

Building native extensions. This could take a while…
ERROR: Error installing mysql:
ERROR: Failed to build gem native extension.

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb install mysql — –with-mysql-config=/usr/local/mysql/bin/mysql_config
mkmf.rb can’t find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/ruby.h

Gem files will remain installed in /Library/Ruby/Gems/1.8/gems/mysql-2.8.1 for inspection.
Results logged to /Library/Ruby/Gems/1.8/gems/mysql-2.8.1/ext/mysql_api/gem_make.out

 
5. rails プロジェクト作成

$ rails -d mysql mysqldemo

database.yml ファイル編集

development:
    adapter: mysql
    encoding: utf8
    database: mysqldemo
    pool: 5
    username: testuser
    password: password
    socket: /tmp/mysql.sock

 
6. scaffold 作成

$ script/generate scaffold user email:string name:string age:integer
$ rake db:migrate

 
7. サーバー起動して確認

$ script/server

自宅Fedora、Vista、MacOSX、会社WinXP、いずれもRubyOnRails環境を構築してみました。はじめはちょっと難しかったのですが、なれていくと20分ぐらいで終わる作業です。しかし、自宅サーバー以外のところで書いたコードをどこかのサーバーに上げない限りはインターネット上でみることはできません。それと複数端末で共有するにはSVNかCVSを利用してチェックアウト、コミットといった作業が発生します。面倒!

先月ネットでブラウザだけでRubyOnRailsを使うことができると見かけたので、検索してみたところHerokuを発見。ユーザ登録してから2週間がすぎでもまだウェディング状態でした。今日朝起きたら携帯にherokuからのメールが届いてました。ちょっと興奮。さっそくログインしてAppを使ってみました。すごい!こんなことまでできるんだ!データベース、ログ、コンソールでRailsのコメント実行、一番気に入りはエディタです。かっこういい!。まだ実際試したことはないが、プラグインも自由にインストールできるらしいです。

http://footmark.heroku.com

新年会が終わって撮った写真をFriendsと共有しようと思ってRailsで作ってみました、機能としては問題なかったが、デジカで撮った写真をそのままのサイズでアップロードして一覧に表示してしまうとメモリ不足でPCが死んじゃいます。ちなみに画像は平均1.4MB、一ページ9枚表示。

50何枚もある写真を一つずつ開いてサイズを修正するのも可能ですが、時間の無駄、絶対やりたくない!そこでRubyになんかイメージファイルを操作するライブラリがないかと探してみたところ、RMagickを発見。書いてあるソースコードみると自分がやりたいことに合ってたので早速試しようと思った。

環境:Fedora8, Ruby 1.8

# yum install ImageMagick
# yum install ImageMagick-devel
# gem install RMagick

ここでエラーです。(ERROR: could not find RMagick locally or in a repository)
gemにないの?と思ってほかの方法でインストールしようと思ったが、もしかして

# gem install rmagick
Building native extensions. This could take a while…
Successfully installed rmagick-2.2.0
1 gem installed

成功したようです。

#!/usr/bin/ruby
require ‘rubygems’
require ‘RMagick’
img = Magick::ImageList.new(‘test.jpg’)
img.resize(200, 200).write(‘new.jpg’)

お~小さい画像が出てきました!感動!
もうすこし勉強して、元画像のサイズと比例にある画像を作ること。

バージョンアップされていろいろ変わりました。今回はプロジェクトの生成と簡単にScaffoldを使ってみました。

macbook:rails king$ rails demo
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create config/initializers
create db
create doc
…..
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
macbook:rails king$ cd demo
macbook:demo king$ vi config/database.yml
# SQLite version 3.x
# gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
# adapter: sqlite3
# database: db/development.sqlite3
# timeout: 5000
adapter: mysql
database: demo
host: localhost
username: king
password: {password}

macbook:demo king$ script/generate scaffold user email:string name:string age:integer
exists app/models/
exists app/controllers/
exists app/helpers/
create app/views/users
exists app/views/layouts/
exists test/functional/
exists test/unit/
create app/views/users/index.html.erb
create app/views/users/show.html.erb
create app/views/users/new.html.erb
create app/views/users/edit.html.erb
create app/views/layouts/users.html.erb
create public/stylesheets/scaffold.css
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/user.rb
create test/unit/user_test.rb
create test/fixtures/users.yml
create db/migrate
create db/migrate/001_create_users.rb
create app/controllers/users_controller.rb
create test/functional/users_controller_test.rb
create app/helpers/users_helper.rb
route map.resources :users
macbook:demo king$ rake db:migrate
(
in /Users/king/develop/localhost/rails/demo)
== 1 CreateUsers: migrating ===================================================
— create_table(:users)
-> 0.0032s
== 1 CreateUsers: migrated (0.0033s) ==========================================

macbook:demo king$ script/server

ブラウザで確認してみる。http://0.0.0.0:3000/users/new

rails-scaffild.png

なんとMac OS X Leopard にはデフォルトでRubyOnRailsインストールされてます。バージョンは以下のようになります。

macbook:~ king$ ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]
macbook:~ king$ gem -v
0.9.4
macbook:~ king$ rails -v
Rails 1.2.6

ちょっと前にRailsのバージョンが2.0になったので1.2.6から2.0にアップしたいと思います。変更点などみると下手にバージョンアップしちゃうと1.2.6で開発したものが動かなくなる可能性があるので、ちょっと怖い。そこで元のバージョンを残してバージョンアップしたいと思います。

macbook:~ king$ sudo gem install rails –include-dependencies
Password:
Successfully installed rails-2.0.2
macbook:~ king$ rails -v
Rails 2.0.2
macbook:~ king$

意外と一瞬で完了しました。バージョン確認で2.0.2が正しくインストールされてることを確認する。前のバージョンはどうなるの?Railsはちゃんと管理してくれます。バージョンアップされた場合、上書きではなく、追加です。以下のコマンドで古いバージョンを呼び出してみます。

macbook:~ king$ rails -v
Rails 2.0.2
macbook:~ king$ rails _1.2.6_ -v
Rails 1.2.6
macbook:~ king$ rails _2.0.2_ -v
Rails 2.0.2
macbook:~ king$

引数になにも指定しなければデフォルトバージョンになり、バージョンを指定すればそのバージョンで実行します。プロジェクトの生成コマンド rails の時一回してからはscriptなどはバージョン指定が必要なくなります。プロジェクトが生成されると同時に使用バージョンが決まるので。変更したい場合は「/config/environment.rb」のRAILS_GEM_VERSION の値を実行させたいバージョンを指定すればOKです。

Windows版のRailsをインストールすると便利!名前もInstantRails、名前のとおりにこれ一つインストールするだけですぐにRailsを動かすことができます。中にはRuby、Rails、Apache、mysql、おまけにphpMyadminまで付いていました。phpMyadminとは、web上からmysqlを操作できるツールです。初心者にとってコマンドプロンプトからなじみのないsqlコマンドたたくよりはずっと効率よく開発できると思います。

しかし、 デフォルトの設定ではどうも上手く動いてくれない。エラーメッセージから見るとutf-8 が認識できない。そこでlanguageを調べてみてもちゃんとutf-8になってるし、ネット調べてみたら、なんか大文字、小文字の関係らしい。phpmyadmin/lang/japanese-utf-8.inc.php の先頭に定義してあるUTF-8 を小文字にutf-8にしたら上手く動いてました。汗