さくらVPSにFedora15をインストールしたメモ

さくらVPSを借りたので色々いじっている.
デフォルトではCentOSがインストールされているが,yumでインストールできるパッケージのバージョンが古いのが難点.
Fedora EPEL,remi,RPMForgeのリポジトリを追加してみたがzsh,screenのバージョンが足らずにいつも使っている機能が使えない(この辺りは詳しくないので実は適切なリポジトリがあったのかもしれない).
ソースからビルドすればすむ話だが,特にCentOSにこだわりはないし毎回ビルドするのも面倒なのでFedoraをカスタムインストールすることにした.

OSのインストール自体は公式の解説の通りで問題なし.インストールの設定は「最低限」を選択した.
インストールが終わって再起動したら,社長ブログを参考にsshのポート変更などのセキュリティ対策や不要なサービスの停止を行っておく.
ポート番号を変更するとiptablesの設定も修正しておかないとsshで接続できなくなるので注意.

あとはこの辺りを参考にユーザの追加やsudoerの設定などを実施.

最低限の設定ができたところで,まずは作業環境を整える.

$ sudo yum install zsh screen lv emacs-nox

.zshrcや.screenrcをscpしようとしたところでscpがないと怒られるので入れておく.
さらにmanも入っていなかったので入れておく.

$ sudo yum install openssh-clients
$ sudo yum install man

ここで思い立ってFedora13から15にアップグレードすることにする.
まずはツールをインストール.

$ sudo yum install preupgrade

CUIからのアップグレード作業は下記の通りでOK.

$ LANG=C
$ sudo preupgrade-cli "Fedora 15 (Lovelock)"

これが終わったらリブートしてアップグレード完了.簡単!

dicedで動的IPの更新時に127.0.1.1になる

グローバルIPの取得がうまくいっていなかったみたいだ.
IPアドレスの検出に外部スクリプトを使うように変更した.
dyndnsを使っているので外部スクリプトにはhttp://checkip.dyndns.org/を指定した.

$ sudo diced
=-=-=- DiCE DynamicDNS Client -=-=-=
Version 0.19 for Japanese
Copyright(c) 2001 sarad

:setup
IPアドレスの検出方法を指定してください
(0) 自動検出
(1) ローカルのネットワークアダプタから検出
(2) 外部のスクリプトから検出
<現在:0>
(N)変更しない  (P)戻る
>2
                                                                                                • -
スクリプトのURLを入力してください <現在:> (N)変更しない (P)戻る >http://checkip.dyndns.org/
                                                                                                • -
プライベートIPアドレスも検出対象ですか? (Y/N) <現在:いいえ> (P)戻る >n
                                                                                                • -
IPアドレスの検出をテストしますか? (Y/N) (P)戻る >y 検出IPアドレス>xxx.xxx.xxx.xxx
                                                                                                • -
IPアドレスの検出をテストしますか? (Y/N) (P)戻る >n
                                                                                                • -
IPアドレスをチェックする間隔を指定してください(分) 設定可能範囲は5分以上です <現在:10> (N)変更しない (P)戻る >5 ================================================= DNSサーバーの負荷を軽減するために頻繁なDNS更新を防ぐ必要があります 前回の更新から一定時間DNS更新処理を行わないように保護時間を設定して ください(分) 設定可能範囲は10分から1440分です <現在:10> (N)変更しない (P)戻る >n ================================================= 設定を保存しますか? (Y/N) (P)戻る >y 設定を保存しました =================================================

ひとまずこれで少し様子見をしてみよう.
参考:http://www.aconus.com/~oyaji/ddns/ddns_linux.htm

Railsのインストール

ruby1.9rails文字コード周りで色々はまりそうだが,チャレンジしてみる.
まずはgemをアップデートしておく.

$ ruby -v
ruby 1.9.1p243 (2009-07-16 revision 24175) [i686-linux]
$ gem -v
1.3.1
$ sudo gem update --system
$ gem -v
1.3.5

続いてrails本体.

$ sudo gem install rails --include-dependencies
$ rails -v
Rails 2.3.4

apacheと連携させるためにpassengerもインストールしておく.
このあたりはRedmineのインストール記事が参考になる.
http://redmine.jp/tech_note/apache-passenger/

$ sudo gem install passenger

しかしgemのriとRDocのインストールにはなんでこんなに時間がかかるんだ?
passenger-install-apache2-moduleコマンドでapacheのモジュールをインストールしようとしたが
いくつかパッケージが足らないと怒られたのでapt-getしておく.

$ sudo apt-get install libopenssl-ruby apache2-prefork-dev libapr1-dev libaprutil1-dev 

として再度passenger-install-apache2-moduleを実行するが,libopenssl-rubyがないとまだ怒られる.
これはrubyをソースからコンパイルしたのが原因か...?
ちょっと調べると,rubyソースコードにopensslのコードも含まれていることが判明.
なんで自動的にインストールしてくれてなんだ...
そういえばrubyインストール時のmake checkでwebrickのテストが失敗していたのもこれが原因か.
ともかくopensslモジュールもビルドしてインストールしてからpassenger-install-apache2-moduleを実行.

# まずは間違えて入れたパッケージを削除しておく
$ sudo apt-get remove libopenssl-ruby libruby1.9
$ cd ~/Install/ruby-1.9.1-p243/ext/openssl
$ ruby extconf.rb && make && sudo make install
$ sudo passenger-install-apache2-module

ようやくうまくいった.
後はapacheの設定をしておく.
/etc/apache2/mods-available/passenger.load

LoadModule passenger_module /usr/local/ruby19/lib/ruby/gems/1.9.1/gems/passenger-2.2.5/ext/apache2/mod_passenger.so

/etc/apache2/mods-available/passenger.conf

PassengerRoot /usr/local/ruby19/lib/ruby/gems/1.9.1/gems/passenger-2.2.5
PassengerRuby /usr/local/ruby19/bin/ruby

後はモジュールを有効化してapache再起動.

$ sudo a2enmod passenger
$ sudo /etc/init.d/apache2 restart

これでRailsを使う準備は整った...かな.

ruby1.9向けのemacsテンプレート設定

ruby1.9ではソースコードファイルの先頭に文字コードのマジックコメントを挿入する必要がある.毎回手で書くのは面倒すぎるのでemacsのテンプレート設定をしておく.
まずは.emacsの設定.拡張子が"rb"のファイルを作成したときにテンプレートを適用するように指定する.
ついでにファイル保存のタイムスタンプも自動挿入するようにしておいた.

;;=========================================
;; テンプレートの保存先
(setq auto-insert-directory "~/.emacs.d/template/")
(auto-insert-mode 1)
;; テンプレート挿入時に尋ねない
;; デフォルトは 'function
(setq auto-insert-query nil)
(setq auto-insert-alist
          (append '(
                                ("\.rb$"   . "rb")
                                ) auto-insert-alist))

;; 先頭から8行以内の Time-stamp: <> にタイムスタンプを自動挿入
(add-hook 'write-file-hooks 'time-stamp)

続いて,上で指定したテンプレートのファイル(~/.emacs.d/template/rb)を作成しておく.

# -*- coding: utf-8 -*-
# Time-stamp: <>

これで拡張子が".rb"のファイル作成時に自動的にテンプレートが挿入される.
参考:http://www.bookshelf.jp/soft/meadow_37.html

pre記法で長い行が右側にはみ出す件

pre記法で書いたコードの1行が長いと右のサイドバーを突き抜けて見栄えが非常に悪かったので対策した.
といっても「管理」→「デザイン」→「詳細」のスタイルシートで長かったら横スクロールするようにしただけだが.

pre{
    overflow:auto;
}

mp3タグ情報の抽出,更新 ruby-mp3info

mp3のID3タグの情報を一括して処理したくなったのでrubyのライブラリを探した.
最初は id3lib-ruby を使おうかと思ったが,gem のインストールで失敗してダメだった.

$ sudo apt-get install libid3-3.8.3-dev 
$ sudo gem install id3lib-ruby
Building native extensions.  This could take a while...
ERROR:  Error installing id3lib-ruby:
        ERROR: Failed to build gem native extension.

/usr/local/ruby19/bin/ruby extconf.rb install id3lib-ruby
checking for main() in -lstdc++... yes
checking for main() in -lz... yes
checking for id3.h... yes
checking for ID3Tag_New() in -lid3... yes
creating Makefile

make
g++ -I. -I/usr/local/ruby19/include/ruby-1.9.1/i686-linux -I/usr/local/ruby19/include/ruby-1.9.1/ruby/backward -I/usr/local/ruby19/include/ruby-1.9.
1 -I. -DHAVE_ID3_H  -D_FILE_OFFSET_BITS=64  -fPIC  -O2 -g -Wall -Wno-parentheses    -o id3lib_api_wrap.o -c id3lib_api_wrap.cxx
id3lib_api_wrap.cxx: In function ‘size_t ID3_Field_set_binary(ID3_Field*, VALUE)’:
id3lib_api_wrap.cxx:1837: error: ‘struct RString’ has no member named ‘ptr’
id3lib_api_wrap.cxx:1838: error: ‘struct RString’ has no member named ‘len’
id3lib_api_wrap.cxx: In function ‘size_t ID3_Field_set_unicode(ID3_Field*, VALUE)’:
id3lib_api_wrap.cxx:1846: error: ‘struct RString’ has no member named ‘len’
id3lib_api_wrap.cxx:1853: error: ‘struct RString’ has no member named ‘ptr’
make: *** [id3lib_api_wrap.o] エラー 1


Gem files will remain installed in /usr/local/ruby19/lib/ruby/gems/1.9.1/gems/id3lib-ruby-0.5.0 for inspection.
Results logged to /usr/local/ruby19/lib/ruby/gems/1.9.1/gems/id3lib-ruby-0.5.0/ext/gem_make.out

めんどくさそうなエラーが出たのでid3lib-rubyを使うのは断念.
同じようなライブラリに ruby-mp3info(http://ruby-mp3info.rubyforge.org/) があったのでこっちを採用.

$ sudo gem install ruby-mp3info

こっちは何のエラーもなくインストール完了.とりあえずタグの内容は以下のようにして読める.(ruby-1.9.1)

require 'mp3info'

Mp3Info.open("filename.mp3") do |mp3|
  p mp3.tag  #=> {"title"=>"hoge", "artist"=>"fuga", "comment"=>"foo"}
  p mp3.tag2.keys #=> ["TPE1", "TIT2", "COMM", "APIC"]
end

アートワークの画像を抽出することも無事にできた.注意点は最初の1バイト目の"\000"を削ること.これをしないとファイルが破損状態になって読めなかった.
参考:http://rubyforge.org/forum/forum.php?thread_id=27204&forum_id=229

Mp3Info.open("filename.mp3") do |mp3|
  text_encoding, mime_type, picture_type, picture_data = mp3.tag2["APIC"].unpack("c Z* c a*")
  imgfile = "#{File.basename(file, ".*")}.#{mime_type.sub('image/','')}"
  File.open(imgfile, "w") {|f|
    f.print picture_data.sub(/^\000/, '')  # 最初の1バイト目の\000を削除
  }
end