投稿者: sumito.tsukada

  • dockerコンテナに環境変数を渡す

    dockerコンテナに環境変数を渡す

    はじめに

    fargateは環境変数を受け付けることができるので、それによって振る舞いを変えることができる。しかし、dockerの場合はどうやって環境変数を渡すの?

    実はめちゃ簡単

    “`docker exec“` コマンドは “`-e “` オプションがある。

    docker exec -it -e PARAM=123 docker_http /tmp/execute.sh

    これでPARAM=123をコンテナ内部に入れてあげる事が可能だ。

    Dockerコンテナで実行するシェルは

    #!/usr/bin/env bash

    を宣言するとよい。

    ここからは基本的なシェルだが

    PARAM=${PARAM:=99999999}

    と記載して置けば、環境変数が設定されていない場合、自動で99999999が代入される。

    参考情報=> https://qiita.com/tdrk/items/cc2995fd74e659ea948f

     

    参考情報

    オライリー本より読みやすく、Dockerについて体系的に学ぶことができるのでおすすめ。

  • Go言語のアドレスとポインタを整理する

    Go言語のアドレスとポインタを整理する

    はじめに

    goを弄る際、必ずと言っていいほど毎回調べている気がするので整理する。

    サンプルプログラム

    package main
    
    import "fmt"
    
    func one(x *int) {
    	*x = 1
    }
    
    func main() {
    
    	var n int = 100
    	one(&n)
    	fmt.Println(n)
    	fmt.Println(&n)
    }
    

    サンプルプログラムの出力結果

    1
    0xc420084008

     

    解説

    function oneはintのアドレスを引数に受け付ける

    “` * “` はポインタ型の箱として理解する

    fmt.Println(*n) とした場合、箱の中身。

    上記例でいうと100が表示される。

     

    “` & “` はアドレスとして理解する。上記例でいうと0xc420084008とかになる。

  • データの詰まったmysqlのdocker imageを簡単に作成する

    データの詰まったmysqlのdocker imageを簡単に作成する

    はじめに

    mysqlはオフィシャルのdocker imageを提供しているが、実はこれがいろいろ便利だったりするので紹介。

    https://hub.docker.com/_/mysql/

    Initializing a fresh instance

    When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions .sh, .sql and .sql.gz that are found in /docker-entrypoint-initdb.d. Files will be executed in alphabetical order. You can easily populate your mysql services by mounting a SQL dump into that directory and provide custom images with contributed data. SQL files will be imported by default to the database specified by the MYSQL_DATABASE variable.

    /docker-entrypoint-initdb.dへ.sh, .sql and .sql.gzファイルを置けば、アルファベット順に読まれる。SQLファイルはimportされる。

    何も考えず置けばよいらしいのだ。Dockerfileにいろいろ書かないで済むようなのである。

    やってみた

    昔MySQLはサンプルデータを公開していると書いたし、せっかくなので、そのデータをつかう。 https://qiita.com/S-T/items/923cf689ee5f44525457

    http://downloads.mysql.com/docs/world.sql.gz

    をダウンロードすることにする

    Dockerfileを記載

    MySQL 5.7のオリジナルイメージを持ってきて、

    先ほどダウンロードしたsql.gzファイルを/docker-entrypoint-initdb.dにコピー。

    FROM mysql:5.7
    
    COPY world.sql.gz /docker-entrypoint-initdb.d/world.sql.gz

    これだけ。

    buildする

    # docker build ./ -t mysql-sampledata
    Sending build context to Docker daemon  94.72kB
    Step 1/2 : FROM mysql:5.7
     ---> 141eda20897f
    Step 2/2 : COPY world.sql.gz /docker-entrypoint-initdb.d/world.sql.gz
     ---> 9776c5f28986
    Removing intermediate container f8fa93b7eb40
    Successfully built 9776c5f28986
    Successfully tagged mysql-sampledata:latest

    無事docker imageが出来上がった

    # docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    mysql-sampledata    latest              9776c5f28986        15 seconds ago      372MB
    mysql               5.7                 141eda20897f        9 days ago          372MB

    このmysql-sampledataを起動させる。

    docker run -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql-sampledata 
    

    MYSQL_ALLOW_EMPTY_PASSWORDオプションでパスワード無しでログインできるようになる。

    https://hub.docker.com/_/mysql/

    MYSQL_ALLOW_EMPTY_PASSWORD

    This is an optional variable. Set to yes to allow the container to be started with a blank password for the root user. NOTE: Setting this variable to yes is not recommended unless you really know what you are doing, since this will leave your MySQL instance completely unprotected, allowing anyone to gain complete superuser access.

    パスワードを付与したい場合は以下のオプションを利用する

    “` -e MYSQL_ROOT_PASSWORD=mysql “`

    ログインしてみる

    docker exec -it $(docker container ls | grep 'mysql-sampledata' | awk '{print $1}') /bin/sh

    パスワードなしでmysqlの中に入れる

    # mysql -uroot -p
    Enter password: 

    show databases;を行うと、先ほどimportしたworldというデータベースが見える

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | world              |
    +--------------------+
    5 rows in set (0.00 sec)
    
    mysql> 

    もちろん中身もある

    mysql> use world;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    mysql> show tables;
    +-----------------+
    | Tables_in_world |
    +-----------------+
    | city            |
    | country         |
    | countrylanguage |
    +-----------------+
    3 rows in set (0.00 sec)
    
    mysql> 

    mysqldumpの結果を入れることもできるし、いろいろ使えそうだ。

     

    外部から接続する場合

    ポートを付与する。

    # passwordあり
    docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql-sampledata
    
    # passwordなし
    docker run --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d -p 3306:3306  mysql-sampledata
    mysql -uroot -h127.0.0.1 -pmysql

     

  • error: failed to push some refs to を対処する

    error: failed to push some refs to を対処する

    はじめに

    gitにpushできなくなったというトラブルの対処

    # git push origin abc
    To git@git.xxx.com:oooo/xxxx-ooo.git
     ! [rejected]        xxx -> xxx (non-fast-forward)
    error: failed to push some refs to 'git@git.xxx.com:oooo/xxxx-ooo.git'
    hint: Updates were rejected because the tip of your current branch is behind
    hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
    hint: before pushing again.
    hint: See the 'Note about fast-forwards' in 'git push --help' for details.

    というエラーが発生。

    原因

    リモートリポジトリと、ローカルリポジトリに差分があることにより発生する。

    対処

    git push origin :branch
    git push origin branch

    remoteブランチを削除することになる。

    参考情報

    https://qiita.com/yoshixj/items/6441ab2cd6bc367e607d

  • 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