- ジョギング
- 日課
- AWS Certified Solutions Architect - Associate - RECERTIFICATION
- 今日のるびぃ exercism 編 〜 Nucleotide Count (1) 〜
- 今日の AWS ~ オブジェクトストレージ ~
ジョギング
- お休み
日課
- お休み
AWS Certified Solutions Architect - Associate - RECERTIFICATION
要は AWS の認定資格のうち, ソリューションアーキテクトの入門編であるアソシエイトレベルの試験を受けてきた. すごく疲れたけど, 一応, 合格することが出来て無事に再認定された.
引き続き, 試験の予定を入れているので, 今年中にプロフェッショナルレベルを含めた 5 つの資格を取るぞ.
今日のるびぃ exercism 編 〜 Nucleotide Count (1) 〜
ギョームで Ruby を触ることが無さすぎるので, exercism の問題を解くことにした.
概要
引数で与えられた DNA 文字列に各ヌクレオチドが何回出現するかを計算する.
テスト
require 'minitest/autorun' require_relative 'nucleotide_count' class NucleotideTest < Minitest::Test def test_empty_dna_strand_has_no_adenosine assert_equal 0, Nucleotide.from_dna('').count('A') end def test_repetitive_cytidine_gets_counted skip assert_equal 5, Nucleotide.from_dna('CCCCC').count('C') end def test_counts_only_thymidine skip assert_equal 1, Nucleotide.from_dna('GGGGGTAACCCGG').count('T') end def test_counts_a_nucleotide_only_once skip dna = Nucleotide.from_dna('CGATTGGG') dna.count('T') dna.count('T') assert_equal 2, dna.count('T') end def test_empty_dna_strand_has_no_nucleotides skip expected = { 'A' => 0, 'T' => 0, 'C' => 0, 'G' => 0 } assert_equal expected, Nucleotide.from_dna('').histogram end def test_repetitive_sequence_has_only_guanosine skip expected = { 'A' => 0, 'T' => 0, 'C' => 0, 'G' => 8 } assert_equal expected, Nucleotide.from_dna('GGGGGGGG').histogram end def test_counts_all_nucleotides skip s = 'AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC' dna = Nucleotide.from_dna(s) expected = { 'A' => 20, 'T' => 21, 'G' => 17, 'C' => 12 } assert_equal expected, dna.histogram end def test_validates_dna skip assert_raises ArgumentError do Nucleotide.from_dna('JOHNNYAPPLESEED') end end end
実装
class Nucleotide class << self def from_dna(dna) if ignore_word_included?(dna) raise ArgumentError end @dna = dna self end def count(w) @dna.count(w) end def histogram hist = Hash['A' => 0, 'T' => 0, 'C' => 0, 'G' => 0] @dna.split('').uniq.each do |w| hist[w] = @dna.count(w) end hist end private def ignore_word_included?(dna) (dna.split('').select { |w| ! w.match(/A|T|C|G/) }).size > 0 ? true : false end end end
Run Test
$ ruby nucleotide_count_test.rb Run options: --seed 57489 # Running: ........ Finished in 0.001976s, 4049.0522 runs/s, 4049.0522 assertions/s. 8 runs, 8 assertions, 0 failures, 0 errors, 0 skips
メモ
- メソッドチェインの実装方法を学べた
- 他の実装についても検討する
今日の AWS ~ オブジェクトストレージ ~
S3
基本仕様
- S3 にデータを保存するには, 特定のリージョンのバケットと呼ばれる格納先を作成し, その中に Key-Value 形式でファイルをアップロードする
- バケット名は全世界で一意であること
- 各オブジェクトには URL が付与され, HTTPS によるアクセスが可能
- マルチパートアップロード機能を利用した場合, 1 オブジェクトあたり 5TB
- マルチマーとアップロード機能を利用しない場合, 1 オブジェクトあたり 5GB
ストレージクラス
整合性
- S3 は格納したデータを複数のデータセンターに複製することで高いデータ耐久性を実現している
- 但し, 書き込み, 更新, 削除時のデータの整合性について注意が必要となる
以下, オブジェクトに対するアクション毎にざっくりと整理.
オブジェクトに対するアクション | 整合性の種類 | メモ |
---|---|---|
新規書き込み | 書き込み後の読み取り整合性 | アップロード直後は, オブジェクトにアクセス出来ないことがある |
上書き書き込み | 結果整合性 | 上書き後, オブジェクトにアクセスしても古いデータが返されることがある |
削除 | 結果整合性 | 削除後, 削除したはずのデータにアクセス出来ることがある |
アクセス制限とセキュリティ
- アクセスコントロールリスト (ACL)
- バケットポリシー
- 自アカウント内の IAM ユーザーやグループ, 他のアカウントのユーザーに対してアクセス許可を与えることが出来る
- 条件付きアクセス許可やアクセス拒否を設定することも出来る
- IAM ポリシー
- S3 へのアクセス許可を設定した IAM ポリシーを自アカウント内の IAM ユーザーやグループ, ロールに割り当てることが出来る
- 条件付きアクセス許可やアクセス拒否を設定することも出来る
- 他アカウントを指定したアクセス権は設定出来ない
その他, アクセス期間を限定した署名 (期限) 付き URLも設定可能.
オブジェクトの暗号化とアクセスログ
- AWS が管理する鍵やユーザーが管理する鍵を使って S3 上で暗号化するサーバーサイド暗号化
- クライアント側で事前に暗号化したデータを S3 バケットにアップロードするクライアントサイド暗号化
- アクセスログはベストエフォートで記録される為, 完全性は保証されない, また, タイムラグが発生する
静的 Web サイトホスティング機能
- S3 は Web サイトをホスティング出来る
- 静的な Web サイトに限られる
- EC2 を利用するよりも運用の負荷がコストを抑えることが出来る
- 指定したドメイン名でアクセスさせる為には, Route53 等の DNS サービスにより名前解決が必要となる
バージョニング機能
- バケット単位で指定可能
- オブジェクトの意図しない上書きや削除に対して有効 (操作前のオブジェクトを復元することが出来る)
ライフサイクル機能と Glacier へのアーカイブ
- 通常はほとんどアクセスすることがないようなデータは Glacier に保存することで, データの保存コストを抑えることが出来る
- Glacier へのデータ保存は, ライフサイクル機能を利用するか, SDK を利用して直接格納する
- Glacier からデータを取り出す場合, 3 ~ 5 時間程度, Glacier に保存している 5% の容量まではデータ取り出し費用は無料
フムフム.