アクティビティ (今までの走行 (歩行) 距離)
Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら。
ジョギング
山王公園を 10 マイルほど。
レアジョブ
今日はお休み。
夕飯
寒さに便乗してお鍋。というかお豆腐と奥さんが好きなはんぺんしか入っていないお鍋。温まりましたー
Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら。
今日もエアロバイクを 70 分。
今朝も正蔵先生。クリスマスの準備で忙しいとのこと。自家製ハムの仕込みについて色々と教えてもらった。正蔵先生の言っていることがだいたい解るようになったのは大きな進歩かもしれない。
我が家の定番豚ハラミのネギのせがジューシーで美味しゅうございました。
Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら。
エアロバイクを 70 分。
今朝も正蔵先生。フィリピンでは、クリスマスに向けて盛り上がっているとのこと。素敵なクリスマスをお過ごし下さいmm
ご査収のほどよろしくお願いします。 https://t.co/rb8QJfrIO6
— Yohei Kawahara(かっぱ) (@inokara) 2021年12月23日
お召し上がり下さいmm https://t.co/XNJQdxDkgd
— Yohei Kawahara(かっぱ) (@inokara) 2021年12月23日
にリモートで参加した。
今日も会社の TGIF にリモートで参加している。よく考えたら、今日は木曜日だ。 pic.twitter.com/nqL5h20e3Z
— Yohei Kawahara(かっぱ) (@inokara) 2021年12月23日
会社のアドベントカレンダー用の記事を書いていた。
YAMAP エンジニア Advent Calendar 2021 の第 17 日目の記事にします。
皆さん、日々の作業の振り返りってどのようにされていますか?
自分は、以下のように、退勤しますポストのスレッドに「俺の夕会」と称して、Slack を相手に独りでやっています。
こうやって、日々のやったことが Slack 上に記録されることになります。
この Slack 上に記録した「俺のやったこと」を一ヶ月分取得したくなりました。なぜなら、月末に、社内で利用している勤怠管理システムに、工数登録をする必要になったからです。ということで、以下のような Ruby スクリプトで Slack にポストした投稿を取得して、一ヶ月分の「俺のやったこと」をリストアップすることにしました。
require 'json' require 'net/http' require 'csv' SLACK_API_BASE_URL = 'https://slack.com/api' SLACK_BASE_URL = ENV['SLACK_BASE_URL'] SLACK_USER_TOKEN = ENV['SLACK_USER_TOKEN'] MY_SLACK_CHANNEL_ID = ENV['MY_SLACK_CHANNEL_ID'] OLDEST = ARGV[0].nil? ? 7 : ARGV[0] # 7 日前のタイムスタンプを取得 now = Date.today days_ago = now - OLDEST.to_i oldest = sprintf("%.5f", days_ago.to_time.to_i) cursor = nil loop do # https://api.slack.com/methods/conversations.history uri = URI("#{SLACK_API_BASE_URL}/conversations.history") params = { channel: MY_SLACK_CHANNEL_ID, cursor: cursor, limit: 1000, oldest: oldest } uri.query = URI.encode_www_form(params) req = Net::HTTP::Get.new(uri) req[:Authorization] = "Bearer #{SLACK_USER_TOKEN}" res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http| http.request(req) end res_body = JSON.parse(res.body) res_body['messages'].each do |message| next if message['subtype'] == 'bot_message' myts = message['thread_ts'] if message['text'].include?('撤収') next if myts.nil? ts = message['ts'].to_i time = Time.at(ts, in: "+09:00").strftime("%F %T") # https://api.slack.com/methods/conversations.replies uri = URI("#{SLACK_API_BASE_URL}/conversations.replies") params = { channel: MY_SLACK_CHANNEL_ID, ts: myts } uri.query = URI.encode_www_form(params) req = Net::HTTP::Get.new(uri) req[:Authorization] = "Bearer #{SLACK_USER_TOKEN}" res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http| http.request(req) end res_body = JSON.parse(res.body) res_body['messages'].each do |msg| puts "\n-----------------------------------------------\n" if msg['text'].include?('俺の夕会') ts = msg['ts'].to_i if msg['text'].include?('俺の夕会') time = Time.at(ts, in: "+09:00").strftime("%F %T") puts "#{time}\n#{msg['text']}" if msg['text'].include?('俺の夕会') end end break unless res_body['has_more'] cursor = res_body['response_metadata']['next_cursor'] end
このスクリプトを yattakoto.rb なんてファイル名で保存しておいて、以下のように実行します。
$ export SLACK_BASE_URL=https://xxxxxxxxxxxx $ export SLACK_USER_TOKEN=your-token $ export MY_SLACK_CHANNEL_ID=your-channel $ ruby yattakoto.rb
以下のように出力されます。
----------------------------------------------- 2021-12-22 22:08:28 # 俺の夕会 2021-12-22 ## 今日やったこと • 楽しいミーティング • あれ • これや ----------------------------------------------- 2021-12-21 23:33:59 # 俺の夕会 2021-12-21 ## 今日やったこと • つらいミーティング • あれ • これや ----------------------------------------------- 2021-12-17 18:40:46 # 俺の夕会 2021-12-17 ## 今日やったこと • ねむいミーティング • まけないこと • なげださないこと ----------------------------------------------- 2021-12-16 19:09:13 # 俺の夕会 2021-12-16 ## 今日やったこと • ねむいミーティング • にげださないこと • しんじぬくこと
yattakoto.rb はデフォルトで、過去 7 日分の「俺のやったこと」を取得しますが、今回は休みが重なったので 4 日分の「俺のやったこと」が取得出来ました。
YAMAP エンジニア Advent Calendar 2021 の第 16 日目の記事にします。
YAMAP では、全てのプロジェクトにおいて ECS 上にアプリケーションを展開していて、デプロイには ecspresso を利用しています。これまでに、特にデプロイが失敗したことで、サービスの障害につながるようなケースは発生していませんが、ECS のデプロイが失敗した際の挙動について確認したいと思ったので、実際にデプロイ失敗時の挙動を確認してみました。
尚、この検証を行ったのは、2021 年の 8 月中旬となりますので、場合によっては、異なる挙動となるかもしれませんのご注意下さい。
"failedTasks": 5,
がインクリメントされて、10
になったら、自動的にデプロイがロールバックする$ aws ecs describe-services --services test-service --cluster test-cluster --query services[].deployments [ [ { "id": "ecs-svc/12345678901234567890", "status": "PRIMARY", "taskDefinition": "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxxx:task-definition/test-task:12", "desiredCount": 1, "pendingCount": 1, "runningCount": 0, "failedTasks": 5, "createdAt": "2021-08-02T16:09:29.510000+09:00", "updatedAt": "2021-08-02T16:09:29.510000+09:00", "launchType": "EC2", "rolloutState": "IN_PROGRESS", "rolloutStateReason": "ECS deployment ecs-svc/12345678901234567890 in progress." }, { "id": "ecs-svc/99999999999999999999", "status": "ACTIVE", "taskDefinition": "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxxx:task-definition/test-task:11", "desiredCount": 1, "pendingCount": 0, "runningCount": 1, "failedTasks": 0, "createdAt": "2021-08-02T16:06:15.444000+09:00", "updatedAt": "2021-08-02T16:10:04.498000+09:00", "launchType": "EC2", "rolloutState": "COMPLETED", "rolloutStateReason": "ECS deployment ecs-svc/99999999999999999999 completed." } ] ]
ECS サービスの定義、最新のタスク定義を取得出来る。
ecspresso init --region ap-northeast-1 \ --cluster test-cluster \ --service test-service \ --config test-service.yaml
ECS サービスを更新する。
ecspresso deploy --config test-service.yaml
Nヶ月後の自分の為に書きました。
YAMAP エンジニア Advent Calendar 2021 の第 13 日目の記事にします。
そして、記事の内容は、以下の記事の焼き直しです。
Github Organization 内のリポジトリで .circleci/config.yml が存在しているリポジトリを抽出する必要がありました。
事前に Personal Access Token (xxx_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
) を取得しておいて、例えば、oreno-tools Organization を検索してみると...
$ curl -s \ -H "Authorization: token xxx_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \ -H "Accept: application/vnd.github.v3+json" \ 'https://api.github.com/search/code?l=YAML&p=2&q=org%3Aoreno-tools+in%3Apath+%22.circleci%2F%22&type=Code&per_page=100' \ | jq -r .items[].repository.full_name
以下のように出力されました。
oreno-tools/bibuild oreno-tools/wafoo oreno-tools/amiCtrl
いい感じです。
以下のドキュメントを参考にしました。
同じく、Github Organization 内のリポジトリで Terraform コード (HCL) が存在しているリポジトリを抽出する必要がありました。
事前に Personal Access Token (xxx_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
) を取得しておきます。例えば、oreno-tools Organization を検索してみると...
TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx curl -s \ -H "Authorization: token $TOKEN" \ -H "Accept: application/vnd.github.v3+json" \ 'https://api.github.com/search/repositories?q=org%3Aoreno-tools+language:hcl&sort=&order=' | jq -r .items[].html_url
残念、oreno-tools Organization 内には、HCL が含まれたリポジトリはありませんでした。
検索結果が存在していない場合には、以下のように出力されます。
{ "total_count": 0, "incomplete_results": false, "items": [ ] }
HCL ではなく、Ruby コードが含まれるリポジトリを検索してみましょう。
TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx curl -s \ -H "Authorization: token $TOKEN" \ -H "Accept: application/vnd.github.v3+json" \ 'https://api.github.com/search/repositories?q=org%3Aoreno-tools+language:ruby&sort=&order=' | jq -r .items[].html_url
以下のように出力されました。
https://github.com/oreno-tools/furikake https://github.com/oreno-tools/daimyo https://github.com/oreno-tools/wafoo https://github.com/oreno-tools/seiton https://github.com/oreno-tools/releases.oreno.tools
いい感じです。
以下のドキュメントを参考にしました。
N ヶ月後の自分の為に書きました。
Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら。
エアロバイクを 50 分。
今朝も正蔵先生。「プリクラで髪の毛を追加できるか?」という話題で盛り上がった。
ご査収のほどよろしくお願いいたします。 https://t.co/ZVT4afHvE5
— Yohei Kawahara(かっぱ) (@inokara) 2021年12月22日
チキンソテーがオススメです。おごちそうさまでした。 https://t.co/P2c1O2sOYO
— Yohei Kawahara(かっぱ) (@inokara) 2021年12月22日
エアロバイクを漕ぎながら、シャワーを浴びながら、ご飯を食べながら視聴した。
Matz さんの基調講演に始まって、LT まで、すごく心が揺さぶられた。
やっぱり、何はなくとも、エンジニアじゃなくても、解っちゃいるけど、改めて、誰でもアウトプットは大切であることを痛感した。また、録画を見直したい。
Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら。
完全休養。また、右足に痛みがあって辛い。
久しぶりに正蔵先生だった。
ご査収下さい。 https://t.co/2mCa8HiqiP
— Yohei Kawahara(かっぱ) (@inokara) 2021年12月21日
美味しゅうございました。 https://t.co/vCThj24poS
— Yohei Kawahara(かっぱ) (@inokara) 2021年12月21日
Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら。
朝 5 時半に起きて、6 時過ぎからスタート。さすがにこの時期の 6 時過ぎは暗すぎた。
#おつかれ山 でした🏃💨💨💨 #川原家合宿 #365日後くらいにサブスリーする46歳 #onrunning #onfriends #平戸ラン pic.twitter.com/do8ccgGO2X
— Yohei Kawahara(かっぱ) (@inokara) 2021年12月19日
今日も完全休養。明日は、久しぶりに正像先生。
奥さんが納豆パスタがエラくお気に入りなので、今日も調子に乗って作ってみた。前回よりも美味しく出来たので良かった。