ようへいの日々精進XP

よかろうもん

2018 年 08 月 05 日 (日)

ジョギング

  • 香椎浜 x 2 周
  • 引き続き, 徹底的に熱い (暑いではなく, もはや熱い)

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

熱中症気味

油断して 10 時過ぎに走りに行ってしまった為, その後, ひどい頭痛と倦怠感があってダラダラ過ごしていた.

今日のるびぃ ~ 例外 ~

例外の理解がイマイチなので, パターン別に挙動を確認する. 尚, irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

パターン 1

# パターン 1-1 (StandardError を継承している場合)
class MyError1 < StandardError; end

begin
  raise MyError1
rescue => e
  puts "StandardError!!"
end
puts "End"

# irb での出力結果
... 略 ...
StandardError!!
=> nil
irb(main):008:0> puts "End"
End
=> nil

# パターン 1-2 (StandardError を継承していない場合)
class MyError1; end

begin
  raise MyError1
rescue StandardError => e
  puts "StandardError!!"
end
puts "End"

# irb での出力結果
StandardError!!
=> nil
irb(main):008:0> puts "End"
End
=> nil
  • 任意のクラス (例: MyError1) が StandardError を継承している場合には, StandardError で例外が捕捉される
  • StandardError を明示的に継承していない場合でも, StandardError で例外が捕捉される

パターン 2

# パターン 2
class MyError1 < StandardError; end

begin
  raise MyError1
rescue MyError1 => e
  puts "MyError1"
rescue StandardError => e
  puts "StandardError!!"
end
puts "End"

# irb での出力結果
... 略 ...
MyError1
=> nil
irb(main):010:0> puts "End"
End
=> nil
  • 例外オブジェクトのクラスは MyError1 なので, 7 行目の MyError1 で rescue される
  • StandardError を継承している場合でも, 例外オブジェクトのクラス名で rescue されていれば, そちらの方が優先される

パターン 3

# パターン 3
class MyError1 < StandardError; end
class MyError2 < MyError1; end

begin
  raise MyError1
rescue MyError2 => e
  puts "MyError1"
rescue StandardError => e
  puts "StandardError!!"
end
puts "End"

# irb での出力結果
... 略 ...
StandardError!!
=> nil
irb(main):011:0> puts "End"
End
=> nil
  • 例外オブジェクトのクラスは MyError1 なので, MyError2 では rescue 出来ずに, その次の StandardError で rescue される

パターン 4

# パターン 4
class MyError1 < StandardError; end
class MyError2 < MyError1; end

begin
  raise MyError2
rescue MyError1 => e
  puts "MyError1"
rescue StandardError => e
  puts "StandardError!!"
end
puts "End"

# irb での出力結果
... 略 ...
MyError1
=> nil
irb(main):011:0> puts "End"
End
=> nil
  • 例外オブジェクトのクラスは MyError2 だが, MyError2 は MyError1 を継承している為, MyError1 でも rescue される

パターン 5

# パターン 5
class Error1 < StandardError; end
class Error2 < Error1; end
begin
  raise Error2
rescue Error1 => ex
  puts ex.class
end

# irb での出力結果
... 略 ...
Error2
=> nil
  • 例外オブジェクトのクラスは MyError2 だが, MyError2 は MyError1 を継承している為, MyError1 でも rescue される
  • また ex.class で例外オブジェクトのクラス名を取得している

今日の AWS ~ S3 ~

ストレージクラス

  • スタンダード (耐久性 99.999999999% で, リージョン内の 3 箇所のデータセンターに保存)
  • 冗長化 (耐久性 99.99% でコストはスタンダードよりも低い)
  • 低頻度アクセス

S3 の整合性について

  • S3 は格納したデータを複数のデータセンターに複製することで高いデータ耐久性を実現している
  • 但し, 書き込み, 更新, 削除時のデータの整合性について注意が必要となる

以下, オブジェクトに対するアクション毎にざっくりと整理.

オブジェクトに対するアクション 整合性の種類 メモ
新規書き込み 書き込み後の読み取り整合性 アップロード直後は, オブジェクトにアクセス出来ないことがある
上書き書き込み 結果整合性 上書き後, オブジェクトにアクセスしても古いデータが返されることがある
削除 結果整合性 削除後, 削除したはずのデータにアクセス出来ることがある

フムフム.