日記第三版


Mar 21, 2009 (Sat)

# 僕もさくらインターネットでtDiaryをruby1.9.1-p0で動かす

まちゅさんのところで、さくらインターネットでtDiaryをruby1.9.1-p0で動かすがあったので、僕もやってみた。先例があるので、あまり苦労しないn番目の人柱だけど(苦笑)。

今回は、真っ新なさくらレンタルサーバでRuby 1.9系 + tDiary 2.3.1系を動かした。諸事情でサーバをお引越しする必要があったので、これを機にruby1.9にしてみたのよ。tDiaryにはお世話になっているので人柱くらいはなっておきたかったし。

1.9導入の方法はまちゅさんと同じなのだが、ほんの少しだけtDiaryの配置構成が違う。僕のところは、同一サーバで複数のtDiaryを運営する方法みたいに、kayakaya.netでは複数のtDiaryを運用している。1.9対応の本質は変わらないだろうけど。

なお、引越し元のサーバでは、tDiary 2.3.1を使っていたので、日記データはUTF-8化されている。

Ruby 1.9.1のインストール

とくに厄介なことはないです。さくらインターネットではmake && make installで困らないはず。僕は$HOME/opt/に導入している。

$ wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p0.tar.bz2
$ tar zxvf ruby-1.9.1-p0.tar.bz2
$ cd ruby-1.9.1-p0
$ ./configure --prefix=$HOME/opt
$ make && make install

バージョンを確認する。

$ $HOME/opt/bin/ruby -v
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-freebsd7.1]

うむよい。

tDiaryのインストール

tDiaryのインストール先は$HOME/local/share/tdiaryとする。SubversionのリポジトリからtDiaryの本体、contrib、プラグインとテーマを取得する。今回は1.9.1が安定して動くことが目的なので、tDiaryはtrunkを躊躇せず使う。

$ mkdir -p $HOME/local/share/
$ cd local/share
$ svn co https://tdiary.svn.sourceforge.net/svnroot/tdiary/trunk tdiary

themeはcore/themeにシンボリックリンクを張ってあげて、テーマを使えるようにする。

$ cd $HOME/local/share/tdiary/core/theme
$ cd -s ../../theme/* .

同一サーバで複数のtDiaryを運営する方法では、theme_url.rbのプラグインを作成して、プラグインのディレクトリに配置するとあるけれど、僕はその方法は取らなかった。僕のところでは、多くの人がtDiaryを使っているのではなく、僕個人が複数のtDiaryを動かしているだけなので、個別にthemeディレクトリを指定するのが手間でなかったりするだけ。

共通のtdiary.confは、同一サーバで複数のtDiaryを運営する方法と変わらない。共通のtdiary.confは$HOME/local/etc/tdiary.confに置いた。プラグインのパス自分の環境に合せて変えてあげることを忘れずに。僕の環境ではtDiaryのリポジトリに収録されてない野良プラグインはtdiary-stray/pluginに入れてある。

#
# ~/local/etc/tdairy.conf
# shared tdiary.conf
#
@data_path = "/home/kayakayaichthys/var/tdiary/#{@user_name}"
@smtp_host = 'localhost'
@author_name = "#{@user_name}"
@mail_header = "#{@user_name}"
@html_title = "#{@user_name}日記"

@header = <<HEADER
<%=navi%>
<h1>#{@user_name}diary</h1>
<%=calendar%>
HEADER

@footer = <<FOOTER
<%=calendar%>
<%=navi%>
FOOTER

@options['sp.path'] =  '/home/kayakayaichthys/local/share/tdiary/misc/plugin', '/home/kayakayaichthys/local/share/tdiary/plugin', '/home/kayakayaichthys/local/share/tdiary/contrib/plugin', '/home/kayakayaichthys/local/share/tdiary-stray/plugin'

@secure = false
load_cgi_conf

な感じ。@secureはfalseにしたのは、trueだとうまく動いてくれなかったから。個別の日記用tdiary.confでfalseにできるそうなのだがダメだったので、共通のtdiary.confでfalseにしてしまったの……。

個別の日記の配置

さて、ここからが肝要。

日記のURLはhttp://kayakaya.net/d/なので、サーバでの配置場所は$HOME/www/d/になるが、マルトドメインにしてあるので少し違う。$HOME/www/kayakayaをkayakaya.netにマッピングしてあるので、場所は$HOME/www/kayakaya/d/となる。

$ mkdir www/kayakaya/d
$ cd www/kayakaya/d
$ touch index.cgi
$ touch update.cgi
$ chmod +x index.cgi
$ chmod +x update.cgi

index.cgiとupdate.cgiを下記の通り編集する。拡張子はrbでも動くのだが、cgiの方がマルチドメイン環境では良いみたいなのでcgiにしている。

$ cat index.cgi
#!/home/kayakayaichthys/opt/bin/ruby
# -*- coding: utf-8; -*-
require '/home/kayakayaichthys/local/share/tdiary/core/index'
$ cat update.cgi
#!/home/kayakayaichthys/opt/bin/ruby
# -*- coding: utf-8; -*-
require '/home/kayakayaichthys/local/share/tdiary/core/update'

.htaccessはデフォルトのdot.htaccessと違う箇所だけ示す。html_anchor.rbプラグインを使っているので、その設定も書いてある。index.rbをindex.cgiに変更するのを忘れないこと(僕は忘れてハマりましたとも)。

DirectoryIndex index.cgi
RewriteEngine on
RewriteBase /d
RewriteRule ^([0-9\-]+)\.html$ index.cgi?date=$1

個別の日記用tdiary.confはこんな感じ。update.rbがupdate.cgiに変更しているので、@updateで明示的に指定してあげる。

@data_path = "/home/kayakayaichthys/var/tdiary/kayakaya/"
@user_name = 'kayakaya'
eval( File::readlines( '/home/kayakayaichthys/local/etc/tdiary.conf' ).join.untaint)
@style = 'Wiki'
@update = 'update.cgi'

テーマのディレクトリを作成することも忘れずに。

$ ln -s $HOME/local/share/tdiary/core/theme/ theme

個別の日記を設定する手順はこんな感じ。

キャッシュの削除

まちゅさんも書いている通り、Ruby 1.8系で動いていたtDiaryのキャッシュがあると、Ruby 1.9系ではうまく動かない。キャッシュを削除する。

$ rm -rf var/tdiary/kayakaya/cache/*
$ rm -rf var/tdiary/kayakaya/category/*

カテゴリインデックスの作成

キャッシュの削除で、カテゴリインデックスを消してしまったので再作成する。tDiaryの設定画面から「カテゴリ」->「カテゴリインデックスの作成 」にチェックして、「OK」を押す。まちゅさんはエラーが出たそうだが、僕は正常に作成された。日記データの違いかなぁ。

base_urlの罠(?)

これらの設定をした後で、システムのruby 1.8.6で動作確認してみる(shebangは/usr/loca/bin/rubyに変更した)。ruby 1.8.6で正常に動いてくれたので、tDiaryを複数運用するための設定は間違ってないようだと安心する。ここで、再びキャッシュを削除してから、shebangをコンパイルしたruby1.9.1に変更して試すと、こんなエラーが……。

can't convert nil into String (TypeError)

(plugin/00default.rb):341:in `[]='
(plugin/00default.rb):341:in `mobile_link_discovery'
(plugin/00default.rb):208:in `block (2 levels) in load_plugin'

実は、前に書いた個別日記用tdiary.confは現在運用中のもので、当初、1.9系で動かした時の記述ではない。先のconfにこの記述が書いていた。

def base_url
    'http://kayakaya.net/d/'
end

エラーはこのbase_urlの定義が原因だったみたい。00default.rbの該当の箇所を読むと、base_urlが関係しているぽいので個別日記用のtdiary.confからbase_urlの定義を消してみた。すると、ruby1.9.1でも正常に動く。1.8.6ではbase_urlの定義があってもエラーなしで動いた。

既知の問題でもなさそうなので、tdiary-develで質問してみたところ、個別の日記用tdiary.confではbase_urlは指定しなくても良い旨の回答をたださんから頂いたので、安心して削除して運用することに。

おしまい、これから

ruby1.9.1でtDiaryを動かしてから2日経過、マルチドメイン下に変更してから1日が経過したけれど、今のところ正常に動いている。何かエラーは出るかもしれないけれど、よほどのことがなければ、1.9で運用していくつもり。

Tags: tDiary ruby
本日のツッコミ(全2件) [ツッコミを入れる]
_ へいちゃん (Mar 22, 2009 (Sun) 15:55)

先例があることはありがたい事ですよね。<br>僕も昔Hpサーバー立ち上げたときは、<br>(今思えばそんなに難しい事ではない)<br>先例が役に立ちました。<br><br>さくらからエラーメッセージが吐き出されない<br>というのはクリアできましたか?

_ kayakaya (Mar 22, 2009 (Sun) 16:35)

先例はありがたいですねー。そういえば大学の頃は研究室でサーバを公開するのが流行ってましたね。<br><br>さくらのエラーの件ですが、Webサーバのエラーログを見られないのは仕様なので無理かな。rubyのエラーはブラウザ画面に出るので、それは大丈夫よ。