autoloadで自動読み込みされないファイルをユーザアクセス毎に再読み込みする

今回はRuby on Railsについてメモ。

autoloadで自動読み込みされないファイルRailsの場合、クラス定義と定義が記述されたファイルの名前が対応づいてないとautoloadで自動読み込みされません(たぶん)。例えば、FooBarというクラスの定義はfoo_bar.rbというファイルの中で行われてないとautoloadにされません。をcontrollerの中などでrequireを使って読み込んだ場合、そのファイルはdevelopmentモード時でもユーザアクセス毎に再読み込みされません。そのため、ファイルを編集してもwebサーバを再起動しないと変更が反映されないので、デバッグがやりづらくて困ってました。

解決策がないかと思って、ググってみたところ、以下のページに解決策が書いてありました。
http://www.pistolfly.jp/weblog/2007/06/require-dependency.html

requireじゃなくて、require_dependencyでファイル読み込みすれば良いということでした。
require_dependencyの挙動については、上のリンク先を参照してください。
この辺り(autoload周辺)って、Ruby on Rails公式なドキュメントが見当たらないですねえ。・・・実装を読めってことか。

以下、問題のコード例と解決方法。(ruby 1.8.5, rails 2.3.3, WEBrick 1.3.1で実験しました。)

ファイル読み込みの対象となるファイルを用意します。

<rails_project>/lib/hoge_fuga.rb
[RUBY]
class Hoge
def hoge
return “abc”
end
end
[/RUBY]

上のファイルを読み込むcontrollerを用意します。
このとき、requireの代わりにrequire_dependencyでファイルを読み込みます。

<rails_project>/app/controllers/test_controller.rb
[RUBY]
#require ‘hoge_fuga’
require_dependency ‘hoge_fuga’

class TestController < ApplicationController def hoge a = Hoge.new render(:text => a.hoge)
end
end
[/RUBY]

んで、Webサーバを起動。

$ cd <rails_project>
$ ruby script/server

で、ブラウザからtest/hogeにアクセスすると、ブラウザ上にabcが出力されます。
この状況で、<rails_project>/lib/hoge_fuga.rbを以下のように書き換えてみます。
[RUBY]
class Hoge
def hoge
return “123”
end
end
[/RUBY]

変更を保存した後、ブラウザからtest/hogeにアクセスすると、ブラウザ上に123が出力されます。
確かに、Webサーバを再起動しなくても、<rails_project>/lib/hoge_fuga.rbが再読み込みされてますね。

これでデバッグがしやすくなるなあ。

Hyper Estraierで文書検索 (+ CentOS用rpm作成)

扱う文章の数が膨大になって管理しづらくなってきたので、Hyper Estraierの導入を検討しました。せっかくなので導入手順をメモ。
ちなみに、自分のローカルマシン(Windows)内の文書を管理したいだけなら、Hyper Estraierをエンジンに積んだDesktopHEを使えば十分と思います。でも、index作成がなんか遅い気がする。まあ、気のせいかも

FedoraやVine LinuxだとEstraierのrpmパッケージが公式に存在するので、yumとかapt-getでインストールすればいいのですが、CentOSにはrpmパッケージがありません。

調べてみると、Vine Linuxのsrpmを使うと楽ということなので、srpmからrpmbuildします。だれかCentOS用hyperestraierのyumリポジトリ作ってくれませんか?(他力本願)

まず、Vine LinuxのSRPMリポジトリからqdbm,mecab,mecab-ipadic,hyperestraierをダウンロードします。
その後、以下のようにrpmbuild & install (rpmbuildなどは、yum install rpm-buildなどで入れておくこと)。

# rpmbuild --rebuild qdbm-1.8.77-1vl5.src.rpm
# rpm -ivh /usr/src/redhat/RPMS/[arch]/qdbm-1.8.77-1.i386.rpm qdbm-devel-1.8.77-1.i386.rpm

# rpmbuild --rebuild mecab-0.97-2vl5.src.rpm
# rpm -ivh /usr/src/redhat/RPMS/[arch]/mecab-0.97-2.i386.rpm mecab-devel-0.97-2.i386.rpm

# rpmbuild --rebuild mecab-ipadic-2.7.0.20070801-1vl5.src.rpm
# rpm -ivh /usr/src/redhat/RPMS/[arch]/mecab-ipadic-2.7.0.20070801-1.i386.rpm

# rpmbuild --rebuild hyperestraier-1.4.13-2vl5.src.rpm
# rpm -ivh /usr/src/redhat/RPMS/[arch]/hyperestraier-1.4.13-2.i386.rpm hyperestraier-perl-1.4.13-2.i386.rpm

これでインストールは完了。

インデックスの作成方法は以下ページ参照。

/home/user/doc以下の文書をインデックス化して、/var/estraier/indexにインデックス作成する場合のコマンド例は以下。

$ estcmd gather -il ja -sd /var/estraier/index /home/user/doc

後は、検索用のWebページを用意すれば終わり。CentOSの場合は以下の通り。

# yum install httpd
# service httpd start
# cp /usr/libexec/estseek.cgi /var/www/cgi-bin/.
# /usr/share/hyperestraier/estseek.* /var/www/cgi-bin/.

上記を実行した後、/var/www/cgi-bin/estseek.confのindexnameの項目を編集します。

indexname: /var/estraier/index
...省略

手元のブラウザから、estseek.cgiへアクセスすると検索ページが見れます。
もしこの時、「Error: the index is missing or broken.」とか出てくるようなら、indexファイルへのアクセス権がapacheにないせいかもしれません。
estseek.conf内の項目の意味は、Hyper Estraierのユーザマニュアルを参照してください。