9月1週

土曜:

TypeScript

  • typeの結合
type PROFILE = {
  age: number;
  city: string;
}

type LOGIN = {
  username: string;
  password: string;
}

// 結合(新しい型を宣言して&で繋ぐ)
type USER = PROFILE & LOGIN

リテラル

  • 定数を定義するときに使えそう
// その他の値はエラーになる
let companty: 'Facebook' | 'Google' | 'Amazon'

ジェネリクス

  • 使い道:関数の引数にnullを許容したくないとき



日曜:

lottery-batch

  • スクレイピングしてcsv出力・データベースへの登録まで完了
  • DBとの接続で少しハマった。sqlalchemyの中でpsycopg2を使っているので両方ともpip installが必要

tanuhack.com

8月4週

土曜:

kubernates

  • kubeconfigファイル
    • 接続先(コントロールプレーン )のURL、認証情報、NameSpaceなどを保持している

      podの削除でハマった

  • kubectl delete pod nginx-podでやるとconnectエラーになっていた
  • 正しくはkubectl delete pods nginx-podsが必要だった

アプリケーション運用を考えたときに作成する手順としては

  • ベースとなる環境(VPCなど)の作成
  • データベースの作成とアクセス用の踏み台サーバの作成
  • 踏み台サーバにて必要なツールのインストール
  • データベースにDDL及びサンプルデータの投入をする

System Manager

  • 踏み台サーバへ入りツールをインストールしたいときなどに使える
  • 踏み台サーバではgitとpostresClientをインストールする:
    • git:sudo yum install -y git
    • postgresqlClientのインストールはamazon linux 2では→のようにするsudo amazon-linux-extras install -y postgresql10

データベースのエンドポイントアドレスの確認

  • アプリケーションで必要なのは以下3点
    • データベースのエンドポイントアドレス:cloudFormationsから確認する
    • データベース管理者用パスワード:secretsmanagerから確認する
    • アプリケーション用データベースユーザのパスワード

PostgresqlでのDDL実行

  • コンソールから\i スクリプトの場所で実行できる

ECRへのログイン

  • パイプで繋いでshコマンドでログインできる。shコマンドの挙動はよくわかんないけど・・・
  • aws ecr get-login --no-include-email | sh

imageのタグ付け

  • まずはローカルでビルド:$ docker build -t k8sbook/batch-app:1.0.0 --build-arg JAR_FILE=build/libs/batch-app-1.0.0.jar .
  • ecrのURIでタグ付け:$ docker tag k8sbook/batch-app:1.0.0 ECRのURI:1.0.0
  • push:

クラッシュしたら

  • ログを見る(当たり前)
  • kubectl logs --previous YOUR-POD_NAME

サービス(ロードバランサ)の作成

apiVersion: v1
kind: Service
metadata:
  name: backend-app-service
spec:
  type: LoadBalancer
  selector:
    app: backend-app
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  • kubectl get allするとフロントエンドから叩くべきURL(EXTERNAL-IP)が追加されている f:id:yosuke0517:20200822113036j:plain
  • コンソールからも確認する(ステータスがInServiceになっていること f:id:yosuke0517:20200822113422j:plain

    s3 + cloudFrontにてフロントエンドアプリケーションのデプロイ

  • ビルド:BASE_URL=http://ロードバランサのEXTERNAL-IP:8080 npm run build
  • S3へプッシュ:aws s3 sync dist s3://バケット名 --delete --include "*" --acl public-read

    cloudFrontのキャッシュの無効化

  • キャッシュを見に行かないようにする:aws cloudfront create-invalidation --distribution-id E3DCTCVMANTC9N --path "/*"

aws-cliのバージョンによってaws ecr get-loginのオプションが異なる

  • v1だとget-login-passwordが使えない(パスワードのみ出力)
  • とりあえずコレ使う:aws ecr get-login | sh

全体の手順

f:id:yosuke0517:20200822154534j:plain

Podを直接デプロイしない理由

  • リクエスト量や処理の負荷に応じてPod数を増減させたり、Podが以上終了した際に別のPodを起動したりできない
  • Deploymentを使用することでそれができるようになる

yamlファイルに変数を渡したい場合

  • envsubstを使って渡すことができる
  • こんな感じ
$ ECR_HOST=999999999978777.dkr.ecr.ap-northHOGEHOGHO envsubst < deployment.yaml kubectl apply -f -

Podの管理

  • readinessProbe:正常性監視・・・ヘルスチェック に失敗するとServiceからのトラフィックを停止する。
  • livenessProbe:死活監視・・・コレに失敗するとPodの再起動をする。※readinessProbeが成功してからコレを行わないともしlivenessProbeに異常があった場合、再起動の無限ループになる。

月曜:

react

  • オブジェクトに対するuseStateのsetの仕方
  • ...productを付与することでオブジェクトの要素を展開して、別々にセットできる。コレがないと初期化されてしまう。
import React, { useState } from 'react';

export const Basic = (props) => {
    const clickHandler = () => {
        alert('click')
    }

    const [product, setProduct] = useState({name: '', price: ''})
    return (
        <>
            <fonm>
                <input type='text' value={ product.name }
                onChange={evt => {setProduct({...product, name: evt.target.value})}}/>
            </fonm>
        </>
    );
};

export default Basic

テンプレートの挿入の仕方

  • イロイロなテンプレートがWebstormに用意されているがrsfって打つと基本のテンプレートが展開される f:id:yosuke0517:20200825155841j:plain f:id:yosuke0517:20200825155902j:plain

useEffect

  • vueでいうcomputedみたいなもの

useContext

  • 親から孫のコンポーネントに直接値を渡せるようになるもの(Propsを使わないので可読性があがる)
  • キーワード:createContext, ProviderとConsumer, useContext

useReducer

  • 単一コンポーネント内での状態管理(mutation的な)

    グローバルな状態管理をするには(孫からdispatchをして親の状態を変えるには)

  • useReducerとuseContextを使う

水曜:

  • Docker image 全削除
  • docker rmi $(docker images -a -q) -f

PostmanとmodHeader(クロム拡張)で動作確認がラクになりそう

  • PostmanはBodyに情報追加したりHeaderにも追加できる f:id:yosuke0517:20200827015533j:plain
  • modHeaderはHeaderをセットできるのでadmin画面で認証情報を追加するときなどに使える f:id:yosuke0517:20200827015301j:plain

7月4週

土曜:

日曜

  • docker-compose でたてたMysqlのポートを変更する

  • my.cnf, docker-compose.ymlに記載する

  • my.cnfはこんな感じ

[mysqld]
character-set-server=utf8mb4
explicit-defaults-for-timestamp=1
general-log=1
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_prepared_stmt_count=1048576
#default-time-zone='Asia/Tokyo'
port=3305

[client]
default-character-set=utf8mb4
port=3305
  • docker-compose.ymlはこんな感じ
db:
    build:
      # dockerfileの名前だけ指定する
      dockerfile: Dockerfile
      # contextで場所を指定する
      context: ./mysql
    env_file:
      - .env
    command: >
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
    environment:
      - MYSQL_DATABASE=${DB_DATABASE}
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - MYSQL_USER=${DB_USERNAME}
      - MYSQL_PASSWORD=${DB_PASSWORD}
      - TZ=Asia/Tokyo
    ports:
      - 3305:3305
    expose:
      - 3305
    volumes:
      - ./dbdata:/var/lib/mysql

7月3週

とりあえずシステムトレードができるレベルまで作り込み完了

  • 意外とすんなりできた。。。

土曜:

  • 損切り機能作成
    • 毎秒テーブルに書き込みしているので以下のように書き込み回数の上限をあげた。

blog.csdn.net

  • show global variables like 'max_prepared_stmt_count';で現状の数値を確認
  • set global max_prepared_stmt_count=1048576;たぶんこれがMax(64倍なのでよっぽどこれでOK)

日曜:

  • 結局上記では起動時に初期化されてしまい上限がデフォルトに戻っていた

    対応

  • my.confをバインド
  • ローカルのmy.confでmax_prepared_stmt_count=1048576を追加
[mysqld]
character-set-server=utf8mb4
explicit-defaults-for-timestamp=1
general-log=1
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_prepared_stmt_count=1048576

[client]
default-character-set=utf8mb4

月曜:

  • golang
  • ラベル付きfor文とgotoについて覚えた。goto便利。。。

火曜:

  • caprese

    storeの永続化

  • vuex-persistedstateを使用
  • github.com
  • 以下の感じでpluginsに登録してstoreを指定するだけ
// nuxt.config.ts
plugins: [
    { src: '~plugins/localStorage', ssr: false }
  ],
// localStorage.ts
import createPersistedState from 'vuex-persistedstate'

export default ({ store }) => {
  createPersistedState({
    key: 'capreseStore',
    paths: ['authenticate', 'project', 'common']
  })(store)
}

参考

金曜:

  • golangmysqlでの日本時間の設定

    mysql

  • my.cnfへ以下を追加したらエラー
default-time-zone='Asia/Tokyo'
mysql> show variables like '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | UTC        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
  • このやり方でできなくはないけど煩雑・・・

DockerのMySQLコンテナのタイムゾーンについて - Qiita

  • 現状はdbコンテナ内で以下のようにしないとダメだ・・・
SET SESSION time_zone = 'Asia/Tokyo';

go側

  • mysql側でtimezoneをAsia/Tokyoにしてもデータベース保存時はUTCになっていたのでgo側でも対応が必要っぽい・・・
  • go側ではJSTに変換
jst, _ := time.LoadLocation("Asia/Tokyo")
fmt.Println(jst.String())
fmt.Println(time.Now().In(jst))

7月2週

土曜:5h

caprese

  • Nuxtにてjwtを使った認証をするときにauth moduleが便利そうなので使ってみる
  • 基本は公式の通りで良さそう

個人開発

  • 30秒用のテーブルを作成し1秒,30秒,1分,1時間のローソク足の管理用テーブルの作成が完了
  • フロントはまだやる気にならないけどReactで以下のチャートライブラリを使用してチャートの表示とスタート・ストップくらいは行う
  • github.com
    • ちょうどいいのあったけど有料だったから1日でできなかったらコレ買おう

note.com

日曜:5h

個人開発

  • 自動取引部分のロジック設計

月曜:11h

caprese

  • 認証回り

火曜:11h

水曜:11h

木曜:11h

金曜:11h

  • caprese
    • 認証系:localStorageへの保存