ひとりなんとかカレンダー3日目

今日はrailsのhas_secure_passwordについて
これはrails3.1から?の機能で、
ハッシュ化されたパスワードをdbに保存して、認証時に入力されたパスワードをハッシュ化して認証する
というよくある流れを勝手にやってくれるという優れものです。

手順としては
Gemfileに

gem 'bcrypt-ruby'

と書いて

$ bundle install

して
モデルに

has_secure_password

と書いて、
そのモデルにstring型でpassword_digestという名前のカラムを作って終わりです。

User.create(login_id: "login_id", password: "password")
user = User.find_by_login_id("login_id")
user.authenticate("hoge")
#=> false
user.authenticate("password")
#=> userが返る

passwordというプロパティとauthenticateというメソッドが勝手に用意されます。

ちなみに、何度か作って消してを試すと分かると思いますが、
password_digestは同じ条件でも異なるものになります。
つまり、ちゃんとソルトが用いられているというわけです。
おそらくpassword_digest自体にソルトが含まれているためでしょう。
bcrypt-rubyのリファレンスあたりにそんなことが書かれていた、ような・・・

ひとりなんとかカレンダー2日目

Rangeのinclude?は普通に比較するよりめちゃくちゃ遅いぞって聞いたのでやってみました。

require "benchmark"
Benchmark.bm do |x|
  x.report{1000000.times{(0..10).include? 5}}
  x.report{1000000.times{0 <= 5 && 5 <= 10}}
end

user system total real
0.328000 0.000000 0.328000 ( 0.318018)
0.109000 0.000000 0.109000 ( 0.122007)

比較の仕方これであっているのでしょうか?
ぱっと見3倍程度の差があるようです。
内部実装についてはいつか見るかもしれません。

ひとりなんとかカレンダー

何を今更

1日目12日目の今日はRuby文字コードの範囲を指定して1文字1文字を配列として格納する処理です。
Rangeの部分をもう少しなんとかできないかなと思いつつこんな感じでしょうか。
というかRangeって文字コードの範囲なんていけたんですね・・・
パーセント記法で実装するとちょっとおもしろいかも・・・?

(" ".."~").to_a
#=> [" ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~"]