2004-01-15 昨日の雪はものすごかった。
_ 代車埋没!
車検中です。代車はれがすぃです。乗り心地はなかなかですが、ATはやっぱり慣れません。
どこでギアが変わるか分からないのが嫌。
CVTは好きです。スバルの上位モデルってCVT採用しないのかな?
そんな中、今朝は代車が埋没してました。
1時間発掘しましたが、無理だったのであきらめました。(^^;)
駐車場に除雪入らないと無理。
帰るまでには入ってるだろうからリベンジです。
明日返せなかったらどうしよう。。。
_ 英語 "i have done - i did"
■
i did : 時間まで指定して過去のこと
i have done : 時間は問わない過去のこと とか まだ時間枠が続いているとき
ex)今朝コーヒー飲んだ。
i drank coffee this morning.(今は昼とか夜とか既に朝じゃないとき)
i have drunk coffee this morning.(今はまだ朝のとき)
■
会話の切り出しは i have done で。続きはi did で。
i did で始めると唐突な感じらしい。
ex) i've bought a macG5! it's very cool machine . 〜
■
Have you ever done ? 聞く人が「ありえない(可能性低い)」と思ってる。
Have you done ? 聞く人が「ありえる」と思ってる。
Have you ever been to England ? イギリス行ったことないっしょ?
Have you been to Tokyo ? 東京行ったことある?
_ 日経linux 2003/12
記事メモ。
■Compressed Caching
メモリを圧縮領域と非圧縮領域にわけ、圧縮領域にキャッシュものを格納。
キャッシュヒット率を上げる。
■distcc
分散コンパイル版gcc
■読み切りSamba構築
2005-01-15
_ 送別会
昨日は12月で退職した同期の送別会へいってきた。
うちら同期はなぜか全員集まっての飲み会をしたことがなく(1人欠けた飲み会はいくつか)
最初で最後の全員での飲み会となった。(笑)
カラオケで4時まで熱唱。
♪マツケンサンバ〜
寝たら6時だったけど、9時に目が覚める。
これが噂の年取ると早く目が覚めるってやつか。(^^;)
2006-01-15
_ お年玉付年賀はがき抽選
今年も抽選日がやって参りました。
全25枚ほどのチェックをしたところ、
「もとぢに出そうとして書き損じた1枚」
が切手シート当選!ファインプレー!>自分(笑)
今年は引っ越しの連絡をしたいこともあり、
年賀状を早めに書き終えたことはよかったです。
でも枚数は年々減ってます。
基本方針として普段会ってる人にはあまり出さないのですが、
昔からの知り合いもメールで済ませてしまうことも影響しているかもしれません。
ところで、切手シートの番号、例年は3つじゃなかったでしたっけ?
_ ルータのDNSサーバ設定はとても大事
Bフレッツに変えてから、どうにもアクセスが遅かった。
セッションが張られて転送が始まると速いのだけど、
そこまでがすごくもたもたしている感じ。
#なので、転送速度測定ではそれなりの速度が出ている。
ルータの設定を調べてみたら、DNSサーバの設定がしてなかったので、
プロバイダのページで調べて設定してみた。
#ついでにmacのTCP/IPの設定のところもしてなかったので設定。
結果、改善。
なんだ、こんな基本的なところではまっていたのか。。。
まだまだ修行が足りないなと思った今日この頃です。
確か前にも改善しようと思ってDNSサーバの設定でしょと思って調べたのだけど、
その時にはルータ設定のUIで設定場所がみつからずに諦めた覚えが。
ってことは知識云々の前に注意力の問題か。(^^;)
もしくはniftyのDNSサーバのアドレスが分からなかったのかも。
#設定ページからなぜか辿りつけずぐぐった。
_ ファイナルファンタジーXII
amazonで予約できるようになりましたね。
特典は"FFXII/iTunes Custom Card"で、iTMSで曲をDLできるというもの。
おお、これはうれしいなぁ。
特典にiTMSが使われる時代になったのですね。
発売は3/16。さて、どこで買おうかな。
yodobashi.comはまだ予約できないので、このまま素直にアマゾンでいいかな。
それと、ファイナルファンタジーのロスライブCDも2月に発売。
こちらも楽しみです。
2021-01-15
_ has_secure_password から devise へ移行
has_secure_passwordをつかってdigest化してたパスワードデータをそのまま使ってdeviseへ移行できることを確認した。調べたことまとめ。
結論
- has_secure_passwordもdeviseもBCryptをつかってdigest化しているので、アルゴリズムはそのままで、BCrypt::Engine.costの値を揃えればどちらでも利用できる
- DBとモデルの移行について書いた
- deviseはコントローラ、ビューでもいろいろやってくれるので、そちらの対応は別途必要
- サンプルコード: https://github.com/igaiga/rails611_ruby300_secure_password_to_devise
バージョン
- Ruby 3.0.0
- Rails 6.1.1
- devise 4.7.3
- bcrypt 3.1.16
has_secure_passwordのdigest化コード
- ActiveModel::SecurePassword
- gems/activemodel-6.1.1/lib/active_model/secure_password.rb
digest化
-
BCrypt::Password.create(unencrypted_password, cost: 12)
でdigest化している -
secure_password.rb
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost
self.public_send("#{attribute}_digest=", BCrypt::Password.create(unencrypted_password, cost: cost))
- 実行して確認したところ、デフォルトでは以下の値だった
- BCrypt::Engine::MIN_COST= 4
- BCrypt::Engine.cost= 12
- cost= 12
authenticate
-
BCrypt::Password.new(attribute_digest).is_password?(unencrypted_password)
で確認している -
secure_password.rb
define_method("authenticate_#{attribute}") do |unencrypted_password|
attribute_digest = public_send("#{attribute}_digest")
BCrypt::Password.new(attribute_digest).is_password?(unencrypted_password) && self
end
alias_method :authenticate, :authenticate_password if attribute == :password
deviseの動作について
コード
- lib/devise/models/database_authenticatable.rb
# authenticate
def valid_password?(password)
Devise::Encryptor.compare(self.class, encrypted_password, password)
end
...
# digest
def password_digest(password)
Devise::Encryptor.digest(self.class, password)
end
- lib/devise/encryptor.rb
module Devise
module Encryptor
def self.digest(klass, password)
if klass.pepper.present?
password = "#{password}#{klass.pepper}"
end
::BCrypt::Password.create(password, cost: klass.stretches).to_s
end
def self.compare(klass, hashed_password, password)
return false if hashed_password.blank?
bcrypt = ::BCrypt::Password.new(hashed_password)
if klass.pepper.present?
password = "#{password}#{klass.pepper}"
end
password = ::BCrypt::Engine.hash_secret(password, bcrypt.salt)
Devise.secure_compare(password, hashed_password)
end
end
end
authenticate
BCrypt::Engine.hash_secret(password, bcrypt.salt)
とBCrypt::Password.new(hashed_password)
とで比較- secure_compareは以下のようなコードで、技はあるようだが一致確認をやっているだけと考えてよさそう
def self.secure_compare(a, b)
return false if a.blank? || b.blank? || a.bytesize != b.bytesize
l = a.unpack "C#{a.bytesize}"
res = 0
b.each_byte { |byte| res |= byte ^ l.shift }
res == 0
end
digest化
BCrypt::Password.create(password, cost: klass.stretches).to_s
- has_secure_passwordでは
BCrypt::Password.create(unencrypted_password, cost: 12)
で暗号化している- costはデフォルト値
- deviseとhas_secure_password でどちらもBCrypt::Password.createをつかっているので、cost値を同じに調整すればいい
- deviseではstretches設定がcost値になる
- stretchesはモデルに書くdeviseメソッドの引数で指定できる
- 例:
devise :database_authenticatable, :registerable, :confirmable, :recoverable, stretches: 12
- has_secure_passwordでは
has_secure_passwordからdeviseへ移行
-
動作確認のために、has_secure_password時代にユーザーデータを作成しておく
-
devise gemをGemfileへ追加
-
$ bin/rails generate devise:install
- ちなみに config/initializers/devise.rbにもstrech設定があり、デフォルトは12になっている
config.stretches = Rails.env.test? ? 1 : 12
-
usersテーブルのカラム名を
password_digest
からencrypted_password
へ変更
class ChangeUserPasswordColumnName < ActiveRecord::Migration[6.1]
def change
rename_column :users, :password_digest, :encrypted_password
end
end
- Userモデルからhas_secure_passwordを消してdeviseの設定を追加
- stretchesは上述のconfig/initializers/devise.rbにデフォルトで書けるならその方がスッキリしてよさそう
class User < ApplicationRecord
devise :database_authenticatable, :registerable, stretches: 12
end
user.valid_password?(password)
でencrypted_password(=digest)が一致するか確認する
user.valid_password?("correct_password") #=> true
user.valid_password?("incorrect_password") #=> false
Before...
_ kzy [「得る」に関しては最近知ったのでしゃしゃり出ちゃいましたが、僕自身はそんなに拘っているわけじゃないです。元々がどうだ..]
_ いが [いらっしゃいませー。>あるとさん あ、身近に英語の先生がいたんじゃん。 これからも変なこと書いてたり補則ありましたら..]
_ いが [そっか、「ありえる」も正しいっぽいですね。 勉強になりました。 ありがとうございます。>kzy しかも「先祖返り」な..]