ようへいの日々精進XP

よかろうもん

2021 年 01 月 14 日 (木)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

[ランニング 2021-01-14-朝] 走れる喜びを噛み締めて (6) 〜 朝ラン (2) 〜 / かっぱさんの活動データ | YAMAP / ヤマップ

一週間ぶりのランニング。

読書

なんだかんだで、今日は読書無し。こうやって、読まなくなってしまうのか...(汗

レアジョブ

who とか what とか when とか where とか。なんとなく、英会話っぽくなってきた感じ。

「あちゃーミスった!」という時に言い回しは、

I made a mistake.

日常生活でもミスるので、これは覚えておきたい。

夕飯

LINE のグループ通話

奥さんを含めて、両親の 4 人で LINE グループを作っているんだけど、親が LINE グループ通話を誤って開始してしまったようで、通話を終了させるのに一苦労だった。

解らない人に解るように伝える技術の難しさを痛感した。

CircleCI orbs でセキュリティグループに一時的にアクセス許可を設定する orb

CircleCI のジョブが動いているグローバル IP を取得して、その IP を EC2 セキュリティグループに付与したり、削除したりする orb を探してみたら、以下の 2 つが見つかったけど、実際触ってみたら、正しくセキュリティグループの ID が取得されないようで使えなかった。

仕方ないので、以下のように自分で書いて対応した。

    steps:
      - checkout
      - aws-cli/install
      - when:
          condition: <<parameters.update_security_group>>
          steps:
            - run:
                name: AWS whitelist add CircleCI IP
                command: |
                    LATEST_IP=$(wget -qO- http://checkip.amazonaws.com)
                    IP="${IP-$LATEST_IP}"
                    if [[ "${IP}" == "" ]]; then
                      echo "Could not find your public IP"
                      exit 1
                    fi
                    GROUPID=$(aws ec2 describe-security-groups --query 'SecurityGroups[].[Tags[?Key==`circleci_update`] | [0].Value, GroupId]' --output text | grep true | awk '{print $2}')
                    [[ -n "${GROUPID}" ]] || (echo "Could not determine Security Group ID" && exit 0);
                    echo "Allowing CircleCI to access port 443 from IP $IP to the security group $GROUPID"
                    aws ec2 authorize-security-group-ingress --group-id $GROUPID --ip-permissions \
                      $(echo '[{"IpProtocol": "tcp", "FromPort": 443, "ToPort": 443, "IpRanges": [{"CidrIp": "", "Description": "CircleCI"}]}]' \
                        | jq -c '.[].IpRanges[].CidrIp="'$LATEST_IP/32'"')

2021 年 01 月 13 日 (スイスイ水曜日)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

  • 補強 (なんちゃって体幹レーニング 4 種盛り x 3 セット)
  • エアロバイク 40min (負荷 8)
  • エアロバイクダッシュ漕ぎ 35 秒 x 3

30 分から 40 分に時間を増やしただけなのに、漕ぎ終わった後の疲労感が大きいので、ダッシュ漕ぎは 3 本がマックス。

読書

今日は読書に時間を割けなかったけど、Udemy の Go 言語講座の動画見ながらエアロバイクを漕いだ。

すごく初歩的なことだけど、目から鱗だったのは以下の二点。

  • 変数の型を知りたい場合には fmt.Printf("%T/n", 変数) と書けば良い
  • string 型の文字列は byte 型配列の集まり

ちょっとだけ、手元で動かしてみた。

package main

import "fmt"

func main() {
    var str string
    str = "foo"
    fmt.Println(str)           // foo
    fmt.Printf("%T\n", str)    // string
    fmt.Println(str[0])        // 102

    byteA := []byte{102}
    fmt.Println(byteA)         // [102]
    fmt.Println(string(byteA)) // f
}

レアジョブ

二日ぶりのレアジョブでアタフタ、アタフタ。

チューターに「奥さん、今、何してるの?夕飯作ってる?」って質問されて、「うん、夕飯作ってる」と頑張って英語で伝えたけど、それを横で見ていた奥さんから、

My wife is exercising now. She stays home for a year by COVID-19. Therefore (and then) She got fat.

と言った方が良いよと指摘を頂いた。今日、一番の学びだった。

夕飯

Aurora のレプリカラグ

あまり意識したことが無かったけど、ドキュメントを見てみた。

docs.aws.amazon.com

すべての Aurora レプリカは、最小のレプリカラグでクエリの結果として同じデータを返します。このラグは、通常はプライマリインスタンスが更新を書き込んだ後、100 ミリ秒未満です。

https://image.slidesharecdn.com/20190828awsblackbelt2019aurorapostgresql2-190904062213/95/20190828-aws-black-belt-online-seminar-amazon-aurora-with-postgresql-compatibility-22-638.jpg?cb=1567578174

まだ、理解が追いついていないかもしれないから、間違っているのかもしれないけど、Aurora は DB エンジンが提供しているレプリケーションの仕組みを純粋には利用していないように見える。例えば、上図だと PostgreSQL だけど、WAL の書き込みがレプリカには発生しないので、100 ミリ秒以内でレプリケーションが完了するのかな...

奥深いな。

明日は

久しぶりに朝ランするぞー。

2021 年 01 月 12 日 (🔥)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

  • 補強 (なんちゃって体幹レーニング 4 種盛り x 3 セット)
  • エアロバイク 40min (負荷 8)
  • エアロバイクダッシュ漕ぎ 35 秒 x 1

両足の太腿に強い張りがあったので、ダッシュ漕ぎは 1 本で止めておいた。

読書

Webで使えるmrubyシステムプログラミング入門 SECTION 17 で strace で mkdir のシステムコールを追っかける例が掲載されているので、手元の環境でも試してみた。

$ docker run -t -i --rm cimg/base:2020.12 bash
circleci@f0b8599c539a:~/project$ sudo apt-get update && sudo apt-get install -y strace
circleci@025f086d174a:~/project$ strace -e mkdir mkdir /tmp/foo
mkdir("/tmp/foo", 0777)                 = 0
+++ exited with 0 +++

strace コマンドの -e オプションってなんだろうと思って、ヘルプを見たら、以下のようにシステムコールをフィルタリングするオプションのようだ。

General:
  -e EXPR        a qualifying expression: OPTION=[!]all or OPTION=[!]VAL1[,VAL2]...
     options:    trace, abbrev, verbose, raw, signal, read, write, fault,
                 inject, status, kvm

Filtering:
  -e trace=[!]{[?]SYSCALL[@64|@32|@x32]|[?]/REGEX|GROUP|all|none},
  --trace=[!]{[?]SYSCALL[@64|@32|@x32]|[?]/REGEX|GROUP|all|none}
                 trace only specified syscalls.

小さいことでも手を動かして見ることは重要だなあと思っった次第。

そして、コピッペや雰囲気で書いてしまっていた Go を、本当にちゃんと学びたくて Software Design 2021 年 1 月号 第 1 特集の「Goプログラミングスキルをレベルアップ応用力を伸ばすために習得したい6機能」を読み始めた。第 1 章の「基本の型とインターフェース」を読了。なかなかチンプンカンプンで、もっと初心者向けの書物を読む必要がありそう。いかに、今まで自分がコピッペや雰囲気や我流でやってきていたかを痛感した。

レアジョブ

今日もお休み。

夕飯

backlog_kit

Backlog APIRuby クライアントである backlog_kit は、以前にも使ったことがあったけど、今日、改めて業務で使ってみたら最高だった。

github.com

2021 年 01 月 11 日 (🌛)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

  • 補強 (なんちゃって体幹レーニング 3 セット)
  • エアロバイク 40min (負荷 8)
  • エアロバイクダッシュ漕ぎ 35 秒 x 3 (Rest 35 秒)

今日は、なんちゃって体幹レーニングに、Tarzan Web サイトで紹介されていた「ブリッジ&ニーリフト」を取り入れてみた。

tarzanweb.jp

そして、右足のハムストリングの張りが治まったので、ダッシュ漕ぎを 3 本入れた。

読書

  • Webで使えるmrubyシステムプログラミング入門 CAPTER04 〜 CAPTER05 のSECTION 17 まで
    • CAPTER04 は、ps の話から、/proc ファイルシステムを利用して mruby でワンバイナリを作る流れ
    • mgem を作るという、実践的な内容だし、実装について細かく触れられていて、読んでいてとてもワクワクした
    • CAPTER05 から本格的に C 言語な章に突入するので、ついていけるか心配

レアジョブ

今日はお休み。

夕飯

死役所

Amazon Prime死役所が配信されていたので、エアロバイクを漕ぎながら見た。

全巻ではないけど、漫画で読んだことがあったけど、実写化されても、一話目から心にズシッとくる内容だった。

もくもくブログ

週末にモクモクした内容をブログにまとめた。

inokara.hateblo.jp

inokara.hateblo.jp

minio を CircleCI のジョブで利用する + 引き続き、shellspec を触っている 〜 週末やったこと (2) 〜

tl;dr

週末に細々と自分が気になることをやってみたのでメモっておきます。

全て、以下の Github リポジトリに集約しています。

github.com

minio とは

github.com

MinIO is a High Performance Object Storage released under Apache License v2.0. It is API compatible with Amazon S3 cloud storage service. Use MinIO to build high performance infrastructure for machine learning, analytics and application data workloads.

Amazon S3 API と互換性があるオブジェクトストレージで、個人的にメリットを感じているのは、Docker でシュッと起動出来る点と、専用のコマンドラインツールが提供されている点です。

モチベーション

一言で言うと、「S3 API を操作するスクリプトの動作確認をしたい」。

AWS CLI なり、AWS SDK で作った S3 API を操作するスクリプトをちょくちょく作ることがありますが、動作を確認するにあたり、これまでは、実際に S3 にバケットを作って動作確認していました。簡単にバケットを作れたり、オブジェクトを放り込めたりしますが、同時に消してはいけないオブジェクト等を消してしまう可能性も否めません。

ということで、手元で手軽に S3 の API を試せる環境を探していたところ、minio を見つけた次第です。

そして、動作確認を自動化するべく、CircleCI で minio を動かしつつ、動作確認 (インテグレーションテスト) を行おうと思った次第です。

簡単だった

先人のお知恵拝借ということで、ググっていたら、同じモチベーションの方がいらっしゃったので、その方のコードを利用させて頂きました。

version: 2.1

commands:
... 略 ...
  install_minio_client:
      steps:
        - run:
            name: Install minio client
            command: |
              mkdir ${HOME}/bin && \
                curl -sSL https://dl.minio.io/client/mc/release/linux-amd64/mc -o ${HOME}/bin/mc && \
                chmod +x ${HOME}/bin/mc

jobs:
  shellspec-test:
    docker:
      - image: cimg/base:stable
        environment:
          AWS_ACCESS_KEY_ID: EXAMPLEKEY123
          AWS_SECRET_ACCESS_KEY: EXAMPLESECRET123456
          AWS_DEFAULT_REGION: us-east-1
          AWS_REGION: us-east-1
          AWS_ENDPOINT: http://minio:9000
          AWS_DISABLE_SSL: true
          PARAM_BUCKET: 'example-bucket'
      - image: minio/minio:latest
        name: minio
        environment:
          MINIO_ACCESS_KEY: EXAMPLEKEY123
          MINIO_SECRET_KEY: EXAMPLESECRET123456
        command: ["server", "/data"]
    steps:
      - checkout
      - install_base_dependencies
      - install_shellspec
      - install_awscli
      - install_minio_client
      - run:
          name: Run shellspec test
          command: |
            cd src/sample
            shellspec -s bash --format document

workflows:
  version: 2
  shellspec-test:
    jobs:
      - shellspec-test:
          filters:
            branches:
              only:
                - master
                - main

minio 自体を起動している部分は、以下の通りと非常にシンプルです。

      - image: minio/minio:latest
        name: minio
        environment:
          MINIO_ACCESS_KEY: EXAMPLEKEY123
          MINIO_SECRET_KEY: EXAMPLESECRET123456
        command: ["server", "/data"]

そして、学びだったのが、一つのジョブの中に複数の Docker イメージの指定が出来ることでした。

動作確認

テスト対象

テストされる側のコード (シェルスクリプト) は以下の通りです。

sample1() {
  arg=""
  if [ -n "${1}" ];then
    arg="${1}"
    echo "Hello ${1}!"
  else
    echo "Hello world!"
  fi
}

sample2() {
  if [ -n "${AWS_ENDPOINT}" ];then
    res=$(aws --endpoint-url "${AWS_ENDPOINT}" s3api list-objects-v2 --bucket "${PARAM_BUCKET}")
    stat=$?
  else
    res=$(aws s3api list-objects-v2 --bucket "${PARAM_BUCKET}")
    stat=$?
  fi

  if [ -n "$res" -a "$stat" = "0" ];then
    echo $res | jq -r '[.Contents[].Key]|@tsv'
  else
    echo ""
  fi
}

sample2() の関数が minio を利用することを想定したコードです。環境変数 AWS_ENDPOINT が指定されている場合、 AWS CLIs3api list-object-v2--endoint-url オプションを付与して実行します。オブジェクトの一覧が TSV 形式で出力されることを期待しています。

ちなみに、sample1() は後述の shellspec の動作確認を行う為のコードです。

テストコード

テストコードは shellspec を使って記述しました。shellspec については、以下の記事で書かせて頂いています。

inokara.hateblo.jp

以下、テストコードを全文掲載しています。

Describe 'lib/sample.sh'
  Include lib/sample.sh

  setup() {
    ${HOME}/bin/mc config host add minio ${AWS_ENDPOINT} ${AWS_ACCESS_KEY_ID} ${AWS_SECRET_ACCESS_KEY} > /dev/null
    ${HOME}/bin/mc mb minio/example-bucket > /dev/null
    touch object1 object2
    for ob in object1 object2
    do
      ${HOME}/bin/mc cp $ob minio/example-bucket/$ob > /dev/null
    done
  }

  cleanup() { 
    ${HOME}/bin/mc rb --force minio/example-bucket > /dev/null
    rm -f object1 object2
  }

  BeforeCall 'setup'
  AfterCall 'cleanup'

... 略 ...

  It 'check output (minio check)'
    When call sample2
    The output should match pattern '*object*'
  End
End

setup() 関数では、minio 専用のクライアントである mc コマンドを使って、minio の初期設定やバケットの作成等を行っています。

そして、以下の部分で sample2() 関数の出力をテストしています。

  It 'check output (minio check)'
    When call sample2
    The output should match pattern '*object*'
  End

テスト結果

VS Code のターミナル上で shellspec を実行してみると、以下のように出力されました。

f:id:inokara:20210111171632p:plain

そして、CircleCI 上でも、以下のように出力されました。

f:id:inokara:20210111171747p:plain

やったね!

以上

週末にもくもくしたメモでした!

参考

以下の資料を参考にさせて頂きました。

github.com

github.com

今更次郎ですが Visual Studio Code (VS Code) の Remote Containers 機能を使ってみた 〜 週末やったこと (1) 〜

tl;dr

週末に細々と自分が気になることをやってみたのでメモっておきます。

全て、以下の Github リポジトリに集約しています。

github.com

尚、以後、Visual Stdio Code は VS Code と表記したいと思います。

VS Code のモチベーション

自宅では Windows 環境を使いたいなーと思って、エディタやターミナル等の普段、最も向き合っている時間が長いツールについては統一しておきたい気持ちが高まって VS Code を業務用の macOS 端末にインストールしてみました。

色々とググって調べていたら、Remote Containers 機能は VS Code から Docker コンテナ内のファイルを直接操作出来るし、開発環境自体を Dockerfile もしくは docker-compose.yml と Dockerfile で記述して構築出来るので、ホストを汚さずに、言語毎だったりプロジェクト毎にエディタ環境を整えられるのでは... という思いが高まりました。

ということで、2019 年には、既にリリースされていた機能のようなので、今更次郎感は否めませんが、触ってみた感想等をメモしたいと思います。ちなみに、自分は VS Code を触るのは 4 年ぶり 2 回目です。

今回、利用している VS Code のバージョンは下図の通りです。

f:id:inokara:20210111162607p:plain

エディタの設定ですら

Remote Containers 機能を使ってみて驚いたのが、エディタの設定やエクステンションの一覧を JSON 設定ファイルに記述することが出来る点です。

開発する言語やプロジェクト単位でソースコードだけでなく、エディタの設定も管理することで、OS やホスト環境を問わず、VS Code と Docker さえあれば、エディタ環境を整えることが出来るというのは素晴らしいですよね。 (キーボードのショートカットについては、OS によって違ったりするので、完全に再現というわけにはいきませんが。。。)

$ tree . -a -I .git
.
├── .circleci
│   └── config.yml
├── .devcontainer
│   └── devcontainer.json
├── docker
│   └── Dockerfile
├── docker-compose.yml
├── README.md
├── src
│   └── sample
│       ├── lib
│       │   └── sample.sh
│       ├── .shellspec
│       └── spec
│           ├── sample_spec.sh
│           └── spec_helper.sh
└── .vscode
    └── settings.json

.devcontainer/devcontainer.json.vscode/settings.json がそれにあたります。

.devcontainer/devcontainer.json は以下のような感じです。

{
  "name": "shellspec workspace (debian:latest)",
  "dockerComposeFile": [
    "../docker-compose.yml",
  ],
  "service": "base",
  "workspaceFolder": "/work",
  "extensions": [
    "ms-ceintl.vscode-language-pack-ja",
    "timonwong.shellcheck",
    "vscodevim.vim",
    "mads-hartmann.bash-ide-vscode",
    "valmack.circleci-config-validator"
  ]
}

sevice に指定されている base が、後述する docker-compose.yml 内の service 名を指定しています。

.vscode/settings.json は以下のような感じです。

{
    "workbench.list.keyboardNavigation": "simple",
    "workbench.enableExperiments": false
}

環境構築に docker-compose.yml を使う

今回、以下のような docker-compose.yml を書きました。

version: '3.7'
services:
  base:
    build:
      context: ./docker
      dockerfile: Dockerfile
    tty: true
    volumes:
      - .:/work
    environment:
      AWS_ACCESS_KEY_ID: EXAMPLEKEY123
      AWS_SECRET_ACCESS_KEY: EXAMPLESECRET123456
      AWS_DEFAULT_REGION: us-east-1
      AWS_REGION: us-east-1
      AWS_ENDPOINT: http://minio:9000
      AWS_DISABLE_SSL: 'true'
      PARAM_BUCKET: 'example-bucket'
    command: [ bash ]
  minio:
    image: minio/minio:latest
    environment:
      MINIO_ACCESS_KEY: EXAMPLEKEY123
      MINIO_SECRET_KEY: EXAMPLESECRET123456
    command: ['server', '/data']

minio という S3 API 互換のサービスを動かすことを想定いますが、特殊なことをしなくても作業用のコンテナ base と共に起動することが出来ました。

f:id:inokara:20210111163137p:plain

キーボードショートカットのカスタマイズ

Remote Containers 機能は関係無いと思いますが、VS Code のキーボードショートカットについて。

出来るだけキーボードから手を離さずに使おうとすると、ショートカットのカスタマイズは必須ですよね...。試行錯誤している間にショートカットが使えるようになったり、急に使えなくなったりと、なかなか意図した通りに動いてくれません (VS Code が悪いわけではなく、自分の操作が不味いだけだと思います)

以上

コードと言っても、シェルスクリプトしか書きません (書けません) が、Remote Containers 機能を使うことで、コンテナのポータビリティの良さを活かした快適なコーディング環境が手に入りつつ、環境構築そのものを楽しむことが出来そうです。

参考

以下の資料を参考にさせて頂きました。

code.visualstudio.com

code.visualstudio.com

www.keisuke69.net

2021 年 01 月 10 日 (日)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

  • 補強 (なんちゃって体幹レーニング 3 セット)
  • エアロバイク 40min (負荷 8)
  • 以前から痛めていた右のハムストリングに強い張りがあったので、ダッシュ漕ぎは止めておいた

読書

レアジョブ

新しいレッスン教材、以下は、今日の指摘事項。

  • 料理は何を作ることが好きですか?

という問いに対して...

You said: I favorite pasta.

Correct: I love pasta.

I love ... を使うことをオススメされた。(My favorite cooking is pasta でも良い)

夕飯

VSCode

エディタにそれほど拘りはないけど、VSCode は面白そうだなあと思って、朝から色々と弄っていた。

2021 年 01 月 09 日 (土)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

読書

  • 今日は 1 ページも読まなかった...

レアジョブ

久しぶりのレアジョブ。久しぶりなのでアタフタしまくりだった。小学生の英語の教科書を取り寄せようかと思った次第。

  • あなたはなんで朝食を食べないの?
You said: Why you don't eat breakfast?

Correct: Why do not you eat breakfast?
  • あなたは朝に何杯のコーヒーを飲みますか?
You said: How many drink coffee in the morning?

Better: How often do you drink coffee the morning?
  • あなたはどの映画を見ますか?
You said: What do you watch the movies?

Better: What kinds of movies do you watch?

小学生レベルの英語の言い回しで指摘を多数頂いた。きっと、中学生の時に習っているはず。。。お恥ずかしや。。。

夕飯

2021 年 01 月 08 日 (金)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

読書

今日は、朝 5 時過ぎに目が覚めてしまって、寒さに震えながら布団の中で読んだ。

夕飯

明日は

骨粗鬆症の薬の日。忘れようにせんと。

2021 年 01 月 07 日 (木)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

  • 補強 (なんちゃって体幹レーニング 3 セット)
  • エアロバイク 30min (負荷 8)

今日のエアロバイクは時間の関係で 35sec ダッシュ漕ぎ (35sec Rest) はお休み。

通院

左足の状態は相変わらず。今日も炎症を抑える薬と痛み止めの注射を打ってもらった。一週間後、また、走ってみようと思う。

読書

今日は、通院の日だったので、待ち時間での読書が捗った。

夕飯