Carpe Diem

備忘録

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
続きを読む

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

Consistent Hashingとは

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

アルゴリズムの説明

ハッシュ化

例えば入力値を0~99の値に変換するハッシュ関数を用意します。

ノードのIDをそのハッシュ関数で変換すると以下のように配置されたとします。

f:id:quoll00:20211026052712p:plain

続きを読む

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

背景

JSONよりもProtobufの方が

ということは色んな検証記事から明らかになっています。

一方でGoのProtobufはデータをstreamで扱うのではなく、全部メモリに載せてシリアライズ・デシリアライズするAPI(メソッド)しかありません。

github.com

過去にこんな記事を書いたように、streamで扱うことで大きくメモリ使用量が改善されるケースは多々あるので、

christina04.hatenablog.com

もしかして大きなデータをstructにデシリアライズする場合、メモリ使用量としてはJSONでstreamで扱う方が少なくなるのかな?と思って検証してみました。

続きを読む

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

概要

Stream Deckというスイッチャーのモバイルアプリがあり、それを使うことでZoomのミュートON/OFF、ビデオのON/OFFをやりやすくします。

背景

仕事ではZoomでオンラインミーティングをすることが多いのですが、ミュート等の切り替えが地味にストレスだったりします。

  • 今ミュート状態なのかどうかが分かりにくい
  • ショートカットキーはアプリがアクティブな状態でないと使えない
    • 議事録をとっていたり、ブラウザで調べながらやりとりすることはよくある
    • グローバルショートカットキーという手段もあるが干渉する可能性がある

そういった際に

  • 視覚的に今どういう状態かがすぐ分かる
  • 他アプリを使っている状態でもON/OFFの切り替えが可能

というスイッチャーは無いかなと調べたところいくつか候補が見つかりました。

続きを読む

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

概要

zapを使っていて

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

とちょっとカスタマイズしたいケースのTipsです。

環境

  • Go 1.17
  • go.uber.org/zap v1.19.1
続きを読む