ようへいの日々精進XP

よかろうもん

2018 年 04 月 20 日(金)

ジョギング

  • 香椎浜 x 2 周
  • 走りやすい日が続いている

日課

  • お休み

fukuoka.ex #8 に参加した

fukuokaex.connpass.com

@piacere_ex さんの Excel で表現するとどうなるかを比較しながら Enum モジュールを説明しているのがマジ神がかって解りやすかった.

speakerdeck.com

ゴールデンウィークに改めて入門してみようかなと思っていたら, @piacere_ex さんに早速振られて笑った.

あと, @zacky1972 さんの独自実装 Erlang VM である, ZEAM の話も面白かったが, 話の前半で「並行と並列」の違いについての説明が目から鱗だった.

並列Elixirプログラミングことはじめ〜ZEAMで目指すことは何か

今日のるびぃ ~ awspec に送った pull request ~

今回送った pull request

github.com

S3 バケットを構成をテストするリソース (s3_bucket) に lifecycle rule を生成する Generator を追加した.

地味に大変だった

aws-sdk-ruby の get_bucket_lifecycle_configuration で取得した情報から, 以下のようなテストコードに変換するのが地味に大変だった.

describe s3_bucket('my-bucket') do
  it do
    should have_lifecycle_rule(
      id: 'MyRuleName',
      noncurrent_version_expiration: { noncurrent_days: 1 },
      expiration: { days: 2 },
      transitions: [{ days: 3, storage_class: 'GLACIER' }],
      status: 'Enabled'
    )
  end

  it do
    should have_lifecycle_rule(
      id: 'MyRuleName2',
      prefix: '123/',
      noncurrent_version_expiration: { noncurrent_days: 2 },
      expiration: { days: 3 },
      transitions: [{ days: 5, storage_class: 'STANDARD_IA' }, { days: 10, storage_class: 'GLACIER' }],
      status: 'Enabled'
    )
  end
end

特に, transitions: [{ days: 3, storage_class: 'GLACIER' }], の部分.

get_bucket_lifecycle_configuration で取得すると, 以下のようなハッシュで返ってくるんだが...

[{:days=>3, :storage_class=>"GLACIER"}]

これを,

[{ days: 3, storage_class: 'GLACIER' }],

に書き換えるのに一週間以上の時間を要した...

Fukuoka.rb にて

結局, Fukuoka.rb に参加して, @udzura さんや @k1LoW さんの助言を頂きつつ, 以下のようなコードになった.

def generate_lifecycle_rule_transitions_spec(transitions_rule)
  rules = []
  transitions_rule.each do |line|
    elements = []
    line.each do |k, v|
      elements << case v
                  when Numeric
                    "#{k}: #{v}"
                  when String
                    "#{k}: '#{v}'"
                  else
                    "#{k}: '#{v.inspect}'"
                  end
    end
    rules << '{ ' + elements.join(', ') + ' }'
  end
  '[' + rules.join(', ') + ']'
end

ポイントは以下の通り.

  • 地道に Array から要素となる Hash を取り出して, Key と Value を each で回す
  • Value のクラスを case 文で Numeric と String で分岐させる
  • Numeric と String クラス以外のデータが value に定義されている場合は, 人間に解りやすい状態で出力する (inspect メソッドを利用する)

ということで, 無事にリリースすることが出来た.

Fukuoka.rb には, 以前から行きたい, 行きたいと思っていたけど, もっと早く行くべきだったと思った次第.

アリガトウゴザイマス.