ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

自作 LSM-Tree その1

Log-Structured Merge Tree というデータ構造があって、データ指向アプリケーションデザインを読んでいるとかなり最初の方に出てくる。Wikipediaの記事の通りLevelDBを始めきょうびのさまざまなデータベース製品で使われている。

特徴はめちゃくちゃざっくり*1

  • 追記型のログを使うことで書き込みの性能を保つ
  • インデックスはキー名とログ内のオフセットzを持っておき、読み出しも速度を出す
  • ログを SSTable というデータ構造に退避することで、インデックスはある程度疎にしつつ(めちゃくちゃキーが多くなってインデックスの時点でデカくなるなどを防ぐ)速度を保ってアクセスできる
  • 必要に応じてマージなどをしてインデックスは最新のデータだけに、小さくする

今回お仕事とか色々でLSMを使うため、コードの理解を助けるためにまずは自分で実装しようと思ったので、久しぶりの連作ブログ記事を始めた。

自分で実装と言いつつ細かいところをオミットしていたり、勘違いもあると思うので、優しくご指摘いただければ...。

そんな感じです。

やること

LSM-Tree indexを持つログ追記型のファイルベースDBを作る。

細かいチューニングは置いておく。

言語はGoです。

*1:この時点で誤解があったら指摘してください...

続きを読む

Cloud BuildからCloud Functionsを呼びたい、それだけなんだ

Google Cloudのサーバレス主要サービスであるCloud BuildCloud Functionsを使っていて、Cloud BuildからCloud Functionsをなるべく安全っぽく呼びたかったのだが、適当な手順がなかなか見つからなかったのでここに残しておき、将来自分が忘れた時に検索可能にしたい。

Prelude: Compute EngineのVMからCloud Functionsを呼ぶ

Cloud FunctionsはCompute EngineのVMから呼ぶのは比較的簡単である。以下は、認証が必要なHTTPS呼び出し設定をしたFunctionsを前提とする。

続きを読む

Lima 0.14 のVirtualization.framework対応を試す

Linux Advent Calendar 2022 19日目の記事です、と言いつつ遅くなりましたが....。

qiita.com

Lima 、使ってますか

Linux Advent Calendar なのにMacの話では?となりそうな感じもありますが、Lima使っていますか? Docker の環境を colima で作っている方もいらっしゃるかもしれません。

Lima を用いるとコマンドラインベースでLinux VMを作成できて便利で、尚且つ複数のCPUアーキテクチャVMを立ち上げられます。Limaの場合、ホストと別アーキテクチャVM作成は、これまでQEMUを利用しており、動作はそれなりのオーバーヘッドがかかるようになっていました。

ですが、Lima 0.14 からVirtualization.framework(vz)に対応したそうです。待望の!

github.com

colima からVirtualization.frameworkを使う

lima >= 0.14 + colima 0.5.0 の組み合わせだと非常にあっさりvzで環境を作れるので、拍子抜けするほど便利です(無論Macのバージョンを 13.0 以降に上げる必要もあります)。

$ colima start --cpu 8 --memory 12 --disk 150 --arch x86_64 --vm-type vz ${profile_name}

以上!と言いたいところですがすごく簡単にベンチを取ってQEMUと比べておきましょう。

vz / QEMU のベンチ

簡単ですが、以下のようなDockerfileを作って Shopify/go-lua をビルドしてベンチマークとしてみました。

# syntax = docker/dockerfile:1.3-labs
FROM golang:1.19

RUN <<SHELL
    git clone https://github.com/Shopify/go-lua.git
    cd go-lua
    git submodule update --init
    go build
    go test -cover
SHELL

ホストの環境はApple M1 Max(8+2 core)、64GB memoryという感じです。

結果です。ビルドのフェーズ2の箇所の所要時間だけ抜粋すると、

vz

 => [2/2] RUN <<SHELL (git clone https://github.com/Shopify/go-lua.git...) ... 20.1s 

QEMU

 => [2/2] RUN <<SHELL (git clone https://github.com/Shopify/go-lua.git...) ... 22.5s

1割ほど高速になっているようです。処理の内容的に、ダウンロード+ビルドでCPUワークロードも雑多な感じなので、参考程度ではありますが。

もうちょっと複雑なソフトウェア(CRubyとか...)をビルドして比べてみたい気持ちもありますが、時間が...。


ということで軽くこんな感じです。 lima 0.14 + colima 0.5.0 のDocker環境はより快適だと思いますので、M1勢試していきましょう。

OSS Halfwayというワークショップを始めるよという話

皆さんは公開情報ですか?(挨拶)

初めに言いたいこと

タイトルの通りのワークショップを始めます。最初は福岡市内でオンサイトで、エンジニアカフェ[PR]でやっていくので、まずはぜひ福岡近辺のソフトウェアに関わるエンジニアに届いてほしい。

engineercafe.connpass.com

OSS Halfway とは?

以下、OSS Halfwayを始めるにあたって考えたことをつらつらと書いてみます。何かの参考になるかは分かりません。とにかく届いてほしい、来てくれ。

続きを読む

SlackのInteractionCallbackに含まれるMessageからもとのURLを復元する

10月何もしていない...(会社のブログはギリギリ書いた記憶がある)。

何もしなすぎてるので極小ネタを。

SlackのAppにはUser Interactionという機能があり、例えばSlackの入力画面からのショートカット実行結果を受け取り、フォームを返したりさらに入力を受け取ったりなんやかんやできる。

api.slack.com

qiita.com

この辺にまとまってる通りなのだけど、メッセージに紐づくショートカット(メッセージ右上のメニューから実行できるやつ)には、元のメッセージの情報がInteractionCallbackとして含まれている。例えばGoのコードならこういう感じで取れる。

payload := new(slack.InteractionCallback)
err := json.Unmarshal(getPayloadFormValue()), payload)
if err != nil { ... }

fmt.Printf("%v\n", payload.Message)

ところで、このMessageには元メッセージのURLがそのものズバリでは含まれていない模様。

例えばショートカットがAcceptされた通知として、元のメッセージのURLを含むポストをする(そうすると元メッセージも引用されるし)などをしたい場合、以下のようなコードを書くしかない。

workspace := "myworkspace"
chanId := payload.Channel.ID
slug := "p" + strings.ReplaceAll(payload.Message.Timestamp, ".", "")

url := fmt.Sprintf("https://%s.slack.com/archives/%s/%s", workspace, chanId, slug)

メッセージのURLにはタイムスタンプの情報が含まれている模様(今はそういう仕様なだけ?)。

なおスレッドのパーマリンクの場合、また別のタイムスタンプ Message.ThreadTimestamp がある。

やりたいことに対し情報がなかったので残しとく。