ようへいの日々精進XP

よかろうもん

2021 年 02 月 13 日 (土)

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

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

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

ジョギング

[ランニング-2021-02-13-夕] 〜 ちょっと長めに走ろう 〜 / かっぱさんの活動データ | YAMAP / ヤマップ

読書

読む時間を確保できず。

レアジョブ

今日の指摘。

(1)
You said: Bella is golden retriever.

Correct: Bella is *a* golden retriever.

(2)
You said: Bella's owner went _to_ hiking.

Correct: Bella's owner went hiking.

たまに to とか付けると、それは要らなかったり、a を付けなきゃいけないところには付けていなかったり。人生でもこんな感じ。

夕飯

長らくお待たせしました、CircleCI Orbs を (2)

昨日、リリースした Orb をちょこちょこ手入れしていた。

github.com

(俺の Orbs) AWS セキュリティグループの Ingress ルールに CircleCI の IP を追加 or 削除する Orbs を作りました

あまりニーズがないかもしれないけど...

CircleCI で AWS 環境 (例えば、EC2 とか ECS ) に、デプロイする流れで AWS セキュリティグループで保護された URL に対して、CircleCI のジョブからアクセスしたい時があります。

そんな時に、アクセスする直前に、一時的にアクセス元となる CircleCI の IP アドレスをセキュリティグループの Ingress ルールに追加して、処理が終了したら、その IP アドレスを削除する CircleCI Orbs を作ったので宣伝させて下さい。

circleci.com

ちなみに、似たような機能を提供してくれる Orbs はいくつか提供されています。

circleci.com

circleci.com

他にもあるかもしれませんが、これらの Orbs には無い付加価値を付けて世の中に出したいなーと、パラメータを追加したり、テストを追加したり頑張ってみました。

例えば、他の Orbs には、セキュリティグループ ID を指定するパラメータがありません (タグで絞り込んでセキュリティグループ ID を取得している) が、拙作にはセキュリティグループ ID を指定するパラメータを付けました。また、moto server で立てたダミーの EC2 を利用したインテグレーションテストを追加したので、思わぬデグレの心配が少し減りました。

デモ

本物のリソースをイジるのは止めておきたいので、moto server で立てたダミーの EC2 の API 環境でデモってみました。

github.com

使い方は、以下のような感じです。(一部、抜粋しています)

version: 2.1

orbs:
  aws-sg-white-list-circleci-ip: inokappa/aws-sg-white-list-circleci-ip@0.0.1

executors:
  aws-sg-white-list-circleci-ip-demo:
    docker:
      - image: cimg/python:3.9
        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://moto-server:5000
          AWS_DISABLE_SSL: true
      - image: motoserver/moto
        name: moto-server
        command: ["ec2", "-H", "0.0.0.0"]

jobs:
  aws-sg-white-list-circleci-ip-demo:
    environment:
      AWS_PAGER: ''
      GROUP_ID: ''
    executor: aws-sg-white-list-circleci-ip-demo
    steps:
      - checkout
      - install-awscli
      - create-security-group
      - aws-sg-white-list-circleci-ip/add:
          tag-key: 'sg-white-list'
          tag-value: 'true'
          description: 'Test-Permission'
      - check-exists-ip-permission
      - aws-sg-white-list-circleci-ip/del:
          tag-key: 'sg-white-list'
          tag-value: 'true'
          description: 'Test-Permission'
      - check-not-exists-ip-permission

workflows:
  version: 2

  aws-sg-white-list-circleci-ip-demo:
    jobs:
      - aws-sg-white-list-circleci-ip-demo:
          filters:
            branches:
              only:
                - aws-sg-white-list-circleci-ip-demo

苦労したところとか

circleci orb init

CircleCI が提供するコマンドラインツール circleci に Orbs を作る為のコマンドが用意されています。

$ circleci orb --help
Operate on orbs

See a full explanation and documentation on orbs here: https://circleci.com/docs/2.0/orb-intro/


Usage:
  circleci orb [command]

Available Commands:
  add-to-category      Add an orb to a category
  create               Create an orb in the specified namespace
  info                 Show the meta-data of an orb
  init                 Initialize a new orb.
  list                 List orbs
  list-categories      List orb categories
  pack                 Pack an Orb with local scripts.
  process              Validate an orb and print its form after all pre-registration processing
  publish              Publish an orb to the registry
  remove-from-category Remove an orb from a category
  source               Show the source of an orb
  unlist               Disable or enable an orb's listing in the registry
  validate             Validate an orb.yml

Flags:
  -h, --help   help for orb

Global Flags:
      --host string         URL to your CircleCI host, also CIRCLECI_CLI_HOST (default "https://circleci.com")
      --skip-update-check   Skip the check for updates check run before every command.
      --token string        your token for using CircleCI, also CIRCLECI_CLI_TOKEN
Use "circleci orb [command] --help" for more information about a command.

circleci orb init ${path} を実行することで、ウィザード形式で Orbs を開発、リリースする為の各種設定が自動生成されます。

以下、実行例です。

$ circleci orb init my-sample-orb
Note: This command is in preview. Please report any bugs! https://github.com/CircleCI-Public/circleci-cli/issues/new/choose
? Would you like to perform an automated setup of this orb? Yes, walk me through the process.
Downloading Orb Project Template into my-sample-orb
A few questions to get you up and running.
? Are you using GitHub or Bitbucket? GitHub
? Enter your github username or organization inokappa
? Enter the namespace to use for this orb inokappa
Saving namespace inokappa as default
? Orb name my-sample-orb
? Automatically set up a publishing context for your orb? No, I'll do this later.
? Would you like to set up your git project? Yes
? Enter the remote git repository my-sample-orb
Thank you! Setting up your orb...
Error: author field is required

最後の Error: author field is required というエラーが気になりますが、以下のようなファイルが生成されます。

$ tree -I .git -a my-sample-orb -L 3
my-sample-orb
├── .circleci
│   ├── README.md
│   └── config.yml
├── .github
│   ├── ISSUE_TEMPLATE
│   │   ├── BUG.md
│   │   ├── FEATURE_REQUEST.md
│   │   └── config.yml
│   └── PULL_REQUEST_TEMPLATE
│       └── PULL_REQUEST.md
├── .gitignore
├── .yamllint
├── CHANGELOG.md
├── LICENSE
├── README.md
└── src
    ├── @orb.yml
    ├── README.md
    ├── commands
    │   ├── README.md
    │   └── greet.yml
    ├── examples
    │   ├── README.md
    │   └── example.yml
    ├── executors
    │   ├── README.md
    │   └── default.yml
    ├── jobs
    │   ├── README.md
    │   └── hello.yml
    ├── scripts
    │   ├── README.md
    │   └── greet.sh
    └── tests
        ├── README.md
        └── greet.bats

11 directories, 25 files

Orbs 自身も CircleCI で CI/CD 出来るように .circleci/config.yml が用意されていることが判ります。

詳細は、以下のドキュメントに記載されています。

circleci.com

Orbs の開発流れについて、下図のようなフローも掲示されているので勉強になります。

引用: https://circleci.com/docs/ja/2.0/creating-orbs/#github-%E3%81%B8%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3-%E3%82%BF%E3%82%B0%E3%81%AE%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%B7%E3%83%A5

command にスクリプトをベタ書き

例えば、

github.com

add.yml の中に、以下のようにスクリプトをベタ書きしている点が残念。

description: >-
  This command will add a rule in the SG of the AWS Security Group to allow the
  ingress of the CircleCI Machine
parameters:
  description:
    description: Description to identify the rule. Spaces cannot be included.
    type: string

... 略 ...
steps:
  - run:
      name: Add CircleCI's IP address to the Security Group
      command: |
        AWS_COMMAND="aws"
        if [ -n "${AWS_ENDPOINT}" ];then
          AWS_COMMAND="aws --endpoint ${AWS_ENDPOINT}"
        fi
... 略 ...

当初は、scripts ディレクトリ以下にシェルスクリプトを用意していたんだけど、パラメータを環境変数に代入して引き回せなくて、試行錯誤を重ねたものの、妥協して command 内にスクリプトをベタ書きすることにした。うーん、もう少し、頑張ってみようかな。

以上

宣伝でございました。

2021 年 02 月 12 日 (金)

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

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

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

ジョギング

読書

読む時間を確保できず。

レアジョブ

今日のフリーディスカッションは、先生が気を遣ってくれたのか、なんとか乗り切ることが出来た。

今日の指摘。

(1)
You said: I read [ reed] animal's blog.

Better: I read [red] a blog about an animal.

(2)
You said: My wife don't like dog.

Correct: My wife doesn't like dogs.

現在形、過去形、ガン無視の言い回しに先生もきっと呆れているんだろうなあ。

夕飯

長らくお待たせしました、CircleCI Orbs を

inokara.hateblo.jp

2021 年 02 月 11 日 (木)

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

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

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

ジョギング

[ランニング-2021-02-11-朝] 〜 六日目は那珂川を走る 〜 / かっぱさんの活動データ | YAMAP / ヤマップ

読書

本じゃないけど、最近、走る時の接地方法についての質問を頂いたので、接地について勉強するつもりで以下の論文を読んだ。

高校生ランナーを被験者として 1 年生から 3 年生まで、継続的に接地パターンの変化とスポーツ障害の関係について研究された論文。

勉強になった。

レアジョブ

今日もフリーディスカッションがグダグダで泣きそうになった。

今日の指摘。

(1)
You said: Bella is golden retriever.

Correct: Bella is *a* golden retriever.

(2)
You said: Owner name is Charlie.

Better: The owner's name is Charlie.

なんか、意図が通じれば良いや的な感覚で喋ろうとしているのが見え見えで情けない。

夕飯

CircleCI Orbs を (3)

やっと、インテグレーションテストが通った。

github.com

テストが通ったというか、テスト通るように環境を整えること出来た。

jq メモ 〜 組み込み演算子を試す 〜

tl;dr

昨日の日記にもちょっと書いたけど、昨日は jq コマンドを利用して、配列に要素を追加する方法について試行錯誤していました。一夜明けて、改めてドキュメントを読んだり、jq play で試してみたのでメモしてきます。

stedolan.github.io

jqplay.org

jq play は初めて使ってみたけど、jq のフィルタをブラウザでシュッと試せるのが良いですな。

尚、本記事では、jq play で試した結果を貼り付けていますが、場合によっては、手元環境で実行した jq の実行結果を貼り付ける場合があります。手元の jq のバージョンは以下の通りです。

$ jq --version
jq-1.6

組み込み演算子について

型変換は行わない

ドキュメントより引用。

Some jq operator (for instance, +) do different things depending on the type of their arguments (arrays, numbers, etc.). However, jq never does implicit type conversions. If you try to add a string to an object you'll get an error message and no result.

組み込み演算子は、引数の型 (配列、数値など) によって、結果が変わる = 暗黙的に型変換は行わず、エラーになるとのこと。

+ (プラス) 演算子

数値

Numbers (数値) は、通常の算術で加算されます。

$ echo '{ "number": 100 }' | jq '.number + 100'
200

配列

Array (配列) は、より大きな配列に連結されて追加されます。

$ echo '{ "array": [] }' | jq '.array + [ 100, 200 ]'
[
  100,
  200
]

$ echo '{ "array": [] }' | jq '.array + [ {"foo": 1}, {"bar": 2} ]'
[
  {
    "foo": 1
  },
  {
    "bar": 2
  }
]

ちなみに、異なる型 (数値) を追加しようとすると、以下のようにエラーが出ます。

$ echo '{ "array": [] }' | jq '.array + 100'
jq: error (at <stdin>:1): array ([]) and number (100) cannot be added

文字列

String (文字列) は、文字列が結合されます。

$ echo '{ "string": "foo" }' | jq '.string + "bar"'
"foobar"

オブジェクト

Object (オブジェクト) は、マージされる (右辺と左辺に同じキーがある場合、右辺のオブジェクトで上書きされる) 、再帰的なマージは * 演算子を使います。

$ echo '{ "object1": {} }' | jq '.object1 + { "object2": {} }'
{
  "object2": {}
}

$ echo '{ "object1": {} }' | jq '. + { "object2": {} }'
{
  "object1": {},
  "object2": {}
}

# = を付与すると、object1 キーの値として追加される
$ echo '{ "object1": {} }' | jq '.object1 += { "object2": {} }'
{
  "object1": {
    "object2": {}
  }
}

null

null は、値そのものを返すようです。

$ echo '{ "null": 1 }' | jq '.null + null'
1
$ echo '{ "null": "null" }' | jq '.null + null'
"null"
$ echo '{ "null": [] }' | jq '.null + null'
[]
$ echo '{ "null": {} }' | jq '.null + null'
{}

- (マイナス) 演算子

マイナス演算子は、算術演算子の減算と同じような挙動となるようです。

例えば、値が数値の場合には、以下のような結果となります。

$ echo '{ "number": 100 }' | jq '.number - 99'
1

配列の場合には、以下のように要素が削除されるような結果となります。

$ echo '{ "array": [1, 99] }' | jq '.array - [99]'
[
  1
]

* とか / とか % とか

* とか /% 演算子も用意されているようなので、ドキュメントに掲載されている内容を元に、簡単に試してみました。

まずは、* を試してみる。

$ echo 5 | jq '. * 10'
50

$ echo '{"foo": 1}' | jq '. * {"bar": 1}'
{
  "foo": 1,
  "bar": 1
}

$ echo null | jq '{"k": {"a": 1, "b": 2}} * {"k": {"a": 0,"c": 3}}'
{
  "k": {
    "a": 0,
    "b": 2,
    "c": 3
  }
}

次は、/ を試してみる。

$ echo 10 | jq '. / 10'
1

殆ど使うことがないであろう。

以上

jq の組み込み演算子を試してみました。jq 奥深いですな。

2021 年 02 月 10 日 (水)

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

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

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

ジョギング

[ランニング-2021-02-10-朝] 〜 五日目の朝も頑張るぞ 〜 / かっぱさんの活動データ | YAMAP / ヤマップ

読書

今日も読む時間が作れなかった。

レアジョブ

今日はお休みだったけど、明日は予約を入れた。

夕飯

puppeteer は俺には百万年早かった

ちょうど、昨日とは別件で自社サイトをスクレイピングする必要が出たので、早速 puppeteer を使ってみた。

しかし、ページによってはタイムアウトしてしまう現象に遭遇してしまい、それを解決出来ないまま Python の Beautiful Soup で急場をしのぐことになった。

www.crummy.com

puppeteer 同様に Beautiful Soup も、取得したページからデータを取り出したりする必要がなければ、ほんとに数行でページコンテンツを取得するスクリプトが書けるの最高。

でも、 curlwget でもいけるんではないかなって、今更ながらに思っている。

バージョン番号 x.x.x や x.x にマッチさせたい

ソフトウェアのバージョン番号 x.x.x や x.x にマッチさせる正規表現

$ echo 'foo-1.2' | grep -o -E "([0-9]+\.){1,2}[0-9]?"
1.2
$ echo 'bar-1.2.3' | grep -o -E "([0-9]+\.){1,2}[0-9]?"
1.2.3

jq で JSON の array に要素を追加したい

以下のような JSON があったとする。

$ echo '{ "a": "1", "b": [ { "c": 2 }, { "d": 3 } ] }' | jq
{
  "a": "1",
  "b": [
    {
      "c": 2
    },
    {
      "d": 3
    }
  ]
}

b の array 要素に、以下を追加したい。

$ echo '{ "e": 4 }' | jq .
{
  "e": 4
}

その場合には、以下のように書く。

$ echo '{ "a": "1", "b": [ { "c": 2 }, { "d": 3 } ] }' | jq '.b += [{ "e": 4 }]'
{
  "a": "1",
  "b": [
    {
      "c": 2
    },
    {
      "d": 3
    },
    {
      "e": 4
    }
  ]
}

他にもやり方があるかもしれない。

その他

今日は、朝早くからお仕事だったけど、朝ランしたり、New Relic の Web ハンズオンセミナーに参加したりと充実した一日だった。

2021 年 02 月 09 日 (火)

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

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

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

ジョギング

[ランニング-2021-02-09-朝] 〜 四日目の朝はのんびりと 〜 / かっぱさんの活動データ | YAMAP / ヤマップ

今日も補強はお休み。仕事の息抜きとかに 1 セットずつとかやっていきたい。

読書

今日も読む時間が作れなかった。

レアジョブ

今日は指摘は無かったけど、フリートークは相変わらずテンパってしまって、「Please wait」とか「Sorry」とか「Please speak slowly」しか言っていなかったような気がする。

Please speak slowly についてググっていたら、以下のような記事を見つけた。

xn--eckaqj0mnhrcc5850eyl2fqira.com

ほうほう。Pardon? とか Pardon me? のほうが良いらしい。勉強になった。

夕飯

puppeteer + pandas

とあるサービスサイトのとある情報の一部について、サービスが提供している API で取得出来なくて悩んだあげく、puppeteer を使ってページを丸ごと取得してから pandas を使ってテーブル要素を解析して csv で取得するという泥臭い作業をやった。

やったことの具体的な内容は書くことは出来ないけど、何らかの形でアウトプットはしたい。

泥臭いとは言え、puppeteer や pandas を使うことで、あっと言う間に欲しい情報が取得出来て、まさに個人的な産業革命が訪れた気がした。

csv の指定した列を sed で一括置換する

以下のような csv があったとする。

$ cat sample.csv
aaaaaaaaaa,bbbbbbbbb,cccccccc,11111111111111
dddddddddd,eeeeeeeee,ffffffff,22222222222222
gggggggggg,hhhhhhhhh,iiiiiiii,33333333333333

3 列目を foooooo という文字列で置き換えたい場合には、以下のように実行する。

$ cat sample.csv | sed 's/,[^,]*/,foooooo/2'
aaaaaaaaaa,bbbbbbbbb,foooooo,11111111111111
dddddddddd,eeeeeeeee,foooooo,22222222222222
gggggggggg,hhhhhhhhh,foooooo,33333333333333

2021 年 02 月 08 日 (月)

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

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

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

ジョギング

[ランニング-2021-02-08-夕] 〜 三日連続で走れました 〜 / かっぱさんの活動データ | YAMAP / ヤマップ

今日は補強はお休み。

読書

今日は読む時間が作れなかった。

レアジョブ

明日、予約を入れた。

夕飯

CircleCI Orbs を (2)

昨日の日記に書いた、orb について。orb の機能そのものは既に完成 (既存の類似 orb のソースを参考にさせて頂いた) していて、インテグレーションテストの実装に取り組んでいる。

github.com

セキュリティグループを付けたり外したりするテストについて、実際の AWS リソースを利用するのはイケてないので、moto server で擬似的な AWS API エンドポイントを起動してしている。

github.com

ちょっとだけ進捗があったけど、まだ、意図した通りに動かないorz

パラメータの引き回しとかに苦労したけど、意図した通りに動くようになったので、いくつかのテストを追加しようと思う。

2021 年 02 月 07 日 (日)

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

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

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

ジョギング

ランニング-2021-02-07 / かっぱさんの活動データ | YAMAP / ヤマップ

明日も走りたい。

読書

本を読むモチベーションが湧かなくてダメダメだった。

レアジョブ

明日の予約をいれねば。

夕飯

CircleCI Orbs を

年明けから、AWS のセキュリティグループに CI 実行環境の IP アドレスを追加する orb を作ろうとしているんだけど、インテグレーションテスト環境の構築で詰まってしまって進捗が芳しくない。あと、環境変数やパラメータの引き回し等、個人的に難易度が高くて辛い (涙

2021 年 02 月 06 日 (土)

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

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

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

ジョギング

[ランニング 2021-02-06-夕] 山王公園ラン 〜 きついなあ山王公園 〜 / かっぱさんの活動データ | YAMAP / ヤマップ

読書

奥さんの買い物に付き合って、あれこれ商品を選んでいる間の待ち時間に積読となっていた、「内部構造から学ぶPostgreSQL 設計・運用計画の鉄則」の 2 章「アーキテクチャの基本」を読んだ。

gihyo.jp

ちょうど、PostgreSQL について、全く理解出来ていないなーと反省していたところだったので、とても興味深く読めた。

PostgreSQL は、起動時に postgres プロセスをフォークして、WAL ライタや Auto Vacuum ランチャー等の各種処理を行なっているという、基本的な情報も知らないまま PostgreSQL を使っていたことを反省。「メモリ管理」あたりは、現在、ギョームで抱えている課題を解決する一助になるはず。

やっぱり、読書は良い。

レアジョブ

今日、明日はお休み。

夕飯

CircleCI Insights を API で取得する時に気をつけたいこと

circleci.com

このあたりの話。

curl --request GET \
  --url 'https://circleci.com/api/v2/insights/gh/CircleCI-Public/api-preview-docs/workflows?page-token=SOME_STRING_VALUE&branch=SOME_STRING_VALUE&reporting-window=SOME_STRING_VALUE' \
  --header 'Circle-Token: YOUR-TOKEN'

branch クエリパラメータ無しでリクエストを投げると、master ブランチの情報を返す。それに気付けずに半日溶かした。