ようへいの日々精進XP

よかろうもん

2021 年 01 月 26 日 (火)

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

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

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

ジョギング

[ランニング 2021-01-26-朝] 福岡空港ラン 〜 雨の朝 第三章 〜 / かっぱさんの活動データ | YAMAP / ヤマップ

読書

やばい、今日も本を読む時間を作れなかったぞ...(汗

レアジョブ

いつもの先生が予約出来ずにお休み。

夕飯

2021 年 01 月 25 日 (月)

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

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

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

ジョギング

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

エアロバイクを漕いでいても、右足のハムストリングに強い張りを感じてしまった。

読書

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

レアジョブ

19 時から予約していたんだけど、急遽、ギョームが長引きそうになったのでキャンセルした。

夕飯

terminal-notifier

macOS の通知センターにターミナルからコマンドラインで通知を送りたい欲求に駆られたのでシュッとググってみたら、terminal-notifier というツールを発見。

github.com

リポジトリの履歴を見ると 9 年くらい前から存在しているツールのようで、Ruby のラッパーまで存在している。

インストールは brew install で簡単にインストール出来た。

$ brew install terminal-notifier

基本的な使い方は、以下の通り。

$ terminal-notifier -title "タイトル" -subtitle "サブタイトル" -message "メッセージ" -sound default

ドゥルンというお馴染みの音と共に下図のように通知が表示される。

f:id:inokara:20210125231520p:plain

おお、便利。

ちなみに、AppleScriptdisplay notification というコマンドを利用しても通知を飛ばせるらしい。

$ osascript -e 'display notification "foo"'

f:id:inokara:20210125232028p:plain

おお、これも便利。

ちょっと時間がかかりそうな処理を走らせておいて、別作業をする時とかに、前者の処理が終了した時に terminal-notifier を叩くように仕込んでおくと良さそう。

2021 年 01 月 24 日 (日)

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

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

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

ジョギング

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

読書

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

レアジョブ

今日の指摘事項。

「ジョギングに行く」と言いたかったんだけど...

You said: I go _to_ jogging.

Correct: I go jogging.

go to だと、後に場所が来ることになるので、「私はジョギング (という場所) に行く」と恥ずかしげもなく言っていたことなる... 「ジョギングをしに行く」という場合には、I go jogging となる。例えば、テニスをしに行くの場合には I go playing tennis となる。

「彼は彼のクラスメイトと飲みに行きます」と言いたかったんだけど...

You said: He drinks his classmate.

Better: He goes drinking with his classmates.

「私は毎週土曜日にゴミを出します」と言いたかったんだけど...

Q: How often do you take out the trash?
You said: I take the trash every Sunday.

Correct: I take *out the* trash every Sunday.

take out the trash がなかなか出てこない...

とにかく、全般的に文法が駄目。

夕飯

RabbitMQ

この土日は、RabbitMQ を触っていた。

当初、以下の記事のサンプルコードを参考に、キューに溜まったメッセージの出し入れの雰囲気を試した。

www.cloudamqp.com

下図のように publisher (producer) がキューに Exchange を介してメッセージを放り込んで、consumer がメッセージを取り出すだけんだけど、ちょっと違和感があった。

https://www.cloudamqp.com/blog/2015-05-19-part2-1-rabbitmq-for-beginners_example-and-sample-code-ruby.html

ちょっとした違和感というのは、consumer を起動すると、キューの中のメッセージが一気に無くなってしまうということ。自分の乏しい認識だと、consumer はキューから 1 件ずつメッセージを取り出して、メッセージの受信が完了したら、キューの中のメッセージが削除される... だったんだけど。

ということで、試行錯誤していたら Bunny::Queue#subscribe:manual_ack というオプションを有効にすることで、自分の認識通りの挙動となることを確認した。:manual_ack という名の如く、メッセージの受信処理が完了したことを RabbitMQ に教えてあげる為に ch.ack(delivery_info.delivery_tag) こんな感じで ack を送って上げる必要がある。

# サンプルを参考にしたコード
require "bunny"

conn = Bunny.new 'amqp://rabbitmq-server'
conn.start

def processing(message)
  puts "### Handling processing for ..."
  puts message
  sleep 5
  puts "### processing done"
end

puts "Processing Start..."
begin
  ch = conn.create_channel
  # ch.prefetch(1)
  q = ch.queue("examplequeue1", :durable => true)
  
  q.subscribe(:block => true) do |delivery_info, properties, payload|
    processing(payload)
  end
  sleep 10 while true
rescue Interrupt => _
  conn.close
end

# :manual_ack を有効にしたコード
require "bunny"

conn = Bunny.new 'amqp://rabbitmq-server'
conn.start

... 略 ...

puts "Processing Start..."
begin
  ch = conn.create_channel
  ch.prefetch(1) # キューから 1 件ずつメッセージを取り出す
  q = ch.queue("examplequeue1", :durable => true)
  
  q.subscribe(:manual_ack => true) do |delivery_info, properties, payload|
    processing(payload)
    ch.ack(delivery_info.delivery_tag)
  end
  sleep 10 while true
rescue Interrupt => _
  conn.close
end

ということで、学びの多い週末でした。

rubybunny.info

www.rabbitmq.com

2021 年 01 月 23 日 (土)

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

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

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

ジョギング

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

プランクレーニングについては、以下の動画が参考になった。

www.youtube.com

読書

Webで使えるmrubyシステムプログラミング入門 CHAPTER 06 を読みは始めた。C 言語濃度が濃くなってきて、一回読むだけでは理解が難しいレベルになってきた。3 回くらい読もうと思う。

レアジョブ

今日はお休み。

夕飯

たこ焼きが美味しゅうございました。

奥さん

体調を崩していたけど、今日、かかりつけの病院で受診して帰ってきたら、少しだけ顔色が良くなって、夕飯のたこ焼きを準備してくれたのでちょっと安心した。

2021 年 01 月 22 日 (金)

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

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

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

ジョギング

[ランニング 2021-01-22-朝] 朝ラン / かっぱさんの活動データ | YAMAP / ヤマップ

読書

今日は時間を作れなかった。明日は読もう。

レアジョブ

今日もコテンパだった。

You said: She traveling every month.

Correct: She *travels* every month.

なぜか、travelstraveling と言っちゃったり...

一番、残念だったのは、先日のレッスンで指摘された内容について、改めて間違ってしまったこと...orz

Q: How often do you go on business trips?
You said: I go to business trip every month.

Correct: I go on business trips every month.

これ。onto になってしまったり..

挙げ句の果てには...

You said: How often do you exercising?

Correct: How often do you *exercise* ?

夕飯

jq の底力を見せつけられたのでブログを書いた

このブログの心残りは、jq を gdbデバッグして、システムコールを覗き見ようとしたけど、以下のようにコマンドの実行結果が出力されただけだった。

$ gdb jq
(gdb) run -n '1611312534|strflocaltime("%Y-%m-%dT%H:%M:%S %Z")'
Starting program: /usr/local/bin/jq -n '1611312534|strflocaltime("%Y-%m-%dT%H:%M:%S %Z")'
"2021-01-22T19:48:54 JST"

自前でコンパイルしないと駄目なのかな。

jq の底力を目の当たりにしたのでここに記す 〜 関数 strflocaltime や strftime を試す 〜

追記 (2021/01/23)

gdb で strflocaltime 関数の処理を追う

ソースコードgithub から取得して、手元の環境で jq をビルドし、gdb で strflocaltime 関数の処理を追ってみました。

$ gdb /usr/local/bin/jq
... 略 ...
(gdb) break f_strflocaltime
Breakpoint 1 at 0x4fca0: file src/builtin.c, line 1567.
(gdb) -n '1611312534|strflocaltime("%Y-%m-%dT%H:%M:%S %Z")'
Undefined command: "-n".  Try "help".
(gdb) run -n '1611312534|strflocaltime("%Y-%m-%dT%H:%M:%S %Z")'
Starting program: /usr/local/bin/jq -n '1611312534|strflocaltime("%Y-%m-%dT%H:%M:%S %Z")'
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, f_strflocaltime (jq=0x555555638530, a=..., b=...) at src/builtin.c:1567
1567      if (jv_get_kind(a) == JV_KIND_NUMBER) {
(gdb) n
1568        a = f_localtime(jq, a);
... 略 ...
1578      size_t alloced = strlen(fmt) + 100;
(gdb) n
1579      char *buf = alloca(alloced);
(gdb) n
1580      size_t n = strftime(buf, alloced, fmt, &tm);
(gdb) n
1581      jv_free(b);
... 略 ...
process (jq=0x555555638530, value=..., flags=<optimized out>, dumpopts=645) at src/main.c:181
181         if ((options & RAW_OUTPUT) && jv_get_kind(result) == JV_KIND_STRING) {
(gdb) n
190           if (jv_get_kind(result) == JV_KIND_FALSE || jv_get_kind(result) == JV_KIND_NULL)
(gdb) n
194           if (options & SEQ)
(gdb) n
196           jv_dump(result, dumpopts);
(gdb) n
198         if (!(options & RAW_NO_LF))
(gdb) n
199           priv_fwrite("\n", 1, stdout, dumpopts & JV_PRINT_ISATTY);
(gdb) n
"2021-01-22T10:48:54 UTC"
200         if (options & RAW_NUL)

strftime(3) あたりが呼ばれていることが解りました。

ちなみに、gdb の使い方は、以下の記事がとても解りやすかったです。

rat.cis.k.hosei.ac.jp

さすが、大学の講義で使われるであろう資料だと思います。

はじめに

jq にはいつもお世話になっていますが、今日ほどお世話になった日はありませんでした。ということで、jq に用意されている strflocaltimestrftime という関数が感動したのでメモっておきます。

stedolan.github.io

尚、本記事で扱う環境は jq のバージョンは以下の通りです。

$  sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H114

$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

$  jq --version
jq-1.6

strflocaltime 関数や strftime 関数

ドキュメントより

jq における strflocaltimestrftime 関数は、以下のように解説されています。(ドキュメントを抜粋しました)

Low-level jq interfaces to the C-library time functions are also provided: strptime, strftime, strflocaltime, mktime, gmtime, and localtime. Refer to your host operating system's documentation for the format strings used by strptime and strftime. Note: these are not necessarily stable interfaces in jq, particularly as to their localization functionality. 〜 略 〜 The strftime(fmt) builtin formats a time (GMT) with the given format. The strflocaltime does the same, but using the local timezone setting.

C 言語の関数として提供されている strftime 等へのインターフェースとして、同名の関数が jq にも提供されているという理解です。注意書きに「これらは必ずしも jq の安定したインターフェースではありません」とあることから、関数が実行される OS の制約を受ける可能性があるから、このような書き方がされているのかなと考えています。

尚、strftime は、GMT の時刻を返しますが、strflocaltime はローカルのタイムゾーン設定を使用するとのことです。

UNIX TIME だと、ぱっと見わからない

JSON データに UNIX TIME が記録されていて、誰かに見せる時に何時何分なのか解らなくて、なんか良い方法がないかなーと調べていたら jq の strflocaltime に出会いました。

以下は、RabbitMQ サーバーが提供している REST API のレスポンスについて、namehead_message_timestamp というキーを抽出した結果です。(唐突に RabbitMQ が登場してきてすいません。今回は単純に UNIX TIME を返す REST API サーバーと思って下さい)

$ curl -s -uxxxx:xxxx localhost:15672/api/queues | jq -r '.[]|[.name, .head_message_timestamp]|@sh'
'examplequeue1' 1611312534
'examplequeue2' 1611312488
'examplequeue3' 1611312502

ここで出力されている 16113125341611312488 等が UNIX TIME ですが、パッと見、何時何分なのか解りません。

これを、先述の strflocaltime 関数を利用してローカル時間に変換してみます。

# on macOS
$ curl -s -uxxxx:xxxx rabbitmq-server:15672/api/queues | jq -r '.[]|[.name, (.head_message_timestamp|strflocaltime("%Y-%m-%dT%H:%M:%S %Z"))]|@sh'
'examplequeue1' '2021-01-22T19:48:54 JST'
'examplequeue2' '2021-01-22T19:48:08 JST'
'examplequeue3' '2021-01-22T19:48:22 JST'

# on Debian
$ export TZ=Asia/Tokyo
$ curl -s -uxxxx:xxxx rabbitmq-server:15672/api/queues | jq -r '.[]|[.name, (.head_message_timestamp|strflocaltime("%Y-%m-%dT%H:%M:%S %Z"))]|@sh'
'examplequeue1' '2021-01-22T19:48:54 JST'
'examplequeue2' '2021-01-22T19:48:08 JST'
'examplequeue3' '2021-01-22T19:48:22 JST'

なんということでしょうか。ちゃんと日本時間で出力されているではないですか!

以上

ドキュメントを読みましょう案件ですが、jq の奥深さを実感した一日でした。

おまけ 〜 jq ソースコードリーディング 〜

jq って Go で実装されているもんだと思っていました (全く根拠の無い思い込みでした) が、実は C 言語で実装されていました。

github.com

今回、話題に上がっている strflocaltimestrftime については、以下に実装されていました。

github.com

strflocaltime に関与している部分を抜粋すると、以下のような実装になっていました。

#ifdef HAVE_STRFTIME
static jv f_strflocaltime(jq_state *jq, jv a, jv b) {
  if (jv_get_kind(a) == JV_KIND_NUMBER) {
    a = f_localtime(jq, a);
  } else if (jv_get_kind(a) != JV_KIND_ARRAY) {
    return ret_error2(a, b, jv_string("strflocaltime/1 requires parsed datetime inputs"));
  } else if (jv_get_kind(b) != JV_KIND_STRING) {
    return ret_error2(a, b, jv_string("strflocaltime/1 requires a string format"));
  }
  struct tm tm;
  if (!jv2tm(a, &tm))
    return jv_invalid_with_msg(jv_string("strflocaltime/1 requires parsed datetime inputs"));
  const char *fmt = jv_string_value(b);
  size_t alloced = strlen(fmt) + 100;
  char *buf = alloca(alloced);
  size_t n = strftime(buf, alloced, fmt, &tm);
  jv_free(b);
  /* POSIX doesn't provide errno values for strftime() failures; weird */
  if (n == 0 || n > alloced)
    return jv_invalid_with_msg(jv_string("strflocaltime/1: unknown system failure"));
  return jv_string(buf);
}
#else
static jv f_strflocaltime(jq_state *jq, jv a, jv b) {
  jv_free(a);
  jv_free(b);
  return jv_invalid_with_msg(jv_string("strflocaltime/1 not implemented on this platform"));
}
#endif

色々と気になる (けど、理解は出来ない) 部分はありますが、内部的に C の API コールである strftime(3) がコールされていることが解ります。strftime(3) は、

strftime() 関数 は、要素別の時刻 tm の内容を format で指定された書式指定にしたがって変換し、 長さ max の文字列 s に書き込む。

とあります。strflocaltime という関数は、おそらく、時刻のローカルのタイムゾーンを取得して、引数として与えられた書式で時刻を返しているということが「何となく」解りました。

2021 年 01 月 21 日 (木)

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

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

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

ジョギング

  • 体調がイマイチだったので、完全休養

読書

今日は通院日で受診を待っている時間でで、Webで使えるmrubyシステムプログラミング入門 CHAPTER 05 読み直し。少しずつだけど、内容を理解出来るようになった。そのままの勢いで CHAPTER 06 を少し読み始めた。まだまだ C 言語周りの用語が多々出てくるので、ページを行ったり来たりしているけど、不思議と挫折しないで読み進められるので引き続き頑張ろう。

レアジョブ

今日はお休み。いつも先生が予約取れない状況だったけど、明日の 19 時に予約が取れた。

夕飯

冷蔵庫にベーコンの塊があったので、プチトマトやら茄子やらエリンギ等を刻んでソースにしてパスタを作った。そこそこ美味しゅうございました。最近、皿洗いをすることが多いけど、手荒れが酷くて辛い。奥さんの苦労を実感した。食洗機を導入しようかな...

GCP の Monitoring Alert Policy を Terraform で設定しようとして...

思ったよりも苦労した。

既に設定済みの Alert Policy をインポートしようとして、ドキュメントを読んでみたんだけど...

$ terraform import google_monitoring_alert_policy.default {{name}}

{{name}} ここの値はどこから取得するのか解らなくて小一時間右往左往した。しかも name なのか {{name}} (波括弧を含む) のか、解らなくて右往左往した。

結局、gcloud コマンドを使って、Alert Policy のリストを取得することで、name を確認することが出来た。

$ gcloud alpha monitoring policies list

cloud.google.com

cloud.google.com

上記のコマンドを実行すると、以下のように YAML 形式で Alert Policy を取得出来た。

---
combiner: OR
conditions:
- conditionThreshold:
    aggregations:
    - alignmentPeriod: 60s
      crossSeriesReducer: REDUCE_COUNT
      perSeriesAligner: ALIGN_MEAN
    comparison: COMPARISON_GT
    duration: 0s
    filter: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    thresholdValue: 50.0
    trigger:
      count: 1
  displayName: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  name: projects/project_name/alertPolicies/1234567890123456/conditions/1234567890123456
creationRecord:
  mutateTime: '2021-01-21T10:09:37.537443475Z'
  mutatedBy: xxxxx@xxxxx.jp
displayName: xxxxxxxxxxxxxxxxxxxxxxx
documentation:
  content: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  mimeType: text/markdown
enabled: true
mutationRecord:
  mutateTime: '2021-01-21T10:09:37.537443475Z'
  mutatedBy: xxxxx@xxxxx.jp
name: projects/project_name/alertPolicies/1234567890123456
notificationChannels:
- projects/project_name/notificationChannels/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

上記の YAML ドキュメントの name: projects/project_name/alertPolicies/1234567890123456 を利用して、以下のように terraform import 出来た。

$ terraform import google_monitoring_alert_policy.default projects/project_name/alertPolicies/1234567890123456

波括弧は不要。

結局、conditionThresholdfilter 指定は、実際に Web コンソールをポチポチした方が良いということが解って、且つ、CloudWatch Alarm を Terraform で設定するよりも敷居が高いことを痛感した。

2021 年 01 月 20 日 (水)

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

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

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

ジョギング

[ランニング 2021-01-20-朝] 朝ラン / かっぱさんの活動データ | YAMAP / ヤマップ

朝ラン。寒すぎたけど、走れることが本当に嬉しい。

読書

マジで、あかん、今日も本を読む時間を作れなかった。

レアジョブ

今日はお休み。いつも先生が予約取れない。。。

夕飯

今日は麻婆鍋。奥さんから教えてもらったレシピを参考に、豆板醤や甜麺醤等を駆使してスープ作りから。思ったよりも美味しく出来て良かった。

父は、定年退職後も、「家に居てもやることが無い」と言って、アルバイトに出ているが、その職場でちょっとした事故を起こしたとのことで、珍しく凹んだ様子だった。とにかく、父自身やその周りの人たちに大事が無くて本当に良かった。この歳になっても、外に出て働いて頑張ろうという父をとても尊敬しているが、これを機会に父が自信を無くしてしまったりしないか心配。

よっちゃん

葛飾金町に住んでいる時にとてもお世話になった居酒屋よっちゃんのマスターに久しぶりに電話で話した。コロナによる営業の時短要請の影響をモロに受けてしまっているとのこと。色々と大変だと思うけど、体だけには気をつけて欲しい。

HPA (水平ポッド自動スケーリング)

GKE を少しずつ触っていて、Pod の自動スケーリングを行う HPA という機能が提供されているんだけど、ここで、スケールアウトする際のトリガーとなる CPU 使用率 (CPU Utilization) は Kubernetes 内でどのように計算されているかを調べた。

cloud.google.com

色々と調べたけど、「これ!」という明確な回答にはたどり着かなかったけど、以下の Stack Overflow の記事が個人的に解りやすかった。

stackoverflow.com

Kubernetes をちゃん運用しようとすると、本腰を入れて基礎から勉強する必要があるなあと思った次第。

2021 年 01 月 19 日 (🔥)

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

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

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

ジョギング

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

右足ハムストリングに強い張り。

明日の朝は走ろうと思う。

読書

あかん、今日も本を読む時間を作れなかった。

レアジョブ

今日は (も) 指摘が多かった。on とか to の使い方がアイマイ過ぎて辛い。

月に一度のペースで給料をもらっています。

You said: I get pay every one month. Better: I get paid once a month.

彼女は毎週末にゴミを出します。

You said:She takes trash every weekend. Better: She takes out the trash every weekend.

go on business trips で出張に行く。

You said: I sometimes go to business trips. Better: I sometimes go on business trips.

毎週末飲みに行きます。

You said: I go to drink every weekend. Correct: I go drinking every weekend.

駄目だ... 小学生レベルだ...

夕飯

今日もお鍋。大根が相変わらず美味しい。

お鍋は昆布から出汁を取るので、出汁を取った後の昆布は佃煮にしている。しかし、最近、鍋が続くので佃煮の在庫が増えてきた。

テスト

システムのテストについて、どんな種類があるのかググってみたら、以下の記事が簡潔にまとまっていて解りやすかった。

qiita.com

有難うございました。

2021 年 01 月 18 日 (🌛)

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

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

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

ジョギング

[ランニング 2021-01-18-朝] 朝ラン 〜 サムサムサム寒い 〜 / かっぱさんの活動データ | YAMAP / ヤマップ

読書

今日も読む時間を作ることが出来なかったので、明日は少しでも時間を作ろうと思う。

レアジョブ

チューターのインターネット回線がグダグタだったのか、途中で声が聞こえなくなったり、フリーズして、挙げ句の果てには接続が切れたりと踏んだり蹴ったりだった。

Let’s meet up at 7:15.

You said: I want to go at Saturday, December 16. Correct: I want to go on Saturday, December 16.

at とか on の使い分けが解らない。

You said: They go to travel every month. Correct: They travel every month.

「行く」は go to という脊髄反射で凝り固まった考え。travel だけで「旅行に行く」と表現出来るらしい。

夕飯

今宵もお鍋。

実家から送ってもらった大根が思いの外美味しくて、生のまま食べても美味しゅうございました。

奥さんの体調

一進一退。まあ、のんびりといきましょう。

GCP の monitoring 完全に理解した

ダッシュボードを作ってみたけど、メトリクスの種類は多岐に渡っているように見えるけど、CloudWatch ダッシュボードと比較すると、洗練されていないような感じ。メトリクスの量が多いとブラウザ (Safari) が固まったりして辛かった。

収穫だったのは、GKE のコンテナ数を取得したい場合、下図のように設定すると取得することが出来た。

f:id:inokara:20210118232427p:plain

で設定する。必要に応じて、Filter で絞り込めば良い。