Carpe Diem

備忘録

Bazel を使う上での Tips

概要 Bazelを導入する過程で学んだTipsをまとめます。 環境 Bazel v4.2.2 Tips bazeliskを使う Bazelのバージョンを環境別に管理したい場合、bazelbuild/bazeliskを使うのが良いです。 .bazelversionに以下のようなバージョンを書いておけばそのバージョンで…

Bazelを使ってみる その6(テスト)

概要 Bazel解説第6弾です。 Bazelを使ってみる その1(Goのビルド) - Carpe Diem Bazelを使ってみる その2(protobufのビルド) - Carpe Diem Bazelを使ってみる その3(docker imageのビルド) - Carpe Diem Bazelを使ってみる その4(gRPCのビルド)…

fatal: could not read Username for 'https://github.com': terminal prompts disabledが出たら

概要 CIツールでプライベートリポジトリをgo getしようとするとたまに遭遇する fatal: could not read Username for 'https://github.com': terminal prompts disabled の対応方法をまとめます。 原因 go getはデフォルトだとHTTPSで通信しようとしますが、…

Bazelを使ってみる その5(リモートキャッシュ)

概要 Bazel解説第5弾です。 Bazelを使ってみる その1(Goのビルド) - Carpe Diem Bazelを使ってみる その2(protobufのビルド) - Carpe Diem Bazelを使ってみる その3(docker imageのビルド) - Carpe Diem Bazelを使ってみる その4(gRPCのビルド)…

Bazelを使ってみる その4(gRPCのビルド)

概要 Bazel解説第4弾です。 Bazelを使ってみる その1(Goのビルド) - Carpe Diem Bazelを使ってみる その2(protobufのビルド) - Carpe Diem Bazelを使ってみる その3(docker imageのビルド) - Carpe Diem 今回はgRPCをビルドしてみます。 gRPCは2…

GitHub ActionsでConventional Commitsを満たしているかチェックする

概要 Conventional Commits というコミットメッセージの規約があります。 これを守ることで 意味のあるコミット粒度&メッセージになる あとから振り返りやすい Change Logsなどで自動化ツールを活用しやすい といったメリットを享受できます。 しかし新しい…

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

Go

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

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バケットにのみアクセスできるサービスアカウントを作ってみます。