僕は木になりたい。。。

子供のとき本気でそう思ってました。 理由は樹齢が長いから

rails

Rails2.2 で db:migrate でハマる。

Railsで、DBを作成しようとしました。
$ rake db:create
(in /home/user/railsapp)
!!! The bundled mysql.rb driver has been removed from Rails 2.2. Please install the mysql gem and try again: gem install mysql.
rake aborted!
no such file to load -- mysql

Rails 2.2.2でMySQL使うにはドライバを更新しないといけないみたいですよ・・ - てーげー探訪

Rails 2.2.2でMySQL使うにはドライバを更新しないといけないみたいですよ・・
を参考に
# cd /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7

ruby extconf.rb  --with-mysql-config=/opt/local/bin/mysql_config5

extconf.rb:1: command not found: /opt/local/bin/mysql_config5 --cflags
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/local/bin/ruby
        --with-mysql-config
ダメでした。
以前の記憶からひらめいて、mysql-develをインストール。
# yum install mysql-devel
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
 * addons: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package mysql-devel.i386 0:5.0.45-7.el5 set to be updated
---> Package mysql-devel.x86_64 0:5.0.45-7.el5 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 mysql-devel             i386       5.0.45-7.el5     base              2.4 M
 mysql-devel             x86_64     5.0.45-7.el5     base              2.4 M

Transaction Summary
=============================================================================
Install      2 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 4.8 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): mysql-devel-5.0.45 100% |=========================| 2.4 MB    00:04
(2/2): mysql-devel-5.0.45 100% |=========================| 2.4 MB    00:04
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing: mysql-devel                  ######################### [1/2]
  Installing: mysql-devel                  ######################### [2/2]

Installed: mysql-devel.i386 0:5.0.45-7.el5 mysql-devel.x86_64 0:5.0.45-7.el5
Complete!
で、configurationオプションを参考に以下のように実行
#gem install mysql -- --with-mysql-config=/usr/bin/mysql_config

Building native extensions.  This could take a while...
Successfully installed mysql-2.7
1 gem installed

そして、再度、
$ rake db:create
(in /home/user/railsapp)
今度は、オッケーでした!!。

gem install mysql にハマる5

Rails2.2.2では、mysqlがデフォルトでは使えず、

gem install mysql
をやれと言われました。

やってみる。

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

/usr/local/bin/ruby extconf.rb install mysql
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... yes
checking for mysql_query() in -lmysqlclient... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/local/bin/ruby
        --with-mysql-config
        --without-mysql-config
        --with-mysql-dir
        --without-mysql-dir
        --with-mysql-include
        --without-mysql-include=${mysql-dir}/include
        --with-mysql-lib
        --without-mysql-lib=${mysql-dir}/lib
        --with-mysqlclientlib
        --without-mysqlclientlib
        --with-mlib
        --without-mlib
        --with-mysqlclientlib
        --without-mysqlclientlib
        --with-zlib
        --without-zlib
        --with-mysqlclientlib
        --without-mysqlclientlib
        --with-socketlib
        --without-socketlib
        --with-mysqlclientlib
        --without-mysqlclientlib
        --with-nsllib
        --without-nsllib
        --with-mysqlclientlib
        --without-mysqlclientlib


Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7 for inspection.
Results logged to /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7/gem_make.out
失敗。。

どうやら、 mysql_configの場所を教えてあげないとダメらしい。

やってみる。

$ sudo gem install mysql -- --with-mysql-config=/usr/bin/mysql_config
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
        ERROR: Failed to build gem native extension.

/usr/local/bin/ruby extconf.rb install mysql -- --with-mysql-config=/usr/bin/mysql_config
checking for mysql_ssl_set()... no
checking for mysql.h... no
checking for mysql/mysql.h... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/local/bin/ruby
        --with-mysql-config


Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7 for inspection.
Results logged to /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7/gem_make.out
失敗。。

どうやら、 mysql-develが必要らしい。

インストールしてみる。

$ sudo yum install mysql-devel
Loaded plugins: refresh-packagekit
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package mysql-devel.i386 0:5.0.51a-1.fc9 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 mysql-devel             i386       5.0.51a-1.fc9    fedora            2.4 M

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 2.4 M
Is this ok [y/N]: y
Downloading Packages:
(1/1): mysql-devel-5.0.51a-1.fc9.i386.rpm                                                                                                                                                  | 2.4 MB     00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : mysql-devel                                       [1/1]

Installed: mysql-devel.i386 0:5.0.51a-1.fc9
Complete!
お、入った。

で、やってみる

sudo gem install mysql -- --with-mysql-config=/usr/bin/mysql_config
Building native extensions.  This could take a while...
Successfully installed mysql-2.7
1 gem installed

よし、OK

Rails 2.2 で RubyGemsがどうのこうのと言われて。。5

Rails2.2で、試しにアプリを起動してみたら、
Rails requires RubyGems >= 1.3.1 (you have 1.2.0). Please `gem update --system` and try again.
と、言われたので、
$ sudo gem update --system 
とすると、
Updating RubyGems
Nothing to update
と言われた。
言われたとおりにしたのに。。

解決策

こうしたら
$ sudo gem install rubygems-update
Successfully installed rubygems-update-1.3.1
1 gem installed
出来た。
意気揚々と
$script/server
Rails requires RubyGems >= 1.3.1 (you have 1.2.0). Please `gem update --system` and try again.
ええええっ
$gem --version
1.2.0
やっぱり。。
ぐぐってみた。
Rails 2.2.2 と RubyGems 1.3.1 と rubygems-update - Rubyとか Illustratorとか SFとか折紙とか
Rails 2.2.2 と RubyGems 1.3.1 と rubygems-updateComments
と、言う事で、
$sudo update_rubygems
...いろいろやって...
If `gem` was installed by a previous RubyGems installation, you may need
to remove it by hand.

$gem --version
1.3.1
$ script/server -p 4000
=> Booting Mongrel (use 'script/server webrick' to force WEBrick)
=> Rails 2.2.2 application starting on http://0.0.0.0:4000
=> Call with -d to detach
=> Ctrl-C to shutdown server
** Starting Mongrel listening at 0.0.0.0:4000
** Starting Rails with development environment...
** Rails loaded.
** Loading any Rails specific GemPlugins
** Signals ready.  TERM => stop.  USR2 => restart.  INT => stop (no restart).
** Rails signals registered.  HUP => reload (without restart).  It might not work well.
** Mongrel 1.1.5 available at 0.0.0.0:4000
** Use CTRL-C to stop.
解決しました。ありがとう!!

MySQLで知っておくと良いかもしれない事5

初めてのRuby
この本を買いました。
どうも評判が良いようで、おもわず買ってしまいました。
まだ、読んでないのですが。。。

著者のYuguiさんのブログを読んでいたら、以下のようなエントリーがあり、結構びっくりして、調べた結果をエントリーします。
知っている人にとっては当たり前なのかもしれませんが。。

Active Recordが不適当なキャッシュを返す(?)問題 @ 2006年05月 @ ratio - rational - irrational @ IDM
ActiveRecordが誤ってキャッシュか何かを返している感じ。これで数時間嵌まった。
新規レコードをsave後、find_by_id(nil)すると、初回の呼び出しに限りsaveしたオブジェクトがマッチする。
MySQLが不適当なレコードを返す問題。 @ 2006年06月 @ ratio - rational - irrational @ IDM
Active Recordから変なレコードが返ってくるのは、Active Recordの問題かと思ったらMySQLの問題だった。Active Recordよ、疑って済まなかった。
とういう事で、自分でもmysqlで上記のようなSQLを実行してみた。
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 878 to server version: 5.0.27

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> INSERT INTO tags( name ) VALUES( 'test' );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tags WHERE id IS NULL LIMIT 1;
+----+------+------------+------------+------------+
| id | name | tagkind_id | created_at | updated_at |
+----+------+------------+------------+------------+
| 21 | test |       NULL | NULL       | NULL       |
+----+------+------------+------------+------------+
1 row in set (0.00 sec)

やはり、同じ結果になります。
で、MySQLのマニュアルを調べてみると、 この動作は仕様みたい。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.1.3 比較関数と演算子
ODBC プログラムとうまく適合させるため、IS NULL を使用する場合、MySQL は次の追加機能をサポートします :
  • 一番最近の AUTO_INCREMENT 値を含む行を、その値を生成した直後に、次のフォームのステートメントを発行することによって検索することができます :
          SELECT * FROM tbl_name WHERE auto_col IS NULL
    
  • この動作は、SQL_AUTO_IS_NULL=0 を設定すると無効になります。項12.5.3. 「SET 構文」 を参照してください。
なるほどね。
set SQT_ATUO_IS_NULL=0 を発行すれば、OKなようなので、もう一度試してみました。
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 879 to server version: 5.0.27

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> set SQL_AUTO_IS_NULL=0;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO tags( name ) VALUES( 'test' );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tags WHERE id IS NULL LIMIT 1;
Empty set (0.00 sec)

おお。
でもこれって、デフォルトで0で良いんじゃないか??
と思いつつ、じゃあ、ActiveRecordはって事で調べてみると、
File: CHANGELOG
# MySQL: SET SQL_AUTO_IS_NULL=0 so ‘where id is null’ doesn‘t select the last inserted id. 6778 [Jonathan Viney, timc]
って事で、とっくに対応されてるって事ですね。
安心安心。

Rakeタスク1

rake --tasks
とやると、

task一覧が表示される。

知らんかった。。

「使えるねっと」でRails2.0.2 完全版 -- 多分 --5

今までダラダラと、単発で書きました。
  1. Rails インストール だらだらと経過を書くシリーズ
  2. CentOS 5.1でRailsを動かす
  3. CentOS 5.1でRailsを動かす - yum インストール編 -
  4. CentOS 5.1でRailsを動かす

ここらでビシッと 使えるねっとでRailsの開発環境を整える為の 手順をまとてみました。

指摘は大歓迎です!!。

・yumのインストール

# cd /usr/local/src/
# mkdir yumrpm
# cd yumrpm
# wget http://ftp.iij.ad.jp/pub/linux/centos/5.1/os/x86_64/CentOS/m2crypto-0.16-6.el5.1.x86_64.rpm
# wget http://ftp.iij.ad.jp/pub/linux/centos/5.1/os/x86_64/CentOS/python-elementtree-1.2.6-5.x86_64.rpm
# wget http://ftp.iij.ad.jp/pub/linux/centos/5.1/os/x86_64/CentOS/python-sqlite-1.1.7-1.2.1.x86_64.rpm
# wget http://ftp.iij.ad.jp/pub/linux/centos/5.1/os/x86_64/CentOS/python-urlgrabber-3.1.0-2.noarch.rpm
# wget http://ftp.iij.ad.jp/pub/linux/centos/5.1/os/x86_64/CentOS/yum-3.0.5-1.el5.centos.5.noarch.rpm
# wget http://ftp.iij.ad.jp/pub/linux/centos/5.1/os/x86_64/CentOS/rpm-4.4.2-47.el5.x86_64.rpm
# wget ftp://ftp.pbone.net/mirror/ftp.centos.org/5.1/os/x86_64/CentOS/rpm-python-4.4.2-47.el5.x86_64.rpm
# wget http://ftp.yz.yamagata-u.ac.jp/pub/linux/scientific/51/archive/obsolete/
yum-metadata-parser-1.0-8.fc6.x86_64.rpm
一気に、
# rpm -ihv *.rpm
でインストールしました。
(エラーになった場合は、rpm -ihv yum-3.0.5-1.el5.centos.5.noarch.rpm を実行して、依存関係を一つづつクリアしましょう。)

・gccのインストール

# yum install glibc glibc.i386
# yum install gcc

・openssl-develのインストール

# yum install openssl-devel

・rubyのインストール

# cd /usr/local/src/
# mkdir ruby
# cd ruby
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p111.tar.gz

# tar zxvf ruby-1.8.6-p111.tar.gz
# cd ruby-1.8.6-p111

# ./configure --prefix=/usr
# make
# make install

# ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [x86_64-linux]

・rubygemsのインストール

# cd /usr/local/src/
# mkdir rubygems
# cd rubygems
# wget http://rubyforge.org/frs/download.php/28174/rubygems-0.9.5.tgz
# tar zxvf rubygems-0.9.5.tgz
# cd rubygems-0.9.5
# ruby setup.rb
Searching $LOAD_PATH for stubs to optionally delete (may take a while)...
...done.
No library stubs found.
最後に、No library stubs found.
と言われた。でも無視。。

・readline-develのインストール

# yum install readline-devel
# cd /usr/local/src/ruby/ruby-1.8.6-p111/ext/readline/
# ruby extconf.rb
# make
# make install

・railsのインストール

# gem install rails --include-dependencies
これで基本的には完璧だと思います。

※ rubyインストール時の./configure のオプション -with-readline-dir=そんなオプションはありませんでしたので、削除しました。

Rails 初期データ投入時の auto_increment項目のクリア4

Railsのmigrate機能で初期データ登録用のマイグレーションファイルを 作りました。
でも、何度かmigrationをしているうちに、
auto_incrementで採番される値はクリアされないので、
どんどん大きくなっていってしまいます。
他のテーブルで外部参照しておりキーの値が変わっては困るのです。
で、最初は以下のようにマイグレーションファイルを作成しました。
class ImportStatusInitialData < ActiveRecord::Migration
  def self.up
    down
    Status.create( :status => 1, :name => "AA" )
    Status.create( :status => 2, :name => "BB" )
    Status.create( :status => 3, :name => "CC" )
    Status.create( :status => 4, :name => "DD" )
    Status.create( :status => 5, :name => "EE" )
    Status.create( :status => 6, :name => "FF" )
  end

  def self.down
    Status.delete_all
    execute "alter table statuses auto_increment=0"
  end
end
見て分かるとおり、ネイティブSQLを書いています。
イケてないので、メソッド化します。
RAILS_HOME/lib/schema_statements.rb
ファイルを以下のように作りました。
module ActiveRecord
  module ConnectionAdapters # :nodoc:
    module SchemaStatements
      # ID列 ( autoincrement項目 ) の 順序値を設定する。
      def set_autoincrement_number(table_name, number)
        execute "ALTER TABLE #{quote_table_name(table_name)} AUTO_INCREMENT=#{number}"
      end
    end
  end
end
で、rakeの時に上記ファイルを読み込むようにする為、
RAILS_HOME/Rakefileに以下を追記
require 'lib/schema_statements'
そしてマイグレーションファイルを変更
class ImportStatusInitialData < ActiveRecord::Migration
  def self.up
    down
    Status.create( :status => 1, :name => "AA" )
    Status.create( :status => 2, :name => "BB" )
    Status.create( :status => 3, :name => "CC" )
    Status.create( :status => 4, :name => "DD" )
    Status.create( :status => 5, :name => "EE" )
    Status.create( :status => 6, :name => "FF" )
  end

  def self.down
    Status.delete_all
    set_autoincrement_number :statuses, 0
  end
end
そして、rake db:migrateを実行!!
== 10 ImportStatusInitialData: migrating 
======================================
== 10 ImportStatusInitialData: reverting ======================================
-- set_autoincrement_number(:statuses, 0)
   -> 0.0139s
== 10 ImportStatusInitialData: reverted (0.0176s) =============================

== 10 ImportStatusInitialData: migrated (0.0388s) =============================
バッチリです。 
あ、これ mysql でしか調べてないです。
あと、処理を追加するファイルの置き場所とかここで良いのか?

Rails 2.0.2 データベース関連の rakeタスク2

2.0.2でいろいろと増えていました。
自分の備忘録もかねて以下まとめ
一覧
rake db:create:all
rake db:create
rake db:drop:all
rake db:drop
rake db:migrate
rake db:migrate:redo
rake db:migrate:reset
rake db:rollback
rake db:reset
rake db:charset
rake db:collation
rake db:version
rake db:abort_id
rake db:fixtures:load
rake db:fixtures:identify
rake db:schema:dump
rake db:schema:load
rake db:structure:dump
rake db:test:clone
rake db:test:clone_structure
rake db:purge
rake db:prepare
rake db:sessions:create
rake db:sessions:clear

Rails 2.0.2 FormHelperの話3

・やりたい事

Rails 2.0.2 で FromHelperを使ってい、1つのページに複数モデルの情報を 更新したい。

例えば1画面で、ヘッダーと明細を 一度に登録するようにイメージ。

・困った事

form_for だと、formタグに1つのモデルに対してしか書けません。

続きを読む

Rails インストール だらだらと経過を書くシリーズ4

Rails 2.02 で
script/console
をしたら、以下のエラー
/usr/lib/ruby/1.8/irb/completion.rb:10:in `require': no such file to load -- readline (LoadError)
ネタをここで発見
kano-e no memo

コンパイル跡地(この単語も上から拝借!)に移動して、

./configure --with-install-readline --prefix=/usr
make
make install
で再インストール 再度、Railsフォルダに移動し、
script/console
すると、
Loading development environment (Rails 2.0.2)
>>
よし!! 続きを読む
livedoor プロフィール
記事検索
読書をしよう
楽天市場
こちらもどうぞ
Archives
RSS
  • ライブドアブログ