Carpe Diem

備忘録

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

概要

年の瀬なので2021年に買ってよかったものを挙げてきます。

ゲーミングチェア

リモートワークで自宅でも座ってる時間が長くなったので自宅の椅子を買い替えました。 座り心地がめちゃくちゃいいので個人的にNo.1な買い物でした。

フローリングが傷つかないようにキャスターを別途購入してます。

続きを読む

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

概要

Bazel解説第3弾です。

Bazelを使ってみる その1(Goのビルド) - Carpe Diem
Bazelを使ってみる その2(protobufのビルド) - Carpe Diem

今回はDocker imageをビルドしてみます。

環境

  • Bazel v4.2.2

前提知識

通常docker imageを作成する際はDockerfileを使いますが、BazelではDockerfileを使わずにビルドします。
Dockerfile内で複雑にプロビジョニングする場合はDockerfileの方が直感的に書けてオススメですが、単純にバイナリを置くだけであればBazelも十分選択肢になります。

またBazelでバイナリを生成した場合はSandbox内に置かれるため、そこの連携という意味でもBazelに閉じる方がシンプルに用意できます。

続きを読む

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

背景

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

しかしながら導入の善し悪しを判断する上で最低限の知識は必要なので、一通りのことはできるようにとキャッチアップしてみます。

ちなみに発音は公式サイトでは「ベイゼル」とのこと。

How do you pronounce “Bazel”?

The same way as “basil” (the herb) in US English: “BAY-zel”. It rhymes with “hazel”. IPA: /ˈbeɪzˌəl/

ref: FAQ  |  Bazel

Bazelの特徴

Bazelの特徴として以下があります。

  • ビルドの再現性が保たれる
  • サンドボックス環境で実行される(Bazel1つだけあればビルドできる)
  • キャッシュの活用(ローカル・リモート)によるビルド時間の高速化

特に1つ目の特徴である「inputが同じであればoutputも同じ」という再現性のため、Bazelはinputの明示を重視します

通常inputというとソースコードが浮かびますが、それ以外にも

といった様々な要素があります。

大抵Bazelのビルドでコケるのはこのinput(特に依存ライブラリの関係)が不足しているケースが多いです。

続きを読む

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

背景

MacChromeやSlackの検索サジェストは便利ですが、いわゆるEmacsキーバインドにおけるCtrl-n/Ctrl-pによる上下移動ができません。

f:id:quoll00:20211122020046p:plain
Chromeの場合

f:id:quoll00:20211122020224p:plain
Slackの場合

もちろん矢印キーは使えますが、手をホームポジションから移動させるのは地味に不便なので解消できないか調べてみました。

続きを読む

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

概要

BigtableにはCheckAndMutateRow APIがあり、書き込む際に条件をつけることで更新のロストなどを防ぐ仕組みが用意されています。

※更新のロストについては以下を参考にしてください

トランザクションの分離レベルで出てくる用語 - Carpe Diem

今回はよくある書き込みパターンとその実装例を紹介します。

環境

条件付き書き込み

GoのSDKでは条件付き書き込みにはNewCondMutationを使います。

NewCondMutation(条件, 一致した時の変更処理, 一致しなかった時の変更処理)

と言った形式で利用します。

条件にはFilter interfaceを使います。
主なFilterとしては

などがあり、複数組み合わせて条件を絞ることも可能です。

続きを読む

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

概要

Redis Clusterが生まれるまではRedisの水平スケール手段としては前回紹介した

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

を用いた手法が使われていました。

これはRedis Ringと呼ばれる形でいくつかのライブラリでサポートされており、Goでもgo-redisでサポートされているので検証してみました。

環境

  • Redis v6.2.6
  • Go v1.7.2
  • go-redis v8.11.4
続きを読む