Carpe Diem

備忘録

2021-01-01から1年間の記事一覧

2021年買ってよかったものリスト

概要 年の瀬なので2021年に買ってよかったものを挙げてきます。 ゲーミングチェア リモートワークで自宅でも座ってる時間が長くなったので自宅の椅子を買い替えました。 座り心地がめちゃくちゃいいので個人的にNo.1な買い物でした。 Bauhutte ( バウヒュッ…

Bazelを使ってみる その3(docker imageのビルド)

概要 Bazel解説第3弾です。 Bazelを使ってみる その1(Goのビルド) - Carpe Diem Bazelを使ってみる その2(protobufのビルド) - Carpe Diem 今回はDocker imageをビルドしてみます。 環境 Bazel v4.2.2 前提知識 通常docker imageを作成する際はDocker…

Bazelを使ってみる その2(protobufのビルド)

概要 前回に引き続き今回もBazelについて書きます。 christina04.hatenablog.com 今回はProtocol BuffersをビルドしてGoで利用できるコードを生成します。 環境 Bazel 4.2.2

Bazelを使ってみる その1(Goのビルド)

背景 Bazelは優れたビルドツールである一方で、導入したチームには1人はBazel職人が必要と言われるほどキャッチアップコストが高くハマったときに開発が止まると言われます。 そのためKubernetesからも削除されるほどです。 しかしながら導入の善し悪しを判…

Chrome検索のサジェストをCtrl-n/Ctrl-pで選択できるようにする

Mac

背景 MacのChromeやSlackの検索サジェストは便利ですが、いわゆるEmacsキーバインドにおけるCtrl-n/Ctrl-pによる上下移動ができません。 Chromeの場合 Slackの場合 もちろん矢印キーは使えますが、手をホームポジションから移動させるのは地味に不便なので解…

Bigtableの条件付き書き込みパターン

概要 BigtableにはCheckAndMutateRow APIがあり、書き込む際に条件をつけることで更新のロストなどを防ぐ仕組みが用意されています。 ※更新のロストについては以下を参考にしてください トランザクションの分離レベルで出てくる用語 - Carpe Diem 今回はよく…

go-redisのRingの挙動を検証してみる

概要 Redis Clusterが生まれるまではRedisの水平スケール手段としては前回紹介した Consistent Hashing (コンシステントハッシュ法) - Carpe Diem を用いた手法が使われていました。 これはRedis Ringと呼ばれる形でいくつかのライブラリでサポートされて…

Consistent Hashing (コンシステントハッシュ法)

Consistent Hashingとは Consistent Hashingはハッシュテーブルアルゴリズムの1つです。 ハッシュテーブルのサイズの変更をしても柔軟にマッピングできるため、ノードの追加・削除が発生する分散データベースやキャッシュの保存先を決定するといった用途に…

ProtobufとStreamで扱うJSONはどちらが省メモリなのか

背景 JSONよりもProtobufの方が ファイルサイズが小さい シリアライズ・デシリアライズが速い ということは色んな検証記事から明らかになっています。 一方でGoのProtobufはデータをstreamで扱うのではなく、全部メモリに載せてシリアライズ・デシリアライズ…

Stream Deck MobileでZoomのミュートなどを使いやすく

概要 Stream Deckというスイッチャーのモバイルアプリがあり、それを使うことでZoomのミュートON/OFF、ビデオのON/OFFをやりやすくします。 背景 仕事ではZoomでオンラインミーティングをすることが多いのですが、ミュート等の切り替えが地味にストレスだっ…

GoのロギングライブラリzapのTips

概要 zapを使っていて 書き込み先をio.Writerで自由に設定したい テストで時刻を固定値にしたい ログレベルによって標準出力、標準エラー出力を分けたい GCP Cloud Loggingのフォーマットでログ出力したい 全ログに付けたいフィールドがある 独自logパッケー…

OPAでREST APIのAuthorizationを行う

OPA

概要 REST APIのAuthorizationをOPAに任せ、ミドルウェアなどで統一した処理にすることで認可処理の運用や柔軟性を向上させることができます。 今回はその実装方法を紹介します。 環境 opa v0.32.0 go v1.17 アーキテクチャ アーキテクチャのイメージとして…

OPA (Open Policy Agent) を使ってみる

OPA

背景 Policy as a Code(ポリシーをコードベースで管理する)の汎用的なエンジンとしてOPA - Open Policy Agent(オーパ)があります。 用途としては APIの権限管理(Authorization)を汎用化&共通化したい ネットワークの疎通に関するホワイトリスト(ブラ…

bugsnagのWeb UIでスタックトレースを表示する方法

背景 サーバサイドでエラー検知・トラッキングのSaaSを利用する場合、bugsnagが候補に挙がると思います。 ただそのままerrorをNotify()してみてもスタックトレースがきちんと表示されない問題にぶつかります。 今回はGoでbugsnagを利用する場合に、bugsnagの…

fmt.Errorfとxerrors.Errorfと独自エラーと

Go

背景 エラーハンドリングでは エラーが発生した箇所を追うことができる スタックトレースが出力できればなお良し エラーの原因によって処理を分岐することができる といったことが重要です。 Go 1.13から入ったラップする仕組みにより、エラーメッセージにア…

VPC ネットワークピアリングで内部IPで疎通する

概要 前回はCloud VPNによる内部IPでの疎通方法を紹介しました。 christina04.hatenablog.com 今回はVPCピアリングを用いた疎通方法を紹介します。 VPCピアリングを用いて内部IPによる接続を行うと以下のメリットがあります。 レイテンシ 外部IPアドレスを使…

Cloud VPN (Classic VPN) を使ってみる

概要 GCPのVPCは物理ネットワークを仮想化したネットワークであり、異なるVPC同士は直接疎通することはできません。 通常であればExternal IP経由もしくはLBなどを用いてアクセスしますが、内部IPで疎通したい場合はVPNを構築する必要があります。 検証 事前…

gRPCのkeepaliveで気をつけること その2

背景 以前gRPCのkeepaliveについて説明しました。 christina04.hatenablog.com keepaliveの目的は idleコネクションを維持するため 死んだコネクション(TCPハーフオープン)があったら切断し、再接続するため と書きましたが、どちらの検証もアクティブなRP…

gRPCのChannelについて

背景 gRPCにはクライアントとサーバとの通信を抽象化したChannelという仕組みがあります。 GRPC_GO_LOG_SEVERITY_LEVEL=infoを有効にした際に出てくる [core] Channel Created [core] parsed scheme: "" [core] scheme "" not registered, fallback to defau…

Kubernetes Eventを保持したりSlack通知させたりする

背景 Kubernetesは宣言的で自己回復するシステムを提供しているため、おかしなコミットが入ったdocker imageをapplyしてCrashLoopBackOffが発生していたりしても前のPodが生きていて気づかなかったみたいなケースがあります。 またメモリが瞬間的に枯渇する…

CircleCIでのslack連携 (Slackアプリ版)

背景 以前CircleCIの新UI後のslack連携を書きました。 今見るとまたやり方が変わっている(Webhook URL→Slackアプリ)ので、やり方を説明します。 環境 CircleCI v2.1 circleci/slack v4.4.2 手順 大きく3ステップあります。 Slackアプリを作る CircleCIのC…

gcloud auth login と gcloud auth application-default login

GCP

概要 ローカルからGCPにアクセスする際に使う gcloud auth login gcloud auth application-default login について区別できるようまとめます。 環境 gcloud v340.0.0 gcloud auth login 用途 こちらはローカルで以下のようなGCP系CLIを実行する際の認証を得…

Slackアプリでチャンネルにメッセージを送信する方法

概要 Slackアプリでチャンネルにメッセージを送信する方法は主に以下の3つがあります。 Incoming Webhooksを使う Bot TokenでSlack API (chat.postMessage) を叩く User TokenでSlack API (chat.postMessage) を叩く それぞれのやり方を説明します。 メッセ…

特定のGCSバケットにのみアクセスできるサービスアカウントの作り方

概要 christina04.hatenablog.com の実践編です。 特定のGCSバケットにのみアクセスできるサービスアカウントを作ってみます。

関連と集約と合成集約の違い

概要 UML図における 関連 (Association) 集約 (Aggregation) 合成集約 (Composition) の違いをまとめます。 関係図 まずそれぞれを集合で表現すると以下のようになります。

GCPのIAMを使う上で理解しておくこと

背景 IAMはアクセス制御をする上で非常に重要な仕組みですが、一方で複雑になりがちです。 間違った理解のままだと必要以上の権限を与えてしまい、事故の原因となるので押さえておくべき点をいくつかまとめてみます。 リソース階層 GCPのIAMにはリソース階層…

Go modulesで依存モジュールのメジャーバージョンがv2以上の時の対応

Go

背景 依存するモジュールのメジャーバージョンがv2以上の場合に、以下のようにバージョン指定すると $ go get github.com/xxx/yyy@v2.0.1 次のように怒られます。 require github.com/xxx/yyy: version "v2.0.1" invalid: should be v0 or v1, not v2 今回は…

CodecovのBash Uploader問題の再発防止策

概要 コードカバレッジサービスのCodecovでは、カバレッジファイルをアップロードする際に以下のようにbash scriptを実行します。 bash <(curl -s https://codecov.io/bash) ref: Codecov Bash uploader しかし先日、このbash scriptが何者かに勝手に改竄さ…

ユースケースに応じたユニークなIDの生成

Go

概要 ユニークなID生成をしたい場面は多々ありますが、ユニークIDにはユースケースによって以下のような要件が出てきます。 ユニーク 短い(=データ量が少ない) 推測困難 分散性(ランダム性) 順序性(Lexicographical) 生成速度 それぞれの観点について…

トランザクション分離レベルのケースと対応方法

背景 トランザクションの分離レベルで出てくる用語がぱっと頭に浮かぶよう、問題が発生するケースと対応方法をまとめます。 起きうる問題 基本的にどのDBも単一オブジェクトの原子性と分離性は保証します。 つまりデータ送信の途中でネットワーク接続が切れ…