type holyshared = Engineer<mixed>

技術的なことなど色々

NEMAを飲む

ノンアルコールのジンを買って、飲んでいました。
NEMAのスタンダードはバラの香りがすごくて、ソーダとジンジャーエールで割って飲んでみましたが、ジンジャエールで割った方が美味しかったです。

ウィスキーの方もジンジャエールの方が美味しかったです。
ストレートで飲むより、カクテル向きなんだろうと思います。

NodejsのFormDataでクライアント証明書を指定して、リクエストする

仕事で外部サービスに対して、クライアント証明書を指定してクリエストを送信する必要があり調べてみました。
httpsモジュールのAgentのオプションにpfx、passphraseを指定して、FormDataのsubmitの引数に指定するだけです。

証明書は.pfxではなく、.p12だったのですがどっちでもOKぽかったです。
外部サービスの仕様上、multipart/mixedで送らないといけなかったので、axiosなどのクライアントが使用できなかったのでこのような実装になっています。
大体のクライアントはヘッダーをmultipart/form-dataにして送信するので、ちょっと面倒でした。

また、pathが/から始まらないといけないぽくて、read ECONNRESETが出て接続が切られる問題が発生し、原因の特定に時間が少しかかりました。
証明書の問題で接続が切られていると思ってしまったのが良くなかったです。

本番環境ではクライアント証明書や、パスフレーズなどはGCPのSecret Managerなどで管理しておくのが良いと思います。

const fs = require('fs')
const https = require('https')
const FormData = require('form-data')

const pfx = fs.readFileSync("./xyz.p12")

const agent = new https.Agent({
  pfx,
  passphrase: '1234'
})

const form = new FormData()
form.append('param1', '1234')
form.append('param2', '1234')

form.submit(
  {
    host: 'example.com',
    method: 'post',
    path: '/path/to',
    headers: {
      'Content-Type': `multipart/mixed; boundary=${form.getBoundary()}`,
    },
    agent,
    protocol: "https:"
  },
  (err, data) => {
    console.log(err)
  }
)

冨樫義博展の後期のチケットが買えた

気づいた時には欲しい時間帯の前期のチケットが買えなかったので、今日の10:00から販売開始する後期のチケットを朝頑張って買いました。
サーバーに負荷がかかっていて、何回かエラーになってたりしていたので、やっぱり狙っている人多いんだなと思いました。

ワクチン4回目を接種してきた

4回目摂取の通知が来てたけど、いつ行こうか迷っていて期間が空いてしまいました。 このままだと一生いかなさそうなので、重い腰を上げて集団摂取会場に行き、摂取しました。

自分の場合、今までの傾向だと摂取日は軽くだるいくらいで、翌日に寒気がする感じです。
しかし、今回は若干のだるさと、短時間の軽い発熱くらいで済んだのでよかったです。

SINN556.AB買えた

5月に予約しようと、SINN DEPOTの渋谷店にお邪魔したら、SINN556.ABの予約が埋まってしまっていました。
これは買えないなぁと思っていましたが、予約がキャンセルされる可能性があるので、予約しておいてもいいかもと言われたのでダメ元でキャンセル待ちの予約をしました。

それが今日の外出している時に、キャンセルが出たとのお知らせを受けて、外出先から渋谷に向かい購入することができました。

SINNの時計はこれで3本目です。
大事に使いたいと思います。

個人アプリのherokuからGCPへの移行

運用している個人アプリをherokuからGCPに移行しました。

前から移行したかったのですが、面倒で着手していませんでした。
作業自体は土日の休みに少しずつ作業を進めて完了させました。

手順としては、機能単位でGCPのサービスに置き換えていく方針で進めました。

フェーズ1

まず機能単位での置き換えを進めました。
worker用のdynoを使用した非同期JobをCloud Tasksに置き換えたり、セッション情報の格納をDatastoreに置き換えたりして、既存のherokuのAddonを外していきます。

ログもCloud Loggingに置き着替えて、BigQueryに保存するようにします。

フェーズ2

次はアプリケーションをコンテナ化できるように、CI/CDを準備します。
これはアプリケーションをCloud Runで実行させる為です。

Cloud Runでは利用するイメージを指定する必要があるので、先にCloud Buildでコンテナをビルドして、Artifact RegistryにコンテナイメージをPushしています。

フェーズ3

最後にherokuからCloud Runに置き換えます。
先にステージング環境を置き換えて、アプリケーションが正常に稼働するか確認してから、本番環境を置き換えました。

作業後の感想

Terraformのテンプレートがなかったので、新規で定義ファイルを用意する必要がありましたが、仕事でも利用しているので、そんなに大変ではなかったです。

自分のアプリの場合は、自分ひとりしか使用していないので、herokuよりコストは安くすみそうです。

アイリッシュコーヒー用のグラスを買った

JAMESONがうちにあるので、アイリッシュコーヒーを飲んでみたいなとずっと思ってたんだけど、できてなかったのでグラスを購入しました。

コーヒーは一旦インスタントのものにして、JAMESONを30ml入れた後、コーヒーを淹れ、 その後、ホイップクリームを乗せるだけにして見ました。

味は最初にホップクリームの甘さが来るのですが、後にコーヒーの苦味がきて調和される感じで美味しかったです。
最後の方はクリームが薄くなり、コーヒーの苦手味が強く出てくるので、苦手な人は砂糖を少量加えた方がいいかもしれないです。 また、コーヒーを入れた後軽く混ぜたほうがいいですね、ウィスキーが最後の方に残るぽいので。

生クリームがまだ残っているので、また明日飲もうと思います。