AWSストレージ メモ

AWSのストレージに関してメモ。
他に気づいた事や気になる事があれば、随時追記するかも。

ストレージの種類

インスタンスストア(instance-store, エフェメラルストレージ Ephemeral Storage, Ephemeral Disk)

このストレージは、ホストコンピュータに物理的にアタッチされたディスク上にある。
頻繁に変更される情報 (バッファ、キャッシュ、スクラッチデータ、その他の一時コンテンツなど) の一時ストレージに最適。

暗号化

?

スナップショット

取得できない

アクセス

単一AZの単一EC2インスタンスからアクセス。

特徴

インスタンスを停止または終了すると消える。
別のEC2に付け替え出来ない。
インスタンスタイプごとにストレージのサイズが異なる。

EBS

説明

Elastic Block Storeの略。
AWS クラウド内で Amazon EC2 インスタンスと組み合わせて使用できる、永続的なブロックストレージボリューム。

耐久性

単一AZに冗長的に保存される。

■年間故障率

年間故障率(AFR)が 0.1%~0.2% になるように設計。
この場合の「故障」とは、ボリュームのサイズやパフォーマンスに応じて、ボリュームが完全に、または部分的に失われることを指す。
例:一般的な市販のディスクドライブ (4% 前後の AFR で故障) の 20 倍の信頼性。

https://aws.amazon.com/jp/ebs/details/

ボリュームの耐久性を左右する要因としては、ボリュームのサイズと、最後のスナップショット以降に変更されたデータの割合の両方があります。
例えば、Amazon EBS の最新スナップショット以降に変更されたデータの量が 20 GB 以下であるボリュームでは、年間故障率(AFR)は 0.1%~0.5% であることが期待できます。
この場合の「故障」とは、ボリュームがまったく使用できなくなることを指します。

https://forums.aws.amazon.com/thread.jspa?threadID=148320

可用性

EBSのどのボリュームも、99.999% の可用性を維持する設計

製品の詳細 - Amazon Elastic Block Store(ブロックストレージ)|AWS

アクセス

単一AZの単一EC2インスタンスからアクセス。

暗号化

選択可能

スナップショット

取得可能

ボリュームタイプ

EFS

説明

Elastic File Systemの略。
S3レベルの耐久性、復数EC2からアクセス可能というのが特徴。

耐久性、可用性

複数AZに冗長的に保存、自動修復

アクセス

複数AZの1~数千のEC2インスタンスから同時接続可能

暗号化

選択可能

注:2017/9時点でTokyoリージョン(ap-northeast-1)ではまだ使えない

S3

説明

Simple Storage Serviceの略。圧倒的な耐久性と様々な機能が特徴。

容量

格納可能なデータの総量とオブジェクトの数には制限はありません。
個別の Amazon S3 オブジェクトのサイズは、最低 0 バイトから最大 5 テラバイトまでさまざまです。
1つの PUT にアップロード可能なオブジェクトの最大サイズは 5 GB です。
100 MB 以上のオブジェクトの場合は、Multipart Upload 機能を使うことをお考えください。

よくある質問 - Amazon S3(クラウドストレージ)|AWS

料金

S3の料金体系が分かりにくいと聞かれたので纏めた - Qiita
探した中ではわかりやすかった。元の内容が複雑なので、簡単に説明するには限界がある。

ストレージクラス

3種類ある

  • 標準
  • 標準-IA (別名:標準-低頻度アクセス)
  • Amazon Glacier

公式ページの比較表

アクセス

EC2インスタンスにマウント不可
(非公式でs3fs,goofysという選択肢もあるが、調べた限りでは課題があり)

耐久性

99.999999999%

可用性

標準: 99.99%
標準-IA: 99.9%
Amazon Glacier: 該当なし

最初のバイトのレイテンシー

標準: ミリ秒
標準-IA: ミリ秒
Amazon Glacier: (分または時を選択してください)

暗号化

選択可能

ファイルの暗号化は、クライアントサイドが1種類、サーバーサイドが3種類あります。
お客様が用意したキーによるクライアントサイドの暗号化 (CSE)
Amazon S3 で管理されたキーによるサーバーサイドの暗号化 (SSE-S3)
お客様が用意したキーによるサーバーサイドの暗号化 (SSE-C)
AWS KMS で管理されたキーによるサーバーサイドの暗号化 (SSE-KMS)

Amazon S3 の暗号化されたデータファイルを Amazon Redshift にロードする | Developers.IO

注:オプション指定なしで、S3間でコピーした場合、暗号化が解除される。(SSE-S3)

格納場所

最初にリージョンを指定。
リージョン内では、オブジェクトは複数の施設で、複数のデバイス上に、冗長的に格納されます。

イベント通知機能

Amazon S3 のイベント通知は、Amazon S3 でオブジェクトがアップロードまたは保存されたときのアクションに対する応答で送信できます。
通知メッセージは Amazon SNS または Amazon SQS で送信でき、AWS Lambda に直接配信して AWS Lambda 機能を呼び出すこともできます。

Amazon S3 イベント通知の設定 - Amazon Simple Storage Service

クロスリージョンレプリケーション機能

異なる AWS リージョンにあるバケット間でオブジェクトを自動的に非同期コピーする機能です。
クロスリージョンレプリケーション機能を有効にすると、Amazon S3 は、新しく作成されたオブジェクト、オブジェクトの更新、オブジェクトの削除を、レプリケート元バケットから他のリージョンのレプリケート先バケットにレプリケートします。

クロスリージョンレプリケーションルールを S3 バケットに追加する方法 - Amazon Simple Storage Service

バージョニング機能

デフォルトでは無効。

他にもいろんな機能がある

Storage Gateway

使うことがないので省略

Javaのコレクションフレームワークまとめ

Javaのスレッドセーフなコレクションについて調べてみたら、複雑過ぎて頭がクラクラしてきた。
けど、まとめていく過程で自分なりに理解できた気がする。
各クラスのメソッドについてはあまり記載してない。

f:id:sato_susumu:20170913202638j:plain

レガシークラス

古いクラスなので基本は使わない。

レガシークラス 対応するクラス
Vector ArrayList
Stack LinkedList
HashTable HashMap

コレクション インタフェース

java.util直下のインタフェース

インタフェース 説明 補足
java.util.List リスト 順序付けされたコレクション
java.util.Queue キュー JavaではFIFOとは限らない。
java.util.Deque 両端キュー デックと読む。デキューではない。Double Ended Queueの略。
java.util.Set セット 重複した要素を許可しないコレクション
java.util.Map マップ キーと値のペアを扱うコレクション
java.util.SortedSet キー順にソートされたSet Setのサブインタフェース
java.util.SortedMap キー順にソートされたMap Mapのサブインタフェース
java.util.NavigableSet 指定したキーに近い内容を取得することができるSet SortedSetのサブインタフェース
java.util.NavigableMap 指定したキーに近い内容を取得することができるMap SortedMapのサブインタフェース

java.util.concurrent.BlockingQueue

Queueのサブインターフェース。
BlockingQueueの実装は容量を制限している場合がある。

BlockingQueueのメソッドのサマリー

例外のスロー 特殊な値 ブロック タイム・アウト
挿入 add(e) offer(e) put(e) offer(e, time, unit)
削除 remove() poll() take() poll(time, unit)
検査 element() peek() 適用外 適用外

BlockingQueue (Java Platform SE 8) より

  • add(e), remove(), element()は処理できないと例外発生する
  • offer(e)
    要素追加。容量が空いてなければfalseを返す。
  • put(e)
    要素追加。容量が空いてなければ待機。
  • poll()
    キューの先頭を取得して削除。キューが空の場合はnullを返す。
  • take()
    キューの先頭を取得して削除。必要に応じて、要素が利用可能になるまで待機。
  • peek()
    キューの先頭を取得するが、削除しない。キューが空の場合はnullを返す。

java.util.concurrent.BlockingDeque

BlockingQueueのサブインターフェース。
両端キュー

java.util.concurrent.TransferQueue (1.7)

BlockingQueueのサブインターフェース。

java.util.concurrent.ConcurrentMap

スレッドの安全性と原子性の保証を提供するMapです。

java.util.concurrent.ConcurrentSetはない

java.util.concurrent.ConcurrentNavigableMap

NavigableMapオペレーションをサポートするConcurrentMap。
指定した値にもっとも近い内容を取得することができる

java.util.concurrent.ConcurrentNavigableSetはない

同期化、並列化されていないコレクション実装

  • java.util」の直下に所属するコレクションの実装
  • スレッドセーフではない
  • イテレート中に(主に別スレッドで)操作を行った場合、ConcurrentModificationException が投げられる。
    toStringなど、内部でイテレート処理が走ることがあるので注意。
インタフェース ハッシュ表 サイズ変更可能な配列 バランス・ツリー リンク・リスト ハッシュ表+リンク・リスト
Set HashSet TreeSet LinkedHashSet
List ArrayList LinkedList
Deque ArrayDeque LinkedList
Map HashMap TreeMap LinkedHashMap

Collections Frameworkの概要 より

java.util直下の実装
クラス名 補足
java.util.ArrayList 配列実装List
java.util.LinkedList リンクノードに基づくList。List、Queue、Dequeインタフェースを実装
java.util.HashSet ハッシュテーブル実装Set
java.util.HashMap ハッシュテーブル実装Map
java.util.TreeSet バランスツリー実装のSet。NavigableSetを実装。
java.util.TreeMap バランスツリー実装Map NavigableMapを実装。
java.util.PriorityQueue 同期化されてないので注意。|スレッドセーフである必要が有る場合はPriorityBlockingQueueクラスを使用。

同期化コレクション

  • Vector」や「Hashtable」や「Collections.synchronizedXXX()による同期化ラッパー」のこと。
  • 要素の内容の変更があるようなメソッドは、全てsynchronizedになっているのが特徴。
  • 同期コレクションはロックによりコレクションの操作を1スレッドに限定
  • イテレート中に操作を行った場合、ConcurrentModificationException が投げられるのはラッパー使用前と同様。

java.util.Collections.synchronizedXXX()による同期化ラッパー

指定されたコレクションに連動する同期(スレッドセーフな)コレクションを返す。

例:

List<String> list = Collections.synchronizedList(new ArrayList<String>());  
Set<String> set = Collections.synchronizedSet(new HashSet<String>());  
Map<String, String> map = Collections.synchronizedMap(new HashMap<String, String>());  

並行コレクション(並列コレクション)

  • 「CopyOnWriteArrayList」や「ConcurrentHashMap」などJavaSE5.0より加わった「java.util.concurrent」以下にあるコレクションのこと。
  • マルチスレッドから同時操作できるように設計
  • 複合アクションに対応している。
  • イテレーション時にConcurrentModificationExceptionを発生させない。

CopyOnWriteArrayList

Copy-on-Write実装によるスレッドセーフList

Listの変更があった場合、新たなコピーを作成。
これによりアクセス時の同期が不要なる。
イテレート処理はイテレータが作られた時の状態で走査され、別スレッドからの変更の影響は受けない。

CopyOnWriteArraySet

Copy-on-Write実装によるスレッドセーフSet

ConcurrentHashMap

並行ハッシュテーブル実装によるMap

ConcurrentHashSetはない

ConcurrentHashMap.KeySetViewメソッドを使う。

ConcurrentSkipListMap

ConcurrentNavigableMapを実装したMap。
指定した値に近いキーを拾ってくることもできる。

ConcurrentSkipListSet

NavigableSetを実装したSet。
指定した値に近いキーを拾ってくることもできる。

キュー関連のまとめ

注意:容量指定がなくてもメモリがなければ例外は発生する。

クラス 方向 容量制限 ブロッキング 主な実装インタフェース
ArrayBlockingQueue FIFO あり ブロッキング BlockingQueue
LinkedBlockingQueue FIFO 任意 ブロッキング BlockingQueue
PriorityBlockingQueue 優先順位付きFIFO なし ブロッキング BlockingQueue
DelayQueue FIFO なし ブロッキング BlockingQueue
SynchronousQueue FIFO - ブロッキング BlockingQueue
LinkedBlockingDeque 双方向 任意 ブロッキング BlockingDeque
ConcurrentLinkedQueue FIFO なし ノンブロッキング Queue
LinkedTransferQueue FIFO なし ブロッキング or ノンブロッキング両方 TransferQueue

ArrayBlockingQueue

生成時に容量を指定。

LinkedBlockingQueue

生成時に容量を指定しても、しなくてもいい。

PriorityBlockingQueue

DelayQueue

遅延時間が経過後にのみ、要素を取得できる。

SynchronousQueue

値の追加は、値の取得が行われるまでブロックする。
値の取得は、値の追加が行われるまでブロックする。

  • 同期キューには、内部容量がまったくありません。
  • 要素が存在するのは削除しようとするときだけなので、同期キューで peek を実行することはできません。
  • 別のスレッドが削除を試みていないかぎり、どのメソッドを使用しても要素を挿入することはできません。
  • 反復するものが存在しないため、反復は実行できません。

LinkedBlockingDeque

生成時に容量を指定しても、しなくてもいい。

ConcurrentLinkedQueue

ノンブロッキング

LinkedTransferQueue (1.7)

ブロッキング、ノンブロッキング両方。

参考

Java並行・並列・非同期処理チートシート - Qiita

並列コレクションを使う | Java好き

java.util.concurrent (Java Platform SE 7 )

Java新機能メモ(Hishidama's Java up-to-date)

ドメイン名、ホスト名、FQDN、URLの説明でわかりやすかったサイトのメモ

ドメイン名やホスト名の説明をググってもわかりにくいページが多かった。
なので、わかりやすいページをメモ。

f:id:sato_susumu:20170909205448j:plain

ドメイン名、ホスト名、FQDNの関係

用語集「ドメイン・ホスト名とは?」

説明がシンプルで例が多い

URL、URN、URIの関係

用語集「URLとは?」

こちらもcmanさんのページ。URLについても説明がシンプルで例が多い。
cmanさんのページは他の説明もシンプルでわかりやすい。

ドメイン名の種類

ドメイン名の種類 - JPNIC

自分のIPアドレス確認、whois検索

https://www.cman.jp/network/

Volatileについて調べてみた

Volatileについてのまとめ

  • Volatileとは、対象となる変数のコンパイラー最適化を抑止する予約語
  • アトミック性、逐次性のいずれも保証されない。
  • もちろん排他制御されない
  • C言語はメモリモデルによっては可視性も保証されない?
  • volatile変数と非volatile変数との間では、コンパイラが2つの操作の実行順を入れ替える可能性がある
  • volatile変数が、その変数自体の以前の値にも他の変数にもまったく依存しないのであれば使えるケースもある。
    例:フラグ
    注:volatile変数同士であっても比較するケースでは使えない。

f:id:sato_susumu:20170909210617j:plain

一般的なVolatileの意味

揮発する、揮発性の、移り気な、気まぐれな、激しやすい、変わりやすい、不安定な
カナ:ボラタイル

Volatileが予約語かどうか

C:予約語
C#:予約語
Java:予約語
python:予約語ではない

Atomicな変数操作

  • Javaであればアトミック・クラスを使う
    例:AtomicInteger、AtomicBoolean、AtomicLong、AtomicIntegerArray
  • C++であれば、atomicクラステンプレート(std::atomic)を使う

Volatileとは(C言語)

アトミック性: 分割不可能な 1 単位の処理としてメモリ操作を実行できる 可視性: あるスレッドで実行した書き込み操作の結果が別のスレッドから見える 逐次性: あるスレッドによる一連のメモリ操作は、他のスレッドでも同じ順番で見えることが保証される

残念ながら、これらのどの特性についても、volatile 修飾子によって実現されるという保証はまったくない。 (中略) volatile キーワードの唯一の役割は、volatile として示されたメモリ領域で最適化を実行してはならない、ということをコンパイラに伝えることである。 https://www.jpcert.or.jp/sc-rules/c-pos03-c.html

volatileの注意(C言語)

volatile変数への読み書きは不可分(atomic)操作であるとは保証されない。 仮にレジスタサイズ2byte長のマシンを想定した場合、同環境では4byteサイズのvolatile変数アクセスはおそらく2回の2byteメモリアクセスに分割される。このとき異なるスレッドからvolatile変数へ読み/書きを同時に行うと、4byte領域のうち半分だけ更新された中間の値を読み込む可能性がある。つまり、プログラムの動作上は“どこにも存在しない値”を観測してしまうリスクがある。 2013-10-09 - yohhoyの日記

あくまで最適化の抑止(C言語)

コンパイラにとってソースコード上は冗長に見えるvolatile変数操作を、勝手に削除・移動しないという意味において、volatile変数は最適化抑制という効果をもつ。 ただし、該当のvolatile変数単体のみが対象、かつシングルスレッド実行を前提とすることに注意。 つまり、volatile変数(flag)と非volatile変数(data)との間では、この意味での最適化抑制効果はもたないため、コンパイラが2つの操作の実行順を入れ替える可能性がある。 また既に述べたとおり、異なるスレッドからの同一変数(flag)操作間の順序性には影響を及ぼさない。

volatile変数とマルチスレッドとの関係についての押し問答(後編) - yohhoyの日記

longとdoubleの代入や参照はアトミックでない(Java)

double 変数又は long 変数が volatile 宣言されていないとき,ロード,記憶,読取り,及び 書込み 動作の実行は,これらがそれぞれ32ビットの二つの変数であるかのように扱われる。これらの動作のいずれかが規則上要求されたときはいつでも,それぞれ32ビットの二回の動作として実行される。64ビットの double 変数又は long 変数を,二つの32ビット量として扱う方法は,実装依存とする。

JAVA言語規定 スレッドおよびロック

参考リンク

volatileで排他制御出来ると、いつから思ってた? atomicやsynchronized使うべし - Qiita
Javaの理論と実践: volatile を扱う

読書メモ:パソコンで楽しむ 自分で動かす人工知能

TensorFlow(テンソルフロー)やChainer(チェイナー)が前々から気になっていた。
だったら調べればって話だけど、なんとなくやる気にならない。
やる気を出すには、まずはホンの少しでもいいから始めるのが肝心だと思うので、この本は自分には丁度良かった。

セットアップ済み仮想マシンイメージを用意してくれているのも心強い。インストールやビルドでつまづくとテンションがダダ下がりなので、あるだけで安心。(Mac上で自分でセットアップして動かしたかったのでほとんどイメージは使わなかったけど、保険があると安心して失敗できる)。

初心者をターゲットにしているため、とても読みやすく、最初の第一歩としては満足な本だった。

パソコンで楽しむ 自分で動かす人工知能

パソコンで楽しむ 自分で動かす人工知能

dlib

Macでのインストール方法
qiita.com

  • 顔の検出
  • 輪郭の検出
  • 円の検出:学習データは仮想マシン内のdlib_testdataを使用。テストデータは仮想マシン内のdlib_traindataを使用
  • カメラ画像からの認識
$ ./webcam_face_pose_ex

word2vec

Macでのインストール方法
qiita.com

Chainer(チェイナー)

Macでのインストール方法
下記サイトを元にpyenvというのをインストール。anaconda2-4.4.0ではなく、anaconda2-4.0.0を選択
karaage.hatenadiary.jp

chainerは次の方法でインストール。本体はうまく動かなかったけど、chainer-goghは動いたのでいっか。 karaage.hatenadiary.jp

学習済みデータのダウンロード

$ wget https://www.dropbox.com/s/0cidxafrb2wuwxw/nin_imagenet.caffemodel

実行時の指定例
オプションはchainer-gogh/Readme.md参照

$ python chainer-gogh.py -i sample_images/cat.png -s sample_images/style_5.png -o output0  -g -1

PaintsChainer

https://paintschainer.preferred.tech/index_ja.html
教師データは「色着きの完成絵」と完成絵から生成した「線画」のペア約60万件

TensorFlow(テンソルフロー)

面白そうだったリンク

テキスト自動要約- Sdon
DCGAN face generator demo tadaoyamaoka.hatenablog.com 画風を変換するアルゴリズム | Preferred Research

機械学習の中途半端なメモ

いろいろな概念がわかってないので、とりあえずメモ

応用例

  • スパムメールの検出 教師あり学習
  • クレジットカード詐欺の検出
    教師あり学習
  • 検索エンジン
  • 診断
  • 異常検知
  • 金融市場の予測
  • DNA配列の分類
  • 物体認識
  • ゲームプレイ
    強化学習
  • 感情分析(意見マイニング)
  • レコメンドシステム
    協調フィルタリング(アイテムベース、ユーザーベース)
    アソシエーション分析
  • 顔認識
  • 音声認識や文字認識などのパターン認識
  • 被写体認識
  • 画像検索
  • 線画自動着色

データマイニングとの関係

  • 機械学習
    • 目的は、訓練データから学んだ「既知」の特徴に基づく予測
    • 評価は、既知の知識を再生成できるかどうか
  • データマイニング
    • 目的は、それまで「未知」だったデータの特徴を発見すること
    • 評価は、それまで「未知」だった知識を発見することが重視

アルゴリズムの分類

要求される結果で分類

  • 教師あり学習
    入力とそれに対応すべき出力(≒ラベル)をモデル化。
    • 分類(classification)
    • 回帰(regression)
  • 教師なし学習
    入力のみからモデル化。
  • 強化学習
    教師あり学習に似ているが、教師による明確な「答え」は提示されず、「行動の選択肢」と「報酬」が提示される。試行錯誤を通じて長期における報酬の最大化を学習する。
  • 半教師あり学習
  • トランスダクション(トランスダクティブ推論)
  • マルチタスク学習

技法

  • 決定木学習
  • 相関ルール学習 大規模データベースにおける変数間の興味深い関係を発見するための技法。
  • ニューラルネットワーク (NN)
    現代的NNは統計的データモデリングツールである。入力と出力の間の複雑な関係をモデル化するのに使われる。
  • 遺伝的プログラミング (GP)
  • 帰納論理プログラミング (ILP)
  • サポートベクターマシン (SVM)
    教師あり学習技法。訓練例のラベルは二値分類(=2つに分類)で、新たな例がどちらに分類されるかを予測する。
  • クラスタリング
    教師なし学習技法。統計的データ解析でよく使われる。
  • ベイジアンネットワーク
  • 強化学習
    教師あり学習とは異なる。「エージェント」が「環境」の中でどのような「行動」をとるべきかを、何らかの長期的「報酬」を最大化するよう決定する。
  • 現学習

Scikit learnの分類アルゴリズムの分類

Choosing the right estimator — scikit-learn 0.19.1 documentation

次の識別器に分類できる

参考:【目次】Python scikit-learnの機械学習アルゴリズムチートシートを全実装・解説

Azure 機械学習アルゴリズム チート シート

Machine learning algorithm cheat sheet | Microsoft Docs

代表的な機械学習手法一覧

代表的な機械学習手法一覧 - Qiita

ニューラルネットワーク

ディープラーニング

深層学習とも約される。(狭義には4層以上の)多層のニューラルネットワーク(ディープニューラルネットワーク、英: deep neural network)による機械学習手法

種類

ニューラルネットワークを多層積み重ねたモデルを機械学習させればディープラーニングであるが、有名なモデルとして以下の物がある

人口知能、機械学習ディープラーニングのリンク

人工知能・機械学習・ディープラーニング関係の雑多なまとめ - karaage. [からあげ]

参考

機械学習 - Wikipedia