monit で外部サーバの監視

monit で外部サーバの監視をするときは、check host っていうのを使えば良いみたいだ。

check host ecpplus with address ecpplus.net
  if failed port 80 then alert
    alert sample@ecpplus.net

とすると、ecpplus.net の 80番ポートの死活監視を行って、アウトー!ってなったらメールを飛ばしてくれる。復旧したときもメールをくれる。

参考:monit 公式のドキュメント

monit で外部サーバの監視

ActiveRecord の例外処理

RailsのActiveRecordで、save! とかすると保存に失敗したとき例外を投げてくれる。例えば、User.create!(params[:user]) とかして、失敗すると、ActiveRecord::RecordInvalid を投げてくれるのだけど、エラーをどうやって取るのか調べたのでメモ。

よくある例で、ユーザが作れたら index へ遷移して、作れなかったら new で再入力させるという場合。

createを使う場合

def create
  if @user = User.create(params[:user])
    flash[:notice] = 'ユーザ作成しました'
    redirect_to :action => 'index'
  else
    # ここでは、@user.errors でエラーが取れる
    render :action => 'new'
  end
end

create!を使う場合

def create
  @user = User.create!(params[:user])
  flash[:notice] = 'ユーザ作成しました'
  redirect_to :action => 'index'
rescue ActiveRecord::RecordInvalid => e
  # @user は nil になっているので、 @user.errors でエラーが取れない。
  render :action => 'new'
end

としたとき、create! で例外が飛んでいるので、当然 @user は nil となってます。なので、rescue 句の中で @user.errors ではエラーが取れません。

調べたところ、e.record で、ActiveRecord の例外を発生させたインスタンスが取れるようです。

def create
  @user = User.create!(params[:user])
  flash[:notice] = 'ユーザ作成しました'
  redirect_to :action => 'index'
rescue ActiveRecord::RecordInvalid => e
  # e.record に Userクラスのインスタンスが入ってる。
  @user = e.record
  render :action => 'new'
end

たとえば、View内で

< %= error_messages_for :user %>

とかしたい場合は、@user = e.record として置けばエラーが楽に表示出来て良い。

ActiveRecord の例外処理

Rubyでtokyotyrant使ってみた

OSXを使って、rubyでtokyotyrant使ってみた。

インストール

tokyocabinet

最新版を公式サイトから落としてくる。現時点での最新は、1.4.20だった。

% curl -O http://tokyocabinet.sourceforge.net/tokyocabinet-1.4.20.tar.gz
% tar xvzf tokyocabinet-1.4.20.tar.gz
% cd tokyocabinet-1.4.20
% ./confiruge --prefix=/usr/local
% make 
# make install
tokyotyrant

同様に、最新版を公式サイトのtokyotyrantのパッケージ一覧から落としてくる。現時点での最新は、1.1.26だった。

% curl -O http://tokyocabinet.sourceforge.net/tyrantpkg/tokyotyrant-1.1.26.tar.gz
% tar xvzf tokyotyrant-1.1.26.tar.gz
% cd tokyotyrant-1.1.26
% ./confiruge --prefix=/usr/local
% make 
# make install
tokyocabinet Ruby用API

同様に、最新版を公式サイトのRubyAPIの一覧から落としてくる。現時点での最新は、1.23だった。

% curl -O http://tokyocabinet.sourceforge.net/rubypkg/tokyocabinet-ruby-1.23.tar.gz
% tar xvzf tokyocabinet-ruby-1.23.tar.gz
% cd tokyocabinet-ruby-1.23
% ruby extconf.rb
% make 
# make install
tokyotyrant Ruby用API

同様に、最新版を公式サイトのRubyAPIの一覧から落としてくる。現時点での最新は、1.5だった。

% curl -O http://tokyocabinet.sourceforge.net/tyrantrubypkg/tokyotyrant-ruby-1.5.tar.gz
% tar xvzf tokyotyrant-ruby-1.5.tar.gz
% cd cd tokyotyrant-ruby-1.5
# ruby install.rb

tokyotyrantサーバを起動してみる

% sudo /usr/local/sbin/ttservctl start
Starting the server of Tokyo Tyrant
/usr/local/sbin/ttservctl: line 49: ulimit: open files: cannot modify limit: Invalid argument
Executing: ttserver -port 1978 -dmn -pid /var/ttserver/pid
Done

なんかエラーが出るので、/usr/local/sbin/ttservctl の49行目を見てみる。

48
49
50
if [ -n "$maxcon" ] ; then
   ulimit -n "$maxcon"
 fi

maxcon という変数を見てみると

21
22
23
dbname="$basedir/casket.tch#bnum=1000000"
maxcon="65535"
retval=0

ulimit がエラーらしいが、ulimit がよく分からない。適当に数字を maxcon=6000 とかしたらエラー消えたけどいいのか…?

というわけで、無事起動。

接続

シェルから接続する場合は、tcrmgr というコマンドを使うらしい。

値の設定

tcrmgr put {host} {key} {value} という書式でセットする。name というキーに、CHU といれるならば、

tcrmgr set localhost name CHU
値の取得

tcrmgr get {host} {key} という書式でゲットする。name というキーの値を取得するならば、

tcrmgr get localhost name

とりあえず、起動して動いているようだ。

Rubyでtokyotyrant使ってみた