投稿者: sumito.tsukada

  • AWS batch + ECRなのか、fargate (EC2)なのか

    AWS batch + ECRなのか、fargate (EC2)なのか

    はじめに

    定期的にコンテナを立ち上げて処理を流したい。

    AWS batch + ECRというアプローチもあれば、fargate (EC2)でタスクスケジュールというアプローチもあります。

    それぞれメリットデメリットをまとめました。

    AWS batchについて

    aws batch 実態はEC2であります。
    CloudWatch Eventにより発火させることがユースケースとしては多いようです。

    AWS batchがEC2を起動して、コンテナをとってきて、、、という作業になるため、
    10分ほどかかる可能性があります。

    EC2のスポットインスタンスを利用することもできます。
    当然スポットインスタンスなので、突然処理が止まってしまう事もありますが、
    AWS batchには最大5回のリトライ設定も可能。
    jobのキューイング機能もあります。

    diskが難しくなったらEBSを増やせばよいというのも強みの一つです。
    ただし現状、EFSとかをattachできません。

    fargateについて

    retry処理はありません。
    AWS Step Functionsと組み合わせることができ、そちらでリロードすることは可能です。

    LambdaとLambdaを繋げるのに使われることが多いですが
    step functions にfargateを使うことで、ジョブをコントロールすることが可能です。
    fargateのdiskは10G それ以上増やすことは現状できません。

    AWS batch/fargate同じ部分

    fargate/EC2 ログは標準出力になります。

    コンテナの作成について

    AWS batchでもfargateでもdocker imageを作る必要があります。
    その作成のベストプラクティスについて

    現状のベストプラクティス

    CodePilpelineを使い以下のフローの中でコンテナのpushまで入れます。

    * source code
    * ビルド
    * デプロイ
    を一貫して行うことができます。

    実現しやすい方法

    コンテナ作れる人に適切にroleを設定します
    コンテナを作る環境を作り、そこでroleを付与します。

    creadenrial の管理

    タスクのところで環境変数で持てるので、
    そこで適当な文字を入れます(仮にAAAAA)。
    Secret manager に適当な文字(仮にAAAAA)と、実際のパスワードを記載することでcredential の管理が可能です。

    参考情報

    AWSについて体系的に学ぶことができるのでおすすめ。

  • GAE(Google App Engine)を試した

    GAE(Google App Engine)を試した

    はじめに

    GAE(Google App Engine)を使い始めたので、一度ここで整理をした。

    app.yml

    これがGAEの根幹

    runtime: python27
    api_version: 1
    threadsafe: true
    
    handlers:
    - url: /.*
      script: main.app

    使用する言語や、url /で受ける際に呼び出されるscript (この場合はmail.app)が書かれている。

    scriptに書くこと

    https://cloud.google.com/appengine/docs/standard/python/quickstart?hl=ja#mainpy

    を少し終了し、編集した。

    import webapp2
    
    class MainPage(webapp2.RequestHandler):
        def get(self):
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.write('Wecome to Main Page')
    
    class sub(webapp2.RequestHandler):
        def get(self):
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.write('This page is sub')
    
    
    app = webapp2.WSGIApplication([
        ('/', MainPage),
        ('/sub', sub),
    ], debug=True)

    / でリクエストされるとMainPageクラスが呼び出され、

    /subでリクエストがくるとsunクラスが呼び出されるという簡単なページ。

    アプリケーションのテスト

    Googleのプラットフォームにあげる前に、自身の環境でテストをすることが可能である。

    dev_appserver.py app.yaml

    ちなみに、dev_appserver.pyはgoogle-cloud-sdkをinstallすればbinの配下に入っている。

    $ which dev_appserver.py
    /Users/sumito.tsukada/google-cloud-sdk/bin/dev_appserver.py

    デフォルトでこのdev_appserver.pyを実施した場合、localhost:8080に繋げればアプリケーションの試験が可能だ

    http://localhost:8080/

    デプロイ

    gcloud app deploy

    GAEコンソール画面

    デプロイされたことを確認できた。

    ブラウザ確認

    自動でブラウザが立ち上がり動作確認をすることが可能。

    gcloud app browse

     

  • UnicodeDecodeError: ‘utf-8’ codec can’t decode byte

    UnicodeDecodeError: ‘utf-8’ codec can’t decode byte

    はじめに

    Pythonで機械学習の勉強をはじめるようになって、ファイルを読み込むことが多くなった。

    その際、UTF-8フォーマットじゃないと何かと

    “` UnicodeDecodeError: ‘utf-8’ codec can’t decode byte “`

    というエラーに陥ることになってしまったので、手順をまとめる

    nkfコマンドのinstall

    macでデフォルトで入っていないのでbrewコマンドでinstallする

    “`brew install nkf “`

    変換

    まずは作業前

     

    $ file --mime data.csv
    data.csv: text/plain; charset=unknown-8bit

    変換コマンド

    “` nkf -w –overwrite data.csv “`

    $ file --mime data.csv
    data.csv: text/plain; charset=utf-8

    文字コードが代わり、エラーは出なくなった。

     

  • VyOSでDoS対策をする

    VyOSでDoS対策をする

    はじめに

    VyOSをFirewallとして使っている人向けのシンプルなDoS対策を紹介

    特定IPからのアクセスをdrop(拒否)する

    以下のコマンドは123.45.1.10からの接続の全てを拒否する。

    set firewall name FW-eth0 rule 100 action 'drop'
    set firewall name FW-eth0 rule 100 source address ‘123.45.1.10’

    直近2秒間で100アクセスあったらdropする

    ALBとかにはない機能。以下のコマンドは
    http(80番)へ直近2秒間で100アクセスあったら止める。

    set firewall name FW-eth0 rule 51 action 'drop'
    set firewall name FW-eth0 rule 51 destination port '80'
    set firewall name FW-eth0 rule 51 protocol 'tcp'
    set firewall name FW-eth0 rule 51 recent count '100'
    set firewall name FW-eth0 rule 51 recent time '2'

    ただし、攻撃者がブラウザを閉じ、別のブラウザから攻撃して来た場合は、drop対象からはずれ、また100アクセスを超えたらブロック対象になる。

     

     

     

  • 行列演算の基礎

    行列演算の基礎

    はじめに

    重回帰分析をするにあたり必要な計算があるので整理する。

    • ベクトルの定義
    • 行列の定義
    • 転置
    • 逆行列
    • 行列積

    numpyはimportされているものとする

    import numpy as np

    ベクトルの定義

    #  ベクトルの定義
    x = np.array([[1],[2],[3]])
    print(x)

    行列の定義

    X = np.array([[1,2],[3,4]])
    print(X)

     

    転置

    # 転置
    Xt = X.T
    print(Xt)

    逆行列  

    linear algebra (リニア・アルジェブラ)線形代数の意味 
    Inverse (インバース) 逆行列の意味

    X_inv = np.linalg.inv(X)
    print(X_inv)

    行列積

    XX_inv = np.dot(X,X_inv)
    print(XX_inv)

    10
    8.88の16乗1

    x掛けるxの逆行列で行列積が求まる。

    よく使う計算

    以下の様なnumpyの配列を作り、行、列の数を取得したり、forループで値を取得したりする

    import numpy as np
    x = np.array([[1,2,3]])
    print (x)
    print ('-----')
    
    X = np.array([[1,2],[3,4]])
    row, cal = X.shape
    
    print(row)
    print(cal)
    print ('-----')
    
    for x in X:
        print ('-----')
        print (x)
    ~                                                                                       
    ~                         

    実行結果

    $ python sample.py
    [[1 2 3]]
    -----
    2
    2
    -----
    -----
    [1 2]
    -----
    [3 4]
    

     

    演習

    xとyを以下の通り定義する。xの1行目にはダミー値として1をセットする事。

    # X definitions
    print('# X definitions')
    X = np.array([
        [1,2,3],
        [1,2,5],
        [1,3,4],
        [1,5,9]
    ])
    
    print(X)
    
    # Y definitions
    print('# Y definitions')
    y = np.array([
      [1],
      [5],
      [6],
      [8]
    ])
    
    print(y)

    実行結果

    # X definitions
    [[1 2 3]
     [1 2 5]
     [1 3 4]
     [1 5 9]]
    # Y definitions
    [[1]
     [5]
     [6]
     [8]]

    また、wは以下の通りとし、stepを分けて計算する

    # Step1
    print('# Step1')
    step1 = np.dot(X.T, X)
    print(step1)
    
    # Step2
    print('# Step2')
    step2 = np.linalg.inv(step1)
    print(step2)
    
    # Step3
    print('# Step3')
    step3 = np.dot(X.T,y)
    print(step3)
    
    # Step4
    print('# Step4')
    step3 = np.dot(X.T,y)
    step4 = np.dot(step2,step3)
    print (step4)

    実行結果は以下の通り

    # Step1
    [[  4  12  21]
     [ 12  42  73]
     [ 21  73 131]]
    # Step2
    [[ 1.76530612 -0.39795918 -0.06122449]
     [-0.39795918  0.84693878 -0.40816327]
     [-0.06122449 -0.40816327  0.24489796]]
    # Step3
    [[ 20]
     [ 70]
     [124]]
    # Step4
    [[-0.14285714]
     [ 0.71428571]
     [ 0.57142857]]

     

     

  • 線形代数 スカラー・ベクトル・行列を整理する

    線形代数 スカラー・ベクトル・行列を整理する

    はじめに

    重回帰分析を進めるにあたりスカラー、ベクトル、行列を整理。ベクトルと行列の足し算・引き算についてまとめた。

    スカラー

    “` x, y, z, M, N “`

    数学に出てくる記号

    ベクトル

    複数の定数、複数の変数を集めたもの。
    スカラーが複数個集まれば、ベクトルになる。
    教科書やノートではベクトルのxはスカラーのxと混乱するのを防ぐべく、太文字で書くのが一般的。

    エクセルのカラムをイメージするとよい

    横向きにする事も可能。
    その場合は転置の記号(T)を付ける

    行列

    ベクトルに対して横方向を持ったもの

    この場合は、3 * 2の行列

    行列の演算(足し算・引き算)について

    対応するところを合わせる

    足し算の場合

    引き算の場合

    条件

    計算するベクトルの行と列の数が同じである事

    行列の演算(掛け算)について

    基本的に行列の割り算はない。分数をかける事により掛け算のみで代用できるため。

    行列は対応するところを計算するわけではない。

    例えばこのような行列があった場合

    縦、横に補助線を引く

    左側と右側を掛ける。

     

    条件

    足し算・引き算とは違い、サイズが同じでなくても良い。

    内側の2つが同じである事。

    “`N… Aの行 
    M… Aの列
    O… Bの行
    P… Bの列 “`

    だとすると

    AとBの行列を掛ける場合、
    M=Oが一致している事。

    また、算出されるCの行と列の数はN・Pになる

    ベクトル・行列を掛けるとどうなるか

    転置の公式

    ベクトルで微分の公式

    最後に

    本記事はキカガクさんの Udemyで勉強したノートになります。
    あくまでも私のノートになりますので詳しく知りたい方はキカガクさんのコースを受講してみてください

    https://www.udemy.com/kikagaku_blackbox_2

     

     

  • 単回帰分析の傾きをPython(numpy)で求める

    単回帰分析の傾きをPython(numpy)で求める

    はじめに

    単回帰分析をする際、重要になるのが、「傾き」と「切片」。
    「切片」はセンタリングを行うことにより省略可能だが、「傾き」を計算するのは複雑な式を用いる。 難しそうなインパクトが強すぎて中身がまったく頭に入ってこない。 これをnumpyで実装する。

    実装

    準備

    まずは定数を定義

    # -*- coding: utf-8 -*-
    
    import numpy as np
    # ベクトルの定義
    # numpyでは([])で括る
    
    # 与えられたもの部屋の広さとか
    x = np.array([1,3,5,10,20])
    # その結果。値段など。
    y = np.array([2.5,6,11,21,38])
    
    # 全ての配列を表示
    print ("全ての配列を表示")
    print (x)
    print (y)

    描写するとこのような感じになる。 データの中心化を行う。値から、平均分を引く

    ## データの中心化
    # 平均の算出
    print x.mean()
    print y.mean()
    
    print ("中心化")
    # cはcenteringの略とする
    # pandsでも中心化する方法は存在する
    xc = x -x.mean()
    print (xc)
    
    yc = y - y.mean()
    print(yc)
    

    描写するとこのような感じになる。
    グラフの形は変わらず、全体的に中心になった。  

    傾きを計算する

    改めて計算式を確認。
    分母、分子をそれぞれ別々に計算する。 numpyで計算する際は、このようになる

    # 分母はxc * xcで、最後に足す
    xcxc = xc * xc
    print xcxc
    print ("分母:")
    print xcxc.sum()

        次に分子

    xcyc = xc * yc
    print ("分子:")
    print xcyc.sum()
    

    最後に分子と分母を組み合わせる

    answer = xcyc.sum()/xcxc.sum()
    print ("傾き:")
    print (answer)
    

     

    実施結果

    $ python regression.py
    全ての配列を表示
    [1 2 3]
    [2.  3.9 6.1]
    2.0
    4.0
    中心化
    [-1.  0.  1.]
    [-2.  -0.1  2.1]
    パラメータaの計算
    [1. 0. 1.]
    分母:
    2.0
    分子:
    4.1
    傾き:
    2.05

    傾きを元に実践を引いてみるとこのようになる 悪くなさそう。 実は実際はscikit-learnを使うともっと早いようだ。  

  • Google App Engineをコマンドで起動停止する

    Google App Engineをコマンドで起動停止する

    はじめに

    コマンドでGoogle App Engineを停止する。 
    前提条件としてgcloudコマンドがインストールされてあること。

    script

    #!/bin/bash
    set -eu
    
    env=$1
    method=$2
    
    # allocations ID取得
    ID=$(gcloud app services describe $1 | tail -n1 | awk '{print $1}' | sed "s/://g")
    echo $ID
    
    if [ $method == 'stop' ]; then
        gcloud app versions stop $ID -q
    elif [ $method == 'start'  ]; then
        gcloud app versions start $ID -q
    else
        echo ‘check your parameter’
    fi
    
    gcloud app versions list

    引数にサービス名を加えて実行する “` ./script.sh tsukada-test stop “`   “` ./script.sh tsukada-test start “` 本来ならCloudFunctionで実装したかったが、大いにはまってしまったので、急遽この方法で対応した。  

    注意事項

    コマンドを見てもらえばわかる通り、versionの指定はあっても、serviceの指定がない。

    そのため、万が一 service は違うけど、動いているversionが同じ。と言う場合、意図しない方も影響を受けてしまう。

    実はオプションで “` –service “` が用意されている。

    https://cloud.google.com/sdk/gcloud/reference/app/versions/stop?hl=ja

    必要な場合はこのオプションを活用すればよい。

     

  • csvデータを簡単にグラフに描写する

    csvデータを簡単にグラフに描写する

    はじめに

    CSVファイルなどを手軽にグラフ化したいことがある。そんな時matplotlib.pyplotを使えば直ぐに簡易的なグラフに描写することができて便利だ csvの中身は以下のものとする

    a b
    10.5    22
    15.4    7.23
    11.8    7.1
    81.2    7.3
    15.1    13.4
    9.2 11.4
    

    実装方法

    import pandas as pd
    
    df = pd.read_table('~/Documents/sample.csv')
    a = df['a']
    b = df['b']
    
    import matplotlib.pyplot as plt
    plt.scatter(a,b)

    scatterが散布図を指定する事になる。

  • pandasでtab区切りのデータを読ませる

    pandasでtab区切りのデータを読ませる

    はじめに

    pandasでデータを読み込もうとした際、read_csvを使ったがタブが¥tとして読み込まれてしまい、期待通りの結果にならなかった ちなみに読み込んだデータはこちら

    $ cat ~/Documents/sample.csv 
    a   b
    10.5    22
    15.4    7.23
    11.8    7.1
    81.2    7.3
    15.1    13.4
    9.2 11.4

    原因

    pandasではcsvを読み込む処理と、tab区切りのデータを読み込ませる処理が明確に分かれている

    対処

    read_csvをread_tableに修正することで期待通りに読み込むことができた。 また、表示する件数を絞りたい場合はhead()を利用する 3を引数に渡すことで表示件数を3件に絞ることが可能になる。