ようへいの日々精進XP

よかろうもん

2018 年 08 月 11 日 (土)

ジョギング

  • 香椎浜 x 2 周
  • 右足踵付近に違和感, 痛みに変わる前になんとかしたい

日課

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

暑い

お陰様で洗濯物だけはよく乾く.

博多デート

奥さんが博多の美容院に行くというので, 待ち合わせて博多でデート...といきたかったんだけど, 軒並み飲食店に入れず. 結局, いつもの串カツのお店で夕飯を済ませる. 串カツが美味しいので良しとする. その後, ヨドバシカメラロナウドが CM に出ているシックスパッドを体感したり, ThinkPad L380 でいいよなあと実機を触りながら思った.

博多駅に戻ると改札に黒山の人だかりで, 嫌な予感がしたんだけど, 案の定, 鹿児島本線に血痕が付いてて警察が現場検証しているので運転見直しという状態. さて, これからどうしようか.

今日のるびぃ exercism 編 〜 Two Fer (1) 〜

ギョームで Ruby を触ることが無さすぎるので, exercism の問題を解くことにした.

概要

これも Hello World に近い感じで, クラスメソッドに対して引数 (name) があれば, 以下のように出力する.

"One for #{name}, one for me

引数がなければ, 以下のように出力する.

One for you, one for me

テスト

require 'minitest/autorun'
require_relative 'two_fer'

# Common test data version: 1.1.0 c080bdf
class TwoFerTest < Minitest::Test
  def test_no_name_given
    # skip
    assert_equal "One for you, one for me.", TwoFer.two_fer
  end

  def test_a_name_given
    # skip
    assert_equal "One for Alice, one for me.", TwoFer.two_fer("Alice")
  end

  def test_another_name_given
    # skip
    assert_equal "One for Bob, one for me.", TwoFer.two_fer("Bob")
  end

... 略 ...

  def test_bookkeeping
    skip
    assert_equal 1, BookKeeping::VERSION
  end
end

実装

class TwoFer
  class << self
    def two_fer(name = nil)
      return "One for you, one for me." if name == nil
      "One for #{name}, one for me."
    end
  end
end

クラスメソッドの定義については, 上記以外のパターンもあるけど割愛.

Run Test

$ ruby two_fer_test.rb
Run options: --seed 42860

# Running:

..S.

Finished in 0.001849s, 2163.3315 runs/s, 1622.4987 assertions/s.

4 runs, 3 assertions, 0 failures, 0 errors, 1 skips

You have skipped tests. Run with --verbose for details.

いい感じ.

今日の AWS ~ AWS 認定デベロッパー – アソシエイトレベルサンプル試験を解く (1) ~

公開されているサンプル試験問題を解く. なぜ, その答えになるのかをちゃんと理解する必要がある.

Q1. SQS の仕様について

設問

次の文のうち、SQS について正しく述べているものはどれですか?

A. メッセージは 1 回だけ配信され、先入れ先出しの順序で配信される。
B. メッセージは 1 回だけ配信され、配信順序は決まっていない。
C. メッセージは 1 回以上配信され、先入れ先出しの順序で配信される。
D. メッセージは 1 回以上配信され、配信順序は決まっていない。

正答

  • D (メッセージは 1 回以上配信され, 配信順序は決まっていない.)

メモ

  • AWS Black Belt Tech シリーズ 2016 - Amazon SQS / Amazon SNS
  • SQS で利用する識別子
    • Queue URL
    • Message ID
    • Receipt Handle (受信ハンドル)
      • 同一メッセージでも, 受信ハンドルは異なるので, メッセージの削除の際は最新の受信ハンドルを用いる
  • SQS のコスト
    • 毎月 100 万キューイングまでは無料
    • 同一リージョン内での SQS と EC2 インスタンスのデータ転送は無料
  • メッセージは削除しない限りは複数回受信が可能, また, 受信の順番は送信の順番とは異なる場合がある (配信の順序は決まっていない)
    • 順序を保証しなければいけない場合, アプリケーションの実装で頑張る必要がある
    • 一部のリージョンでは FIFO キューという送受信の順序が同じキューも利用可能

Q2. AMI の仕様について

設問

EC2 インスタンスAmazon マシンイメージ(AMI)から起動されます。次のうち、パブリック AMI について当てはまるものはどれですか ?

A. そこの AWS リージョンであっても EC2 インスタンスを起動するために使用できる。
B. その AMI が格納されている国で EC2 インスタンスを起動するためにのみ使用できる。
C. その AMI が格納されている AWS リージョンで EC2 インスタンスを起動するためにのみ使用できる。
D. その AMI が格納されている AWS アベイラビリティーゾーンで EC2 インスタンスを起動するためにのみ使用できる。

正答

  • C (その AMI が格納されている AWS リージョンで EC2 インスタンスを起動するためのみ使用出来る.)

メモ

  • Amazon マシンイメージの略
  • パブリック AMI については, リージョン毎に AMI が存在する

Q3. 引き続き, SQS の仕様

設問

... SQS キューからタスクを処理して実行するバックエンドインスタンスは、キューを可能な限り頻繁にポーリングして、処理を早く行えるようにしています。しかし短い周期でのポーリングによって、処理すべきタスクがない空のレスポンスが返り CPU が無駄に消費される可能性があります。空のレスポンスの数を減らすには、どうすればよいですか?

A. キューの VisibilityTimeout 属性を 20 秒に設定する。
B. キューの ReceiveMessageWaitTimeSeconds 属性を 20 秒に設定する。
C. キューの MessageRetentionPeriod 属性を 20 秒に設定する。
D. メッセージの DelaySeconds パラメータを 20 秒に設定する。

正答

  • B (キューの ReceiveMessageWaitTimeSeconds 属性を 20 秒に設定する)

メモ

  • ReceiveMessageWaitTimeSeconds (いわゆるロングポーリング) を設定する
  • ReceiveMessageWaitTimeSeconds とは
    • 返信するメッセージがない場合, 偽の空のレスポンスを排除して空のレスポンスの数を減らすことで, SQS の使用コストを削減する
  • VisibilityTimeout とは
    • 複数の consumer が稼働している場合, 1 つの consumer が受信した後, 他の consumer には一時的 (デフォルトは 30 秒) メッセージを見せない機能
    • consumer1 が処理に失敗しても, 他の consumer で処理が継続出来る
  • MessageRetentionPeriod
    • SQS がメッセージを保持する秒数
    • デフォルト値は 345600 秒 (4 日)
  • DelaySeconds
    • 遅延キュー
    • キューへの新しいメッセージの配信を数秒延期することが出来る
    • デフォルト値は 0 秒

フムフム.