ちりもつもればミルキーウェイ

好奇心に可処分時間が奪われる

エンコーディング

gRPCのメッセージをJSONシリアライズしたい

はじめに 最近こういう記事を書きました convto.hatenablog.com 記事の内容としては、メッセージエンコーディングにはいろいろと種類があり、それぞれ特性があるのでいい感じに使い分けようねみたいな感じでした。 こんな記事を書くくらいなので最近メッセー…

json/protobuf(wire)/gobをバイナリ効率とかの観点から比べてみる

はじめに どうも @convto です。 以前に protobufのwire encodingについて遊んた ことや gobについていろいろ仕様を調べて遊んだ こととかがあったので、いっちょいい感じの比較ができるんではということでやっていきたいと思います。 ついでにgobについては…

gobエンコーディング頑張って調べる回

はじめに 以前gobについてどういうところが嬉しいんだっけ?みたいなのをまとめました https://convto.hatenablog.com/entry/2022/05/22/104428 メリットもわかったところであとはバイナリとダンスするだけなので、いくつかに分けてgobと戯れてそのうちしっ…

gobのモチベとか、現代的な観点からのメリットとか

はじめに gobのことを最近いろいろ調べてるんですが、そもそもなんでわざわざ言語側でメッセージ用のバイナリエンコーディング持ってるんだっけ?というのが気になったので、自分むけの整理用に使い方眺めつつこういうメリットありそうかなーとかそういうの…

バイナリのbit表現を得られるencodingパッケージ作った

動機 連休中はバイナリとダンスして遊んでたんですが、Goプログラムから柔軟にバイナリをbit表現で出力できないのがちょっと不便でした。 たとえば標準の機能で for i := 0; i < len(src); i++ { fmt.Printf("%08b", src[i]) } のようにすれば、1byteごとにp…

wireのunmarshallerがひと落ち着きした

wireのunmarshallerがだいたいできて一通り落ち着いたので投下 github.com READMEもサポートしてる型くらいは書いておいた。useageで動くplaygroundのリンクはってあるのが丁寧さ+1といったかんじ どのくらい実装したの 下位互換まわりは全く実装してないけ…

自作のprotobuf unmarshalerで固定長64bit/32bitフィールドをパースできるようにした

はじめに 前に簡易的なunmarshalerかいたので それに機能追加した話 この時点では、対応するtypeはVarintとLength-delimitedだけだったので、固定長64bit/32bitフィールドをパースできるようにしました。 差分は以下 https://github.com/convto/protowire/co…

152行でprotobufの簡易的なunmarshalerかいた

はじめに protobufのエンコーディングはwireという名前で以下に仕様がある developers.google.com 最近仕様を読んだりproto定義から生成される成果物を読んだりいろいろしていて、Unmarshalerかける気がしたので書いてみた。 すべての仕様に準拠するものは大…

zigzag encodingとは

はじめに 符号付き整数は2の補数表現で表されることが多いが、エンコーディングによっては zigzag encoding なるものを使っている場合もある。 2の補数表現と比較した上で、zigzag encodingとはどういうバイト表現でどのような特徴があるかまとめる zigzag e…

protoc-gen-gogoの成果物がかなり読みやすい件

3行まとめ protoc-gen-gogoの成果物みてみたら、 ベタッとbytesをunmarshalするコードが書いてあって、 仕様と一緒に見たらかなり読みやすかった きっかけ ectdのraftコードを読んでたらたまたまprotoc-gen-gogoで生成されたコードを発見。 github.com ちょ…

protobuf のエンコーディング仕様ざっとよんだ感想

developers.google.com 以下感想 protobufのエンコーディングはwireっていうバイナリエンコーディングでやってる wireはJSONなどど比較してフィールド名を省略してフィールド番号にすることでバイトの削減と互換のとりやすさを実現していて面白い フィールド…