cronでRVMのRubyを使う

RVMで複数のRuby環境がある場合に、Railsアプリケーションのためのcronをどうするか? Rubyのパスはフルパス指定すればいいが、gemがRVMのgemを見に行かないのが問題。RVM環境でcronを実行する必要がある。

RVM: Ruby Version Manager - Using Cron with RVM

cron用のシェルスクリプト内で使用するRVM環境をロードするには以下のようにする。

まず、環境ファイルのパスを確認

$ rvm env --path -- ruby-version[@gemset-name]

実行例

$ rvm env --path -- 1.8.7-p371
/Users/pistolfly/.rvm/environments/ruby-1.8.7-p371

cron用のシェルスクリプトで環境ファイルを読み込む

source /Users/pistolfly/.rvm/environments/ruby-1.8.7-p371

/home/pistolfly/app_dir
ruby script/runner -e production "ActiveRecord::SessionStore::Session.delete_all(['sessions.updated_at < ?', 6.hours.ago])"

iTerm2でoptionキーをmetaキーにする

iTerm2でEmacsを使う時、optionキーをmetaキーとして使用したい。

Preference > Profile > Keys の下の方にある、
Left option key acts as:
Right option key acts as:
で、+Esc を選択すると、optionキーをmetaキーとして使用できる。

ちなみに、Mac OS Xの標準のターミナルの場合は、環境設定 > プロファイル で選択したプロファイルの、「キーボード」タブで、「メタキーとして Option キーを使用」にチェックを入れればよい。

MovableType Perlのパスを一括変換

find -exec で sedで置き換えをすればいいのだが、sedの実装によって -i オプションの動作が異なるのでちょっとはまった。

Linux(GNU sed)の場合

バックアップを作成しない場合

$ find . -name "*.cgi" -exec sed -i 's/\/usr\/bin\/perl/\/usr\/local\/bin\/perl/' {} \;

バックアップを作成する場合は、-iに拡張子を指定。

$ find . -name "*.cgi" -exec sed -i.bak 's/\/usr\/bin\/perl/\/usr\/local\/bin\/perl/' {} \;

Mac OS X(BSD sed)の場合

Mac OS X のsedは、-i オプションに引数(バックアップファイルの拡張子)の指定が必須なので、-iに何も指定しないと、

sed: 1: "./mt-add-notify.cgi": invalid command code .
sed: 1: "./mt-atom.cgi": invalid command code .
sed: 1: "./mt-check.cgi": invalid command code .
...

というエラーになってしまう。
なので、バックアップを作成しない場合は、-i ''を指定する。

$ find . -name "*.cgi" -exec sed -i '' 's/\/usr\/bin\/perl/\/opt\/local\/bin\/perl/' {} \;

バックアップを作成する場合は、

$ find . -name "*.cgi" -exec sed -i '.bak' 's/\/usr\/bin\/perl/\/opt\/local\/bin\/perl/' {} \;

MovableType Perlのパスを一括変換:Jays Room.

Sed: ‘sed: 1: invalid command code R’ on Mac OS X at Mark Needham.

log4netでログ出力先パス、ファイル名の取得、設定

log4net.Repository.ILoggerRepository[] repositories = log4net.LogManager.GetAllRepositories();
foreach (log4net.Repository.ILoggerRepository repository in repositories)
{
    foreach (log4net.Appender.IAppender appender in repository.GetAppenders())
    {
        log4net.Appender.FileAppender fileAppender = appender as log4net.Appender.FileAppender;
        if (fileAppender != null)
        {
            appender.File = "log.log"; //出力先ファイルを設定
            appender.ActivateOptions();
        }
    }
}

※ 上記のようにコードでFileを設定する場合も、依然としてXMLの設定にはFileの指定は必要だった。

log4netで設定したログ出力先パス、ファイル名の取得: DOBON.NETプログラミング掲示板過去ログ
log4netでのログ出力について - Insider.NET - @IT)