PageView.count(:group => 'user_id')
とすると、
[[1, 1], [2, 5], [3, 2]]
のようにグループ化のキーと件数のペアの配列が得られる。
これを複数列でグループ化しようとして
PageView.count(:group => 'page_id, user_id')
としても、キーがひとつだけになってしまってうまくいかない。
とりあえず
PageView.find(:all).map{ |e| [e.page_id, e.user_id] }.inject(Hash.new(0)){ |r, e| r[e] += 1; r }
とした。(find(:all) がかなり気になるが、件数が少ないので)
そういえば、こんなコードを書いたのでした。 (最終的にはなくなりましたが)
allowed_keys = %w(foo bar hoge.fuga) if allowed_keys.include?(params[:key]) key = [params[:key].split(/\./)].flatten @array.sort_by{ |a| key.inject(a){ |e, m| e.send(m) } } end
PHPで安全なセッション管理を実現する方法に対する高木さんのコメントへのフォロー を読んで、Ruby の CGI::Session について調べてみた。
Ruby 1.8.5 では、デフォルトの session ID 生成アルゴリズムは次のようになっている。
def create_new_id require 'digest/md5' md5 = Digest::MD5::new now = Time::now md5.update(now.to_s) md5.update(String(now.usec)) md5.update(String(rand(0))) md5.update(String($$)) md5.update('foobar') @new_session = true md5.hexdigest end
ここで、session ID の生成を現状のものではなく /dev/urandom があれば使うようにするべきなのかどうかは、自分には分からなかった。 (/dev/urandom を使えば問題ないのは確かだが、現状のものがまずいのかどうかは分からなかった)
session ID の生成については [ruby-dev:24183] で問題が指摘されているが、 これは今は解決しているようだ。(Time#usec を使うようになったのと、srand に /dev/urandom を使うようになったため)
るびまの新刊 (そういえばオンラインマガジンでも「新刊」って言うんだろうか) が発行されました。
今回のインタビューは青木さんです。
http://jp.rubyist.net/magazine/?0017
なお、るびま編集部では編集者を募集しています。 私も編集者としてお手伝いしています。 興味のある方はるびま編集部 <magazine at jp.rubyist.net> までお問い合わせください。
Ruby 1.8.5, Rails 1.1.6, lighttpd 1.4.13 に Relative Path プラグイン (Revision 21) の組み合わせで不具合が発生した。
まず、
ruby script/generate controller item show
で適当にコントローラを作る。
Relative Path プラグインをインストール。
ruby script/plugin install http://opensvn.csie.org/relative_path/trunk/ mv vendor/plugins/trunk vendor/plugins/relative_path
lighttpd の設定ファイルをコピー。
cp /usr/local/lib/ruby/gems/1.8/gems/rails-1.1.6/configs/lighttpd.conf config
ruby script/server lighttpd
で lighttpd を起動し、/item/show/1 にアクセスすると Routing Error になる。
Recognition failed for "item/show/1"
/item/show/1 にアクセスするには /a/item/show/1 にアクセスしなければならない。('a' の部分は何でもよい)
webrick と mongrel では問題なかった。
できる範囲で動作を追いかけてみたが、 ActionController::Routing::RouteSet#recognize で使われている request.path が、webrick では /item/show/1 のように 先頭に / が付いているのに対し、lighttpd では item/show/1 のように先頭の / がなくなっていた。
また、webrick の場合は relative_uri_root が '' に、lighttpd の場合は '/' に設定されていた。 何か関係がありそうだが、今日のところは時間切れ。
(どうやら作業中とのことらしいので、作業前と思われる Rev.18 まで戻してみたが同様だった)
一応、config/environment.rb に
ActionController::AbstractRequest.relative_url_root = ""
と書いておけば問題ないようだ。
_ cuzic [まだリリースできない段階であるのに、検証くださいましてありがとうございました。 lighttpd での検証はちょっ..]
_ TrackBack [http://d.hatena.ne.jp/cuzic/20061127/1164633050 プログラミングは素晴..]
_ yanagi [すばやい対応ありがとうございました。日記をアップしてから1時間ほどで更新されていたのでびっくりしました。 ligh..]