トップ 最新 追記

活動日誌


2006-11-02

[Ruby] Logger.new(nil) で何もしない Logger が作れる

リファレンスマニュアルにもソースコード中のコメントにも書かれてはいないけど、 そういう実装になってる。


2006-11-09

[Rails]複数列での group by で count できないものか

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) がかなり気になるが、件数が少ないので)


2006-11-15

[Ruby]inject と send でメソッドチェイン

そういえば、こんなコードを書いたのでした。 (最終的にはなくなりましたが)

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

2006-11-24

[Ruby]CGI::Session での session ID 生成

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 を使うようになったため)


2006-11-26

[Ruby]Rubyist Magazine 0017 号発行

るびまの新刊 (そういえばオンラインマガジンでも「新刊」って言うんだろうか) が発行されました。

今回のインタビューは青木さんです。

http://jp.rubyist.net/magazine/?0017

なお、るびま編集部では編集者を募集しています。 私も編集者としてお手伝いしています。 興味のある方はるびま編集部 <magazine at jp.rubyist.net> までお問い合わせください。


2006-11-27

[Ruby][Rails]lighttpd + Relative Path プラグインの不具合

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 = ""

と書いておけば問題ないようだ。

本日のツッコミ(全3件) [ツッコミを入れる]

_ cuzic [まだリリースできない段階であるのに、検証くださいましてありがとうございました。 lighttpd での検証はちょっ..]

_ TrackBack [http://d.hatena.ne.jp/cuzic/20061127/1164633050 プログラミングは素晴..]

_ yanagi [すばやい対応ありがとうございました。日記をアップしてから1時間ほどで更新されていたのでびっくりしました。 ligh..]


2005|02|03|04|05|06|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|03|04|05|06|10|
2008|04|10|
2009|10|
2010|05|08|
2012|01|02|03|
2014|01|
トップ 最新