ようへいの日々精進XP

よかろうもん

2018 年 08 月 18 日 (土)

ジョギング

  • 香椎浜 x 2 周
  • カラッとして走りやすかったけど, なんか体が重いし, 体が動かない...

日課

  • 引き続き, 腰と腰に痛みがあるので止めといた

ミッション・インポッシブル

missionimpossible.jp

最新のミッション・インポッシブル〜フォールアウト〜を観てきた.

細かいことを言うと, ストーリ的に「んっ??」ってなる部分もあったけど, 一貫して冷や冷やしたし, トム・クルーズがガチでアクションしてて「すごい」としか思えなかった.

今日のるびぃ exercism 編 〜 Difference Of Squares (1) 〜

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

概要

総和の二乗と各自然数の二乗の総和の差分を求める.

  • The square of the sum of the first ten natural numbers is (1 + 2 + ... + 10)² = 55² = 3025.
  • The sum of the squares of the first ten natural numbers is 1² + 2² + ... + 10² = 385.

上記の 3025 と 385 の差分を求める.

テスト

require 'minitest/autorun'
require_relative 'difference_of_squares'

# Common test data version: 1.1.0 7a1108b
class DifferenceOfSquaresTest < Minitest::Test
  def test_square_of_sum_1
    # skip
    assert_equal 1, Squares.new(1).square_of_sum
  end

  def test_square_of_sum_5
    # skip
    assert_equal 225, Squares.new(5).square_of_sum
  end

  def test_square_of_sum_100
    # skip
    assert_equal 25_502_500, Squares.new(100).square_of_sum
  end

  def test_sum_of_squares_1
    # skip
    assert_equal 1, Squares.new(1).sum_of_squares
  end

  def test_sum_of_squares_5
    # skip
    assert_equal 55, Squares.new(5).sum_of_squares
  end

  def test_sum_of_squares_100
    # skip
    assert_equal 338_350, Squares.new(100).sum_of_squares
  end

  def test_difference_of_squares_1
    # skip
    assert_equal 0, Squares.new(1).difference
  end

  def test_difference_of_squares_5
    # skip
    assert_equal 170, Squares.new(5).difference
  end

  def test_difference_of_squares_100
    # skip
    assert_equal 25_164_150, Squares.new(100).difference
  end

...
  
  def test_bookkeeping
    skip
    assert_equal 4, BookKeeping::VERSION
  end
end

実装

class Squares
  def initialize(n)
    @n = n
  end

  def square_of_sum
    sum = (0..@n).inject(:+)
    # sum = (0..@n).inject(0) { |sum, n| sum + n }
    sum ** 2
  end

  def sum_of_squares
    sum = (0..@n).inject(0) { |sum, n| sum + n ** 2 }
    sum
  end

  def difference
    square_of_sum - sum_of_squares
  end
end

injectreduce に置き換えても OK 牧場.

class Squares
  def initialize(n)
    @n = n
  end

  def square_of_sum
    sum = (0..@n).reduce(:+)
    sum ** 2
  end

  def sum_of_squares
    sum = (0..@n).reduce(0) { |sum, n| sum + n ** 2 }
    sum
  end

  def difference
    square_of_sum - sum_of_squares
  end
end

Run Test

$ ruby difference_of_squares_test.rb
Run options: --seed 16699

# Running:

........S.

Finished in 0.001553s, 6439.1500 runs/s, 5795.2350 assertions/s.

10 runs, 9 assertions, 0 failures, 0 errors, 1 skips

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

いい感じ.

メモ

  • inject 結構便利
  • reduce は inject のエイリアス (と言っていいのかな??)

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

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

Q8. STS について

設問

企業ウェブアプリケーションAmazon VPC 内にデプロイし、IPSec VPN 経由で企業データセンターに接続しています。このアプリケーションは、オンプレミスの LDAP サーバーに対して認証を行う必要があります。認証後、ログインしたユーザーは、そのユーザーに固有の S3 キー空間のみにアクセスできます。この目的を満たすことができる方法を、次の中から 1 つ選んでください。

A. アプリケーションを LDAP に対して認証する。次に、アプリケーションで IAM Security Token Service を呼び出して、LDAP 認証情報を使用して IAM にログインする。アプリケーションでは、IAM の一時的な認証情報を使用して適切な S3 バケットにアクセスできる。
B. アプリケーションを LDAP に対して認証し、ユーザーに関連する IAM ロールを取得する。次に、IAM Security Token Service を呼び出して、その IAM ロールを引き受ける。アプリケーションでは、一時的な認証情報を使用して適切な S3 バケットにアクセスできる。
C. LDAP 認証情報を使用して、アプリケーションを IAM Security Token Service に対して認証する。これらの一時的な AWS セキュリティ認証情報を使用して、適切な S3 バケットにアクセスする。
D. LDAP に対して認証を行う認証ブローカーを開発し、IAM Security Token Service を使用して IAM フェデレーションユーザー認証情報を取得する。アプリケーションで認証ブローカーを呼び出して、適切な S3 バケットへのアクセスを有する IAM フェデレーションユーザー認証情報を取得する。
E. IAM Security Token Service に対して認証を行って IAM ロールを引き受け、一時的な AWS セキュリティ認証情報を取得する認証ブローカーを開発する。アプリケーションで認証ブローカーを呼び出して、適切な S3 バケットへのアクセスを有する AWS の一時的なセキュリティ認証情報を取得する。

正答

  • D (LDAP に対して認証を行う認証ブローカーを開発し、IAM Security Token Service を使用して IAM フェデレーションユーザー認証情報を取得する。アプリケーションで認証ブローカーを呼び出して、適切な S3 バケットへのアクセスを有する IAM フェデレーションユーザー認証情報を取得する。)

メモ

  • 設問や選択肢自体の日本語が分かり辛い
  • 設問としては, LDAP で認証させたユーザーに対して, 一時的に AWS リソースへのアクセスを許可するにはどうしたら良いか ということを問われているような気がする
  • 解答としては, ユーザー (アプリ) は認証ブローカーにリクエストを投げて, ブローカーが LDAP で認証し, 認証されたら STS に一時的な認証情報の取得を要求し, その情報を以て S3 にアクセスさせる...ってことなのかな

このあたりの理解は深めたいなー.

Q9. S3 の署名付き URL について

設問

広告収益モデルの写真共有ウェブサイトを運営しており、サイト訪問者への写真配信に S3 を使用しています。いつからかその写真に他のサイトが直接リンクを張るようになり、広告収益の減少を招いていることに気づきました。この影響を緩和するにはどの対策が効果的ですか?

A. 静的コンテンツに CloudFront ディストリビューションを使用する。
B. パブリックの読み込み権限を削除し、有効期限付きの署名 URL を使用する。
C. 被害を及ぼしているウェブサイトの IP をセキュリティグループで遮断する。
D. 写真をウェブサーバーの EBS ボリュームに保存する。

正答

  • B (パブリックの読み込み権限を削除し、有効期限付きの署名 URL を使用する。)

メモ

  • 署名付き (有効期限付き) URL を発行する

Q10. S3 の仕様

設問

アプリケーションで 6 GB のファイルを Simple Storage Service にアップロードしようとしていますが、「指定されたアップロードは、アップロード可能な最大オブジェクトサイズを超えています。」というメッセージが表示されます。これを解決する方法はありますか?

A. ない。Simple Storage Service オブジェクトは 5 GB に制限されている。
B. このオブジェクトにマルチパートアップロード API を使用する。
C. このオブジェクトに大きなオブジェクトのアップロード API を使用する。
D. サポートに連絡してオブジェクトサイズ制限を増やす。
E. 異なるリージョンにアップロードする。

正答

  • B (このオブジェクトにマルチパートアップロード API を使用する。)

メモ

  • 1 ファイル最大 5TB まで
  • 1 回にアップロード (1 つの PUT) 出来るサイズは 5GB まで, 5GB を超える場合にはマルチパートアップロード API を利用する
  • バケット内のオブジェクト数は無制限

フムフム.