ようへいの日々精進XP

よかろうもん

2021 年 01 月 17 日 (日)

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

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

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

ジョギング

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

読書

今日は読む時間を作ることが出来なかった。

レアジョブ

一応、今日も、4 段階評価の 4 をもらえたけど、今日も色々と指摘を頂いた。

Q: What time does Masa want to meet Catherine? You said: Masa meet up at 7 o'clock.

Better: Masa wants to meet her at 7 o'clock.

You said: What time the movie start?

Correct: What time does the movie start?

You said: What time does coffee shop open?

Correct: What time does the coffee shop open?

You said: I want to go December 16.

Correct: I want to go on December 16.

あと、lol が何を意味するのかという話の流れから、

What makes you laugh?

と聞かれて、最初は意味が解らずアタフタしたけど、

My wife My wife is comical

と答えたら、

Oh! Your wife is funny!!

と会話が弾んだ。

夕飯

今宵もお鍋。

奥さんの体調

奥さんの体調はだいぶん良くなった。良かった、良かった。

CircleCI orbs でハマりまくって、一瞬、CircleCI を嫌いになった

昨日から、CircleCI の orb を作り始めたんだけど、以下の点でハマりまくって、一瞬だけ CircleCI を嫌いになりそうになった。

(1) 手元 (macOS) から、circleci config pack した場合と orb-tools で config pack した際の挙動が違う...

$ circleci orb publish orb.yml inokappa/aws-sg-white-list-circleci-ip@dev:alpha
Error: Error calling command: 'add'
Unclosed '<<' tag in string: '<<include(scripts/add.sh)>>'
('<<' must be escaped as '\<<' in config v2.1+)
Error calling command: 'del'
Unclosed '<<' tag in string: '<<include(scripts/del.sh)>>'
('<<' must be escaped as '\<<' in config v2.1+)

上記、手元から publish した際に、上記のようなエラーが出る。このエラーを回避する為、<<\<<エスケープしてから push して orb-tools で pack しようとすると、以下のようなエラーになる。

#!/bin/bash -eo pipefail
circleci orb pack --skip-update-check src > orb.yml
Error: An unexpected error occurred: entire string must be include statement: '\<<include(scripts/add.sh)>>'

Exited with code exit status 255
CircleCI received exit code 255

(2) parameters の挙動が違う...

以下のような 2 つの orb を使った .circleci/config.yml があったとする。

hello-world/echo-commandto: パラメータの type は string で、aws-sg-white-list-circleci-ip/addgroup-id: パラメータの type も string なんだけど...

version: 2.1

orbs:
  hello-world: sample-orbs/hello-world@0.0.10
  aws-sg-white-list-circleci-ip: inokappa/aws-sg-white-list-circleci-ip@dev:alpha

jobs:
  test-1:
    environment:
      FOO: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    parameters:
      foo:
        type: env_var_name
        default: FOO
    docker:
      - image: cimg/python:3.9
    steps:
      - checkout
      - run:
          command: |
            echo ${<<parameters.foo>>}
      - run:
          command: |
            FOO=$(echo 'ahoaho')
      - hello-world/echo-command:
          to: ${<<parameters.foo>>}
      - aws-sg-white-list-circleci-ip/add:
          group-id: ${<<parameters.foo>>}

workflows:
  integration-test_deploy:
    jobs:
      - test-1

下図のような結果となった。

f:id:inokara:20210117235035p:plain

本来であれば、echo "Hello, ${FOO}" のように、環境変数 FOO に設定されている値 (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)が展開されて欲しいところだけど、何故か、変数名 (${FOO}) が展開されている状態に半日くらい悩まされて、未だに解決していない。

なんでだろう...

2021 年 01 月 16 日 (土)

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

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

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

ジョギング

[ランニング 2021-01-16-昼] グルっと福岡空港 〜 とてもキツかった 〜 / かっぱさんの活動データ | YAMAP / ヤマップ

読書

Webで使えるmrubyシステムプログラミング入門 CHAPTER 05 を一旦、読み切った。C 言語のデバッグ入門が面白かったので (というか、C 言語に関する用語の理解が不十分なので) CHAPTER 05 を改めて読み直し中。

レアジョブ

今日も、4 段階評価の 4 をもらえたけど、指摘の数々。

Q: What time do you want to meet up? A: Let’s meet up at 7:15.

You said: We can buy ticket online or local convenience store. Correct: We can buy tickets online or at local convenience stores.

You said: I go to December 15. Better: I want to go there on December 15.

夕飯

久しぶりのお鍋で温まるねえ。

2021 年 01 月 15 日 (金)

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

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

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

ジョギング

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

今朝も走りたいと思ったけど、グッとこらえた。

明日は夕方走ろうかなと思っている。

読書

Webで使えるmrubyシステムプログラミング入門 SECTION 18 を 109 ページまで。C 言語に慣れるということで、ホスト名を出力するコマンドを作るところ。面白くなってきたぞ... ただ、C 言語は個人的にだいぶん難しく、一進一退感があるので、コツコツやっていくぞ!

レアジョブ

今日は、4 段階評価の 4 をもらえたので嬉しかったけど、ディスカッションでは片言感が半端なくて辛かった。

今宵はどうやって家に帰るの?ということを聞きたくて、

What do you get home tonight?

って言ってしまって、優しく突っ込まれた。

How will you get home tonight?

が正しい。なるほど。

夕飯

二日目のカレー!美味しゅうございました。

奥さん、体調を崩す

ここ最近、ずっと元気だった奥さん、お昼くらいから発熱で寝込んでしまった。最近、エアロバイクを始めたり、書道やらなんやら頑張っていたので、疲れが出てしまったのかもしれない。週末はゆっくり休んで欲しい。

Postman (newman) が良い

API 開発やテストに使える Postman というツール。リッチな UI でたまーに使わせて頂くんだけど、Postman のコマンドラインツールとして newman というツールが配布されていて、これが CI との相性抜群だなーと思った一日だった。

github.com

Postman で Collection (テストシナリオ) を作って、それをエクスポートして、以下のように newman で実行するみたいな流れ。

$ newman run collection.json

ちなみに、テストシナリオは、Chai (アサーションライブラリという理解) で記述出来る。

www.chaijs.com

自分のようなコードが書けない人間でも、外形監視を Postman で叩いて動作確認した内容をコード化出来て、それを CI 環境で回して、継続的にサービスの品質を保持出来るという流れは素敵だなー。

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 は面白そうだなあと思って、朝から色々と弄っていた。