Carpe Diem

備忘録

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

OPAでREST APIのAuthorizationを行う

概要

REST APIのAuthorizationをOPAに任せ、ミドルウェアなどで統一した処理にすることで認可処理の運用や柔軟性を向上させることができます。

今回はその実装方法を紹介します。

環境

  • opa v0.32.0
  • go v1.17

アーキテクチャ

アーキテクチャのイメージとしては以下です。
アクセスしたクライアントがその権限を持っているかOPAでチェックし、権限を持っていればアプリケーションサーバ側の処理④を実行します。

f:id:quoll00:20210913065102p:plain

続きを読む

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

背景

Policy as a Code(ポリシーをコードベースで管理する)の汎用的なエンジンとしてOPA - Open Policy Agentオーパ)があります。

用途としては

  • APIの権限管理(Authorization)を汎用化&共通化したい
  • ネットワークの疎通に関するホワイトリストブラックリスト)を汎用化したい
  • Terraformやらk8sのコードに独自のLinterを用意したい
    • TerraformでAWSのtagつけを必須にしたい、等

といった際に利用できます。

またエコシステムも充実しており、すでに多数のツールと組み合わせることが可能です。

f:id:quoll00:20210910071747p:plain

ref: Open Policy Agent | Ecosystem

今回はそのOPAの基本的な使い方を説明します。

続きを読む

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

背景

サーバサイドでエラー検知・トラッキングSaaSを利用する場合、bugsnagが候補に挙がると思います。

ただそのままerrorをNotify()してみてもスタックトレースがきちんと表示されない問題にぶつかります。

今回はGoでbugsnagを利用する場合に、bugsnagのWeb UIでスタックトレースを表示する方法を紹介します。

環境

  • Go 1.17
  • bugsnag-go v2.1.2
続きを読む