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

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

Go

Go 1.22 の実装を見て学ぶ PCG-DXSM による疑似乱数の生成

PCG(permuted congruential generator)とは PCG自体の元ネタは PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation にあります。(この論文は疑似乱数の統計的性質の比較とかいろいろやってるデカい…

Go で word size が 32bit or 64bit どっちか知りた〜い

今回は小ネタ。みんな知りたいときあると思うからメモ どうやるの https://cs.opensource.google/go/go/+/refs/tags/go1.22.0:src/math/const.go;l=40 intSize = 32 << (^uint(0) >> 63) // 32 or 64 どゆこと ^uint(0) >> 63 は全bitたったuintを右に63シフ…

つくって理解するストリーム暗号 ChaCha20

はじめに Go 1.22 で math/rand に ChaCha8 実装が入ったらしい しかも math/rand/v2 トップレベルで利用されてる、かつシードがない math/rand でも使われるようになったらしい。一応議論を追った感じだと、暗号学的強度がある乱数をもとめてるのに math/ra…

Go1.20からerrの構造がtreeになるので複数マッチ可能なハンドリングutilを作った

はじめに みなさん Go1.20リリースノート(現在進行中) は読みましたでしょうか? crypto関係のパッケージがmath/big.Intと距離を置きだしたりいろいろ面白そうな話題はあるんですが、なんといっても Wrapping multiple errors が一番気になりました! 関連pr…

grpc-goでモジュラモノリスの境界としてのgRPC利用を考えてみる

はじめに 最近機会があってモジュラモノリスについてあれこれぼんやり考えています。 その性質とかをかるく整理しつつ、モジュール境界としてgRPCをつかってみるアプローチについてあれこれ考えてみます。grpc-goについてのみ考えていて他の言語でどうなるか…

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

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

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

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

Goの最近のおもしろCVEとその対応を眺める

はじめに どうもみなさんお世話になってます @convto です。 最近ちらちら直近のGoのCVEとかみてるので、危険度は度外視してパっとみて面白かったCVEとそのパッチの感想みたいなのをまとめつつバージョンアップを啓蒙していきます。 みんなバージョンアップ…

gofrs/uuidに出してたパッチがマージされたよ(そしてあとから気づいた細かいパッチをまた出したよ)

Go

はじめに だいぶ前パッチ出した記事書きました。 https://convto.hatenablog.com/entry/2022/06/08/011812 具体的な話はそちらに譲るとして、マージされたんでその話と、関連する修正も出したのでその話をしようと思います。 やりたいこともまだあるにはある…

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

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

Go1.19のcrypto/randではunix環境のReadで内部バッファがなくなるので色々しらべた

Go

はじめに 先日なんとなしに go.1.19 release note よんでたら、crypto/randの項目で興味深い一文を見つけた Read no longer buffers random data obtained from the operating system between calls. 当時の僕も気になっていたよう ざっと見たけど crypto/ra…

Genericsをつかってcomparableなpointerの値が等価かどうか判定したいよ〜

Go

はじめに 今回は軽めな回です。 そもそもpointerはcomparebleであり、面倒なことをせずとも == にて比較可能です。 https://go.dev/ref/spec#Comparison_operators Pointer values are comparable. Two pointer values are equal if they point to the same …

gofrs/uuid にパッチをだした

はじめに どうも皆さんconvtoです。 最近UUIDとかをドカっと調べて色々比較するみたいな記事を書きました。 convto.hatenablog.com で、このとき実はつかってるOSSへのcontributionチャンスを発見していて、今回はそのパッチを上げたぞ(マージされるかはわか…

CVE-2021-3538 をちゃんと読む

はじめに CVE-2021-3538 は https://github.com/satori/go.uuid についての脆弱性で、uuidが攻撃者にとって予測可能になる場合があるでというやつです trackerへの登録はこれ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-3538 仕事で使ってた…

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

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

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

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

go build せずにバイナリをつくって linkname を理解する

Go

概要 なんかいろいろgo tool調べてたら go tool compile と go tool link つかって手動ビルドできそうだったのでやってみるというやつ。 go tool compile するとobject fileなり(オプション指定すれば)archiveつくれたりする。 go tool link すると↑の成果物…

Goのbuiltin/unsafe関数の実装追いかけ方メモ

Go

はじめに Goのbuiltin関数やunsafeパッケージの直接の実装はそれぞれのパッケージには関数とドキュメントしか配置されてません https://pkg.go.dev/unsafe https://pkg.go.dev/builtin これらはアセンブリで実装されているわけでもないです。 じゃあどこでこ…

多倍長整数の四則演算

はじめに これは RSA完全理解 Advent Calendar の15日目の記事です。 RSAについてはひとしきり説明が終わったので、スクラッチで書くために巨大な数の四則演算について説明しようと思います。 四則演算さえできれば!いままでやったユークリッド互除法で逆元…

Goのruntimeコードリーディングで役立つかもしれない個人的tipsまとめ

Go

はじめに これは Kyash Advent Calendar 2021 の1日目の記事です。 Kyashで入出金関連をメインで担当しているチームで働いている convto です。 最近趣味でGoのruntime周りのソースコードを読み始めているんですが、Goのruntime(や一部の標準パッケージ、そ…

Goでブロック暗号のECB暗号モード書いた

はじめに 暗号周りがなんとなく気になって、一番簡単そうな暗号利用モードのECB実装するかーという気持ちになったのでやった 色々調べたら ちょうどGoには実装されてないっぽく 、かつ単にブロックを順番に暗号化するだけでクソ単純でとっつきやすそうなので…

Goのreflectでこんなときどうする?集

Go

はじめに reflectでゴニョゴニョしたいときに毎回沼にハマってすごく時間をつかうので、使うパターンをメモっておく。 随時更新(したい)です それではレッツゴー 任意の値があるプリミティブ型か確認したい if reflect.ValueOf(v).Kind() == reflect.Int64 {…

自作の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かける気がしたので書いてみた。 すべての仕様に準拠するものは大…

算術シフトと論理シフト

はじめに エンコーディング周りを調べていたら、Goの場合は左辺のオペラントがintかuintかで処理が違うことがわかった。 ドキュメントにも明記されていて、算術シフトと論理シフトというやつを使い分けているらしい。 シフト演算を多用する処理は書いたこと…

Goのnet/httpでtimeout指定したときにどう制御されるのか追ってみた

Go

はじめに net/httpを使ったhttpリクエストでは2つの方法でtimeout管理ができます。 Client.Timeout 値の設定( コメントを読む感じrequestにcontextを入れてもOKだぞいというのは言及されてる Request.WithContext なり NewRequestWithContext なりでcontext…