merbが生成するデフォルトのアプリケーションのひな形には、最初からユーザ認証の仕組みを提供するmerb-auth-
これが提供するデフォルトのログイン画面を変更するためには、
app/views/
ファイルを作ればOKです。
merbが生成するデフォルトのアプリケーションのひな形には、最初からユーザ認証の仕組みを提供するmerb-auth-
これが提供するデフォルトのログイン画面を変更するためには、
app/views/
ファイルを作ればOKです。
Railsで言う所のbefore_sav
1 class Post 2 include DataMapper::Resource 3 4 before :save do 5 # do some stuff 6 end 7 8 def foo 9 puts "foo!" 10 end 11 12 before :foo, :bar 13 14 def bar 15 puts "bar!" 16 end 17 end
このbeforeメソッドは、ExtLibのhook.rbの中で定義されている。 上記のように、ブロックを取る形式と、イベントをハンドルするメソッド名をシンボルで指定する形式があります。
ExtLibが提供するhookは、saveやvalid?のような特定のイベントだけではなく、全てのメソッドに対して汎用的に利用出来るようです。
ただし、before :foo, :bar
のように、hookをインストールする時点で、
hookされるメソッド(この場合はfoo)が定義されている必要があります。
クラスメソッドに対するhookも用意されていて、
1 before_class_method :new do 2 puts "new!" 3 end
のように利用出来ます。
Update
beforeフィルターでメソッドの実行を中止する場合は、
1 before :save do 2 throw :halt 3 end
のように、:haltをthrowすればOKです(thanks maiha)。 これは美しい。
merb-1.0.5thor merb:gem:i
の挙動が変わったようです。
1 % thor merb:gem:install
すると、依存するgemファイル一式をMERB_ROOT/
以前は、インストールするgem名を引数に取ったり、--cacheなどのオプションが使えたのですが、1.0.5以降はこれが出来なくなっている模様。
1 % ./bin/merb-i
これを使う事で、edge merbを手元の環境で簡単に使う事が出来ます。
Zshでthor (トール)のタスクを補完するための補完関数を作ってみました。
1 _thor () { 2 compadd `thor list | awk "{print \\$1}" | grep "\w" | \ 3 ruby -e "puts ARGF.read.gsub /\\e.*?m/,''" | xargs` 4 } 5 6 compdef _thor thor
See Also
We just released Merb 1.0.7. Some highlights
:
以下適当に訳したり訳さなかったり。
[]
などのような値が使われても大丈夫になった。昨日からmasuidrive
em.cpp EventMachi
1 timeval tv = {0,0}; 2 EmSelect (0, NULL, NULL, NULL, &tv); // <- これ 3 4 return true;
見るからにWorkaround
straceの結果では、正常に実行されてる場合には ADDからEPOLLINまでのシステムコール呼び出しが以下のような感じなのに対して、
1 write(1, "************** epoll-add:0.0377"..., 39************** epoll-add: 0.03 2 7784 - 8 3 ) = 39epoll_ct l(6, EPOLL_CTL_ ADD, 8, {EPOLLIN, {u32=138272 384, u64=132393 6545317780 646 4 4}}) = 0 5 epoll_wait (6, {{EPOLLIN, {u32=138272 384, u64=132393 6545317780 6464}}}, 65536, 50) 6 = 1 7 gettimeofd ay({1230425221 , 603705}, NULL) = 0 8 write(1, "************** epoll-read : 0.020"..., 40************** epoll-read : 0.0 9 20716 - 8
異常時には以下のように謎のselectが発生していました。
1 write(1, "************** epoll-add:0.0295"..., 39************** epoll-add: 0.029586 - 8 2 ) = 39 3 epoll_ctl(6, EPOLL_CTL_ ADD, 8, {EPOLLIN, {u32=138272 384, u64=132393 6545317780 646 4 4}}) = 0 5 epoll_wait (6, {}, 65536, 50) = 0 6 select(0, NULL, NULL, NULL, {0, 0}) = 0 (Timeout) 7 time(NULL) = 1230425221 8 gettimeofd ay({1230425221 , 787115}, NULL) = 0 9 epoll_wait (6, {}, 65536, 50) = 0 10 select(0, NULL, NULL, NULL, {0, 0}) = 0 (Timeout)time(NULL) = 1230425221 11 gettimeofd ay({1230425221 , 839105}, NULL) = 0 12 epoll_wait (6, {{EPOLLIN, {u32=138272 384, u64=132393 6545317780 6464}}}, 65536, 50) = 1 13 gettimeofd ay({1230425221 , 843713}, NULL) = 0 14 write(1, "************** epoll-read : 0.110"..., 40************** epoll-read : 0.1 15 10337 - 8
どうやらこの謎のEmSelect呼び出しはビジーループ対策のために 挿入されているらしいのですが、以下のような形に直すと問題が 発生しなくなるようです。
1 //timeval tv = {0,0}; 2 //EmSelect (0, NULL, NULL, NULL, &tv); 3 #ifdef BUILD_FOR_RUBY 4 if (!rb_thread_ alone()) { 5 rb_thread_ schedule(); 6 } 7 #endif
eventmachi
ということで、ひとまずお疲れさまでしたー>masuidrive
masuidrive
結局の所、EPOLL_CTL_
epollの実装は、linuxカーネルの中にあります。 なので、linuxカーネルのソースをインストールします。
1 # aptitude install linux-source-2.6.18
/usr/srcの下に圧縮されたカーネルのソースがインストールされるので、 展開します。
epoll関連のソースコードは、fs/eventep
githubのリポジトリから持ってきた edge merb に含まれているパッケージは、 以下の通り。
1 merb-1.0.gem 2 merb-actio n-args-1.0 .gem 3 merb-asset s-1.0.gem 4 merb-auth- core-1.0.g em 5 merb-auth- more-1.0.g em 6 merb-auth- slice-pass word-1.0.g em 7 merb-auth- 1.0.gem 8 merb-cache -1.0.gem 9 merb-core- 1.0.gem 10 merb-excep tions-1.0. gem 11 merb-gen-1 .0.gem 12 merb-haml- 1.0.gem 13 merb-helpe rs-1.0.gem 14 merb-maile r-1.0.gem 15 merb-param -protectio n-1.0.gem 16 merb-slice s-1.0.gem 17 merb_datam apper-1.0. gem
merb_datam
merbのGemの名前は、"-"区切りのものと、"_"区切りのものがあるが、
という使い分けらしい。
このブログでは、記事の全文検索に
HyperEstra
とりあえず、HyperEstra_log
ファイルをtail -f
などして、HEを起動してみたりします。
_node以下のDBファイルが壊れているのであれば、
1 # estcmd repair -rst blog
などのようにして修復します。しかしなぜかわからないですが、 修復しても起動しない事が結構あります。 そういう場合には、強硬手段ですが、_node以下の破損したDBを削除して、webインターフェイスから作り直します。 その上で reindex! を実行して検索インデックスを作り直します。
以上でだいたい完了。クラッシュしなくなると良いんだけどなー。