ひとりなんとかカレンダー
3日坊主
ネタがある日はいいけど無い日が困る
Selenium RC server を使ったテスト周りについてそのうち書きたい
ひとりなんとかカレンダー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", "{", "|", "}", "~"]