«前の日(01-14) 最新 次の日(01-16)» 追記

いがいが日記


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構築

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

Before...

_ kzy [「得る」に関しては最近知ったのでしゃしゃり出ちゃいましたが、僕自身はそんなに拘っているわけじゃないです。元々がどうだ..]

_ いが [いらっしゃいませー。>あるとさん あ、身近に英語の先生がいたんじゃん。 これからも変なこと書いてたり補則ありましたら..]

_ いが [そっか、「ありえる」も正しいっぽいですね。 勉強になりました。 ありがとうございます。>kzy しかも「先祖返り」な..]


2005-01-15

_ 送別会

昨日は12月で退職した同期の送別会へいってきた。

うちら同期はなぜか全員集まっての飲み会をしたことがなく(1人欠けた飲み会はいくつか)

最初で最後の全員での飲み会となった。(笑)

カラオケで4時まで熱唱。

♪マツケンサンバ〜

寝たら6時だったけど、9時に目が覚める。

これが噂の年取ると早く目が覚めるってやつか。(^^;)

_ 国際貢献

友人ジョン(イギリス人)に「カラオケってします?」って(日本語で)聞かれたので

マツケンサンバを教えてあげた。(笑)

これは日本人として正しい行動だろうか?

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

_ たく [3月で退職した・・・って去年の話かー。へっ、もう4月だっけか?とか考えてしまったよ。(^^;)]

_ いが [あー、間違えたー!! 脳内4月気分でした。 12月にこっそり訂正させていただきます。]


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月に発売。

こちらも楽しみです。

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

Before...

_ いが [私は子供の頃にレターセットとやらを当てたことがあります。 その上は難しいですね。 でも賞品を見ると、1等よりもふるさ..]

_ satoyu [年賀状といえば…きょうはこれに笑わせてもらいました。表面で頑張りますか!!(笑 http://pya.cc/pyai..]

_ いが [がんばって配達している郵便屋さんに心暖まるメッセージですね。(笑)]


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から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

«前の日(01-14) 最新 次の日(01-16)» 追記