Search on the blog

2017年9月17日日曜日

ElastiCacheを使ってみた

 Redisのマネージドサービスを試しに使ってみた。AWSではElastiCacheというサービス名で提供されている(ElastiCacheでは、Redisの他にMemcachedも使うことができる)。

Redisクラスタの作成

  • AWSコンソール> ElastiCacheダッシュボード> サブネットグループからサブネットグループを作成
    • サブネットグループはRedisクラスタを作るときに指定しないといけないので、あらかじめ作っておく
  • AWSコンソール> ElastiCacheダッシュボード> RedisからRedisクラスタを作成
    • 練習用なのでレプリカは作らない
    • Redisと同じAZにEC2を立てたいので、優先AZを指定しておく
    • EC2からアクセスできるようにSGを設定しておく(今回のサンプルではdefault SGをつける)

EC2の作成

  • Redisクラスタと同じVPC、subnet内にEC2を立てる
  • AmazonElastiCacheFullAccessポリシーをアタッチしたロールを付与しておく
  • RedisクラスタにアクセスできるようにSGを設定しておく(今回のサンプルではdefault SGをつける)

クライアントアプリ

  • Pythonから使う
  • pipでredisライブラリを入れる
    • pip install redis
  • get, set, hset, hget, hmset, hmgetとかを試してみる
  • 速度がどれくらいでるか気になったので以下のプログラムで測定してみた

import time
import redis

host = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.amazonaws.com'
port = 6379
r = redis.StrictRedis(host=host, port=port)

T = 10000

set_elapsed_times = []
for i in range(T):
    key = 'k%d' % i
    val = 'v%d' % i
    start_time = time.time()
    r.set(key, val)
    t = time.time() - start_time
    set_elapsed_times.append(t * 1e6)  # micro sec
    
get_elapsed_times = []
for i in range(T):
    key = 'k%d' % i
    val = 'v%d' % i
    start_time = time.time()
    v = r.get(key)
    t = time.time() - start_time
    get_elapsed_times.append(t * 1e6)  # micro sec


測定結果

  • get/secともに、平均で250 micro secくらい
  • setのmaxが13milli secくらいかかってるのが気になる
処理 GET [microsec] SET [microsec]
mean 259.323335 241.534066
std 138.918826232.519214
min 212.669373 206.708908
25% 234.842300 224.113464
50% 246.286392 231.504440
75% 260.114670 241.279602
max 3891.468048 13475.656509

ついでにボックスプロット(1% - 99%範囲外のデータは例外とみなして除去)も書いてみた。

expressionとstatementの違い

まえがき

Scala Schoolを読んでいて、以下のような表現に遭遇した。

Scala is highly expression-oriented: most things are expressions rather than statements.

日本語ではexpressionは「式」、statementは「文」と訳される。

両者の違い

プログラムの例を見ると言わんとすることは分かるけど、両者の定義が明確に分からなかったので調べてみた。
  • 式は値を生み出す、文は何か処理をする
  • 式は文の部分集合
  • 式は”それは何か”を表しており、文は"何をするか"を表している
  • 関数型言語は式を、命令型言語は文を使うことが多い気がする

Pythonでの例

if/else
以下のようにif/elseはstatementっぽくも書けるし、expressionっぽくも書ける。

# statement
x = 1
if x % 2 == 0:
 y = "even"
else:
 y = "odd"

# expression
"even" if x % 2 == 0 else "odd"

print
printはPython 2までは文だったが、Python3から式になった。

Python 2では文なので値は返されない。

>>> type (print ("hello"))
  File "<stdin>", line 1
    type (print ("hello"))
              ^
SyntaxError: invalid syntax

Python 3では式なので値が返される。

>>> type (print ("hello"))
hello
<class 'NoneType'>

2017年9月16日土曜日

IAMユーザにIPアドレス制限をかける

AWSのIAMユーザにIPアドレスをかける手順&確認。

IAMユーザの作成

AWSコンソールからIAMユーザを作成する。
今回の例では、AmazonS3ReadOnlyAccessポリシーをアタッチしておく。

接続確認

コマンドラインからprofileを設定
$ aws configure --profile test-user

S3にアクセスしてみる。
$ aws --profile test-user s3 ls
2016-02-20 15:50:19 xxxxxxxxxxxxx
2016-02-20 16:10:29 yyyyyyyyyyyyy

IPアドレス制限をかける

AmazonS3ReadOnlyAccessをコピーして以下のようなポリシーを作る。(xx.xx.xx.xxのところは自分のIPアドレスを入れる)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": "*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "xx.xx.xx.xx/32"
                    ]
                }
            }
        }
    ]
}

AmazonS3ReadOnlyAccessをデタッチして、上記で作成したポリシーを代わりにアタッチする。

指定したアドレスから接続確認

S3にアクセスできることを確認。
$ aws --profile test-user s3 ls
2016-02-20 15:50:19 xxxxxxxxxxxxx
2016-02-20 16:10:29 yyyyyyyyyyyyy

指定したアドレス以外から接続

S3にアクセスできないことを確認。
$ aws --profile test-user s3 ls
A client error (AccessDenied) occurred when calling the ListBuckets operation: Access Denied

2017年9月10日日曜日

オントロジーとタクソノミーの違い

オントロジー(Ontology)とは
  • type, properties, relationshipの集合から構成される世界を記述するモデルのこと。
  • Grakn Knowledge Modelというモデルではオントロジーを以下の4つのコンポーネントで記述する。
    • entity: もの。例: 人、男、女
    • relation: entity同士の関連。例: 親子関係
    • role: relationにおける役割。例: "結婚"というrelationには、"夫"、"妻"というroleがある
    • resource: entity/relationに紐づく属性。 例:名前、日付


タクソノミー(Taxonomy)とは
  • entityを親子関係を使って階層的に並べて表現するモデル。
  • 例: 植物 - 被子植物 - 単子葉類 - ユリ目 - ユリ科 - チューリップ属


両者の違い
  • Ontologyの方がTaxonomyより複雑な表現をすることができる。
  • Taxonomyは木構造、Ontologyはグラフ構造になっているとイメージしておくとよさそう。
  • Taxonomyはentityの分類や類似度を測るときに使われるのに対して、Ontologyは知識表現に使われる。Ontologyを使って知識を表現しておくと、マシンを使って新しい知識を推論することができる。

参考
https://www.quora.com/Whats-the-difference-between-an-ontology-and-a-taxonomy
https://blog.grakn.ai/what-is-an-ontology-c5baac4a2f6c

2017年8月17日木曜日

KMSを使ってみた

はじめに

 AWSのKMS(Key Management Service)を使ってみた。
KMSを使うと以下のようなことができて嬉しい。
  • ソースコードに載せたくない情報(認証情報など)を暗号化できる
  • 暗号化した鍵の管理をAWS側でやってくれる

やってみたこと

1. キーの作成
AWSコンソール画面 > IAM > 暗号化キー > キーの作成
からキーを作っておく

2. キーのAmazon Resource Nameをメモ
1.で作成したキーのリンクをクリックして、arn:aws:kms:xxxxxxxxxxxxxxのところをメモっておく

3. 検証に使うec2を起動
KMSにアクセスできるロールを適用したec2の起動する

4. 3.のロールから1.のキーのアクセスを許可
AWSコンソール画面 > IAM > 暗号化キー > キーユーザー

4.の操作はec2ロールにアタッチしたポリシーに応じて必要だったり、不要だったりする。
  • ec2にPowerUserAccessポリシーをつけていれば、3.の操作は不要。
  • AWSKeyManagementServicePowerUserポリシーしかつけてない場合は、3.の操作が必要。
5. 検証用Pythonコードを実行


注意事項
キーを作成したリージョンとキーを利用するリージョンが異なると以下のようなエラーがでるので注意。
botocore.errorfactory.NotFoundException: An error occurred (NotFoundException) 
when calling the Encrypt operation: Invalid arn

2017年7月31日月曜日

論文英語

 論文を書くときに使うとかっこ良さそうな英語表現をまとめたページ。

adaptively: 適応的に
It encodes the input sentence into a sequence of vectors and chooses a subset of these vectors adaptively while decoding the translation.(引用元

aforementioned: 前述の
In addition to the aforementioned relevance criterion, ...(引用元

exhibit: 示す、提示する
the relative difference between the two algorithms exhibits a relatively large variance over different domains.(引用元

heterogeneous: 異種の、異質の
the adopted L2R framework makes room for a seamless integration of heterogeneous models and data sources, by merging all of them into the  nal scoring model in the form of additional features.(引用元

homogeneous: 同種の、同質の
the novel information can be homogeneously fed into the L2R engine in the form of additional features.(引用元

outperform: 〜より性能がすぐれている
It is clear from the table that in all the cases, the proposed RNNsearch outperforms the conventional RNNencdec. (引用元

qualitative analysis: 定性的な分析
We also present some qualitative analysis of the output from our models. (引用元

quantitative results: 定量的な結果
In conjunction with the quantitative results presented already, ... (引用元

to our knowledge: 我々が知る限り
To our knowledge, this is the first time a multi-objective recommendation problem is addressed within the learning-to-rerank framework. (引用元


2017年7月19日水曜日

[Blog Reading] Hiring SREs at LinkedIn

 SREの採用プロセスに関する話。SREに限らずエンジニアの採用プロセスについてのいい話が書いてある。

https://engineering.linkedin.com/blog/2017/07/hiring-sres-at-linkedin

  • 人を雇いたいときは、その人に満たしてほしい特定のニーズがある
    • その特定のニーズを満たすために必要なスキルはなにか
    • 採用試験ではそのスキルだけをテストする
  • まず電話・オンラインで試験をする(スケールしやすい)
    • オンサイトでの試験は受験者/採用者ともにコストがかかる
  • 複数回のオンライン試験をパスした有望な求職者のみをオンサイト試験に招待する
    • オンサイト試験ではオンライン試験でやらなかったことをやる