追記

いがいが日記


2021-02-19 [長年日記]

_ COVID-19対応生活日記

前回のコロナ対応生活日記は9月だったので随分経ってしまった。 https://igarashikuniaki.net/diary/20200902.html

正月は実家に帰らずに東京で過ごした。はじめて紅白歌合戦をラジオで聴いたらこれはこれでなかなか良いものだった。

2021年に入ってすぐ、東京の感染者が1000人を超えたあたりで緊急事態宣言が出た。当初1ヶ月の予定だったが、1ヶ月延長して現状では3月初旬までの予定となった。緊急事態宣言になるとランチの時間もお店から目に見えて人が減った。おそらく出社して仕事していた人たちが在宅に切り替えたのではないか。飲食店も休業するお店が増えた。コロナがはやりだしてそろそろ1年、飲食店の中には休業ではなくて閉店してしまうところもいくつか出てきている。また夜も20時までの営業が推奨され、守っているお店がほとんだ。

それ以外の点ではあまり変わりなく、ランチ営業をやっているお店も多いので生活にも特に影響はない。開店直後の空いている時間を狙って食べにいっている。持ち帰れりメニューがある店はできるだけ注文するようにしている。

ワクチンが世界平均よりはだいぶ遅れているが、そろそろ医療従事者向けの接種が始まりそう。一般人は年内に打てれば良い、くらいの予想だ。ワクチンというのは考えれば当たり前だが、打っても感染しないのではなくて、感染しても症状が極弱い状態で済む、というものだから、ワクチンを接種しても他の人にうつすリスクはゼロにはならなそうだ。接種後も当面はマスクが必要ということにようやく気づいた。とはいえ感染力も落ちると思うので、接種前よりは感染スピードが落ちるだろう。

オリンピックは森会長が失言辞職したが、中止にはなっていない。困ったことだがまだやる気があるようだ。

世界経済は株価が過去最高を記録したり、仮想通貨が過去最高額になったりと熱狂している。コロナに対する経済支援でお金がたくさん動いているからだろうと思う。もしもこのままコロナも落ち着き、バブルがはじけることもなかったら、未来に賞賛される経済政策になるのかもしれないし、そうなるのを願っている。「実態経済にそぐわないからバブルだ」と言う声もよく聞こえてくるが、株式市場がある現在の経済世界で実態とは何なのかよくわからなくなってきた。将来の期待を織り込んで株価は動くものだから、そもそも実態という言葉ほどは実態ではないのだろう。みんなの期待と株価が著しく離反したときがバブルという理解であっているのだろうか。


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

2021-01-03 [長年日記]

_ 「目標」よりも「目的地」

目標というものが昔から嫌いだ。制約を課されている窮屈な感じに嫌悪感を感じているようだ。社会人になってからは評価と結びついたりもして、良い印象がない。じゃあそれが嫌いになった原因なのか、いつから嫌いだったかと思い出して見ると、子供の頃から嫌いだったので、単にずっと嫌いなようだ。新年に目標を立てるのが嫌になって、「目標をつくらないのが目標」とした年もあったくらいだ。

一方で作戦を考えるのは好きで、どういう方向へ進むかを考えるのは嫌いではない。なので、「目標」という道具が私にあってないだけで、じゃあどういう道具だったらいいのかを考えていたら、「旅」のメタファーが良いのではないかと思いついた。

「目標」よりも「目的地」がいいのではないか。旅はきままなものなので目標のような束縛感も薄く、そこへ行くまでの旅程もたのしむように考えられる。さらに目的地からさらに先に足をのばしたい場所をいろいろ考えられるので、目標の達成時の断絶感も緩和される。

「目標を立てる」ことは「旅程をつくる」ことに相当する。以下のようなテンプレートに沿って考える。

  • 目的地
  • 目的地から見える世界の景色を妄想する
  • さらにその先に進むとしたらどんなところがあるか
  • 目的地へ行くための旅程を分解してみる
  • 旅程のたのしみを考える

「目標」よりもたのしさ成分がかなり多く、良い感じだ。過程も考えられる。「目標」は「局所的に切り出した」感が強く、ゴール付近にだけ焦点が当てられているが、実際は過程の方がずっと長いから、そこをどうするかが重要なはずだ。

今回考えたメタファーはもうひとつあって、「街づくり」も良いなと考えている。「目的地」についたら世界がそれによって変わっているから、そこに人が集まっているかもしれない。そう考えると「旅」よりも「街づくり」のメタファーが向いているケースがありそうだ。旅は1人で、街づくりはみんなでやるイメージなので、世界への影響を重視するならば「街づくり」がいいかもしれない。ただ、旅はほとんどの人がやったことあるからイメージしやすいが、街づくりの方がイメージが難しい。とくに「過程のたのしさ」のイメージがむずかしいが、創作にたのしさを感じる人にはこちらの方が向いているかもしれない。

「街づくり」のメタファーでは「目標を立てる」ことを以下のようなテンプレートに沿って考える。

  • つくりたい場所(店、公園、集会場などなど)
  • それによって作られる未来と、そこでみんながたのしんでいる様子を妄想する
  • それをさらに発展させたらどうなるか
  • それをつくるための過程を分解してみる
  • その場所をつくる過程でみんながたのしめることを考える

今年はこれらをつかってやりたいことを分解して考えてみたい。


2020-12-30 [長年日記]

_ tp-link AX10

ルータを買い換えた。tp-link AX10(AX1500)。WiFi6(IEEE 802.11ax)に対応している。6000円程で安かった。

しかしMacBookProはIntel版は未対応(M1版から対応)で、まだ802.11axで接続はできていない。なのでIEEE 802.11acで接続しているのかな。iPhone12は対応しているようで、ルータ側でモニタするとiPhoneの方が転送レートが良いと出ていた。

前のルータはtp-link AC1200で、こちらはIEEE 802.11acまでの対応。記録によると2018年7月に買ったようだ。

インターネットで速度測定してみたら上り下りとも今まで300Mbps程だったのが600Mbps程まで速くなった。すごい。WiFi側の接続形式が同じなので、ルータのWAN側の通信速度が上がったのか、ルータの処理速度が上がったのか。こういうこともあるのか。iPhoneでも同じ速度だったので、WiFi側は関係なくWAN側で速度が決まっているようだ。

tp-linkは管理画面が使いやすくてよい。WiFiでつないでブラウザからアクセスして設定できる。前のものとUIも似ていたので迷わずできた。また次に買うときも選びたくなる良いデザイン。


2020-12-29 [長年日記]

_ 2020年ふりかえり

ざっとふりかえり。こうしてみると去年と比べて挑戦したことは別に減ってない。出張や旅行が減っただけで、まとめると例年とあまり変わらない感じがする。

パーフェクトRails増補改訂版執筆

今年の前半はこれを書いてて終わった。コロナもあいまって今年前半の記憶があまりない。しばらく燃え尽きていた。

とちぎRuby会議09

家から基調講演させてもらった。はじめての長い時間のリモート講演で良い経験。とちぎへまた行きたい。

銀座Rails Vol.27

メイン講演をさせてもらった。河野君と協働できてたのしかった。

三鷹へ引っ越し

三鷹の家は新築で、ドアが車みたいに鍵をポケットにいれた状態でボタンを押すと開く。便利。床暖房あったかい。ついでに会社も三鷹へ引っ越した。

出勤

2月頃から出勤しなくなっていき、1社さんだけたまに出社を6月7月だけやって、7月を最後に出社はしていない。家で仕事できるのありがたい。

おつかれシャワー

june29さんのvlogにちょいちょい出させてもらっている。客観的に自分が話すところを見る良い練習になっている。

仕事

思ったよりもたくさんの仕事をいただけてありがたい。いくつかの仕事が入れ替わって新鮮な気持ちで働けている。新しい仕事に伴って契約などの事務仕事が多かった印象。会社では初めての期が終わって決算をやって1年間の流れがわかってきた。

いろいろ良い本読んだけど、一番は「人類と気候の10万年史」。10万年前まで解像度1年で記録がとれた研究に胸熱。

ドラム式洗濯機 TOSHIBA TW-127X8L

買った。電気なので乾燥機能どのくらいかなと思ったけどふんわり乾燥でとても良い。洗剤自動投入も便利なのだけど、いつもつかうコースがつけおきなのだけど、その時間を覚えさせる機能がないので毎回設定しているのは面倒。引越時に通路を通らずドアを外してもらった。

ホットクック KN-HW16F

冬にあたたかいものが食べたくなって買った。とてもよい。サイズも小さいやつと迷ったけど、今年版が小さい方にはなかったのでこれにした。1人でも多めにつくれて便利。ホットクックとヘルシオをつかって非同期料理を活用するようになった。時間をかけずにおいしいものが自宅で食べられて便利。


追記