protobufのNon-varintの互換性について

以前、Varintを64bitから32bitに変更したときの挙動を検証しました。 cipepser.hatenablog.com 上記記事の通りVarintは、下位32-bitを残して切り詰める結果でした。 今回は、Non-varintの互換性を検証します。 例によって、Language Guideを見てみると fixed…

protobufで0 byteをデコードする

Language Guideに以下のようにフィールドに値がセットされていない場合はdefault valueが使われることが書かれています。 When a message is parsed, if the encoded message does not contain a particular singular element, the corresponding field in t…

Golangで出力したprotobufバイナリをRustで読み込む

ここ三回くらいprotobufの記事を書いてきましたが、Goばかりだったので、Rustで読み込んでみました。 事前準備:Goでバイナリを出力する user.protoを以下のように定義します。 syntax = "proto3"; package user; message User { string name = 1; int32 age…

protobufのVarintを64bitから32bitに変更したときの挙動

protobufのVarintはProtocol Buffers - Encodingで定義されるように、32-bit(int32, uint32, sint32)や64-bit(int64, uint64, sint64)のどちらも含まれています。 Varintのエンコーディングは、その値によってbyte長が変わりますが(負数は-1のような小さい…

protobufのenumの互換性について

前回記事の続きです。 前回は、boolだったフィールドをint32に変換した場合に互換性が保たれるのかを見ました。 実用上はint32にするより、enumにすることが多いと思うので、今回はenumでの互換性をみていきます。 enumについては、Language GuideのEnumerat…

protobufのboolはどこまでcompatibleなのか

Protocol Buffers(以下、protobuf)におけるboolのcompatibilityは、Language Guideで以下のように述べられています。 int32, uint32, int64, uint64, and bool are all compatible これを読むと、もともとboolだったMessage Typeをint32にアップデートできる…

gRPCでリクエストパラメータのValidation

goのgRPCで便利ツールを使うで紹介されているGo gRPC MiddlewareとGolang ProtoBuf Validator CompilerでgRPCのvalidationをします。 今回の例では、Userの年齢は負数にならない、電話番号やメールアドレスを正規表現でvalidationするといったことを実装しま…

vgoを試してみる

Go1.11から導入されるvgoを試してみたメモ書きです。 基本的な流れは、和訳: A Tour of Versioned Go (vgo) (Go & Versioning, Part2)に沿っています。versioningが必要な理由や議論などは本記事では扱いません。 上記記事からvgoの開発が進みコマンドがいく…

RustでTOMLを読み込む

toml-rsで、以下のPerson.tomlを読み込みます。 # Person.toml [profile] name = "Alice" age = 20 準備 toml-rsに加えて、 DeserializeにSerdeを使うので、Cargo.tomlに以下を追記します。 # Cargo.toml [dependencies] serde = "1.0" serde_derive = "1.0"…

ルーター自作本を試す環境をnetnsの仮想ネットワークで実現する

ルーター自作でわかるパケットの流れ/小俣 光之を読みました。 本文にほとんどがソースコードのためひたすら写経しました。 ちなみに後半に差し掛かったあたりで気づいたのですが、サポートページでソースコードは公開されています。 「せっかく書いたのだか…

【Golang】DFS(深さ優先探索)による有向グラフのcycle detectを実装する

【Golang】DFS(深さ優先探索)による無向グラフのcycle detectを実装する - 逆さまにしたの続きで、今度は有向グラフのcycle detectです。 Detect Cycle in Directed Graph Algorithmを視聴したので、実装してみることにします。 有向グラフにおけるDFSによる…

sliceとmapのdelete(+make)はどちらが速いのか

Golangでmapとsliceどちらが速いのかに引き続いて、要素を削除する場合のベンチマークを取ってみる。 やり方 slice メモリリークしないようにSliceTricksにある以下の方法で要素を削除する。 copy(a[i:], a[i+1:]) a[len(a)-1] = nil // or the zero value o…

【nsdi'18論文】Stateless Datacenter Load-balancing with Beamerを読んだ

2018年4月9日〜11日に開催されていたnsdi'18で Community Awardに選ばれたStateless Datacenter Load-balancing with Beamerの論文を読んだのでメモ書きを残します。 こちらで発表も見れます。 自分の理解の範囲で記載しているので、詳細や正確性を求める方…

【Golang】DFS(深さ優先探索)による無向グラフのcycle detectを実装する

前回のDisjoint-set algorithmに引き続き、Cycle in Undirected Graph Graph AlgorithmのDFSによるcycle detect実装してみます。 前回は、自作のgraphパッケージを使いましたが、グラフの持ち方(データ構造)も検討しながらまとめたいと思います。 DFSによるc…

Golangのmapとsliceはどちらが速いのか

GoのパフォーマンスTipsメモにインデックスアクセスについて、以下のように述べられている。 mapのインデックスアクセスはsliceの数十倍遅い。 100件以下の場合バイナリサーチでsliceから目的の値を探すほうが早い。 100要素超えくらいからmapのアクセス速度…

ビットコインとブロックチェーン:暗号通貨を支える技術を読んだ

Mastering Bitcoinの邦訳であるビットコインとブロックチェーン:暗号通貨を支える技術/アンドレアス・M・アントノプロス (著), 今井 崇也 (翻訳), 鳩貝 淳一郎 (翻訳)を読みました。 Blockchainのバイブルと名高い本書ですが、その評判に違わない内容でした…

Golangで言語処理100本ノック2015 目次

言語処理100本ノック 2015を完走したので、目次として各記事へのリンクをまとめました。 Golangで言語処理100本ノック2015 第1章: 準備運動 Golangで言語処理100本ノック2015 第2章: UNIXコマンドの基礎 Golangで言語処理100本ノック2015 第3章: 正規表現 Go…

Golangで言語処理100本ノック2015 第10章: ベクトル空間法 (II)

言語処理100本ノック 2015の第10章: ベクトル空間法 (II)の10問です。 第10章では,前章に引き続き単語ベクトルの学習に取り組む. 90. word2vecによる学習 81で作成したコーパスに対してword2vecを適用し,単語ベクトルを学習せよ.さらに,学習した単語ベ…

【Golang】Ward法で階層的クラスタリングするパッケージを書いた

背景 言語処理100本ノックのQ98を解くにあたって、Go実装がなかったので実装し、goClusteringというパッケージにしました。k-meansもQ97で実装したので、将来的には他のクラスタリングアルゴリズムも統合するかもしれません。 概要 内部的には、階層構造を二…

Golangで言語処理100本ノック2015 第9章: ベクトル空間法 (I)

言語処理100本ノック 2015の第9章: ベクトル空間法 (I)の10問です。 enwiki-20150112-400-r10-105752.txt.bz2は,2015年1月12日時点の英語のWikipedia記事のうち,約400語以上で構成される記事の中から,ランダムに1/10サンプリングした105,752記事のテキス…

GolangでIBLTを実装してみた

前回の記事では、IBLTの概要について記載しました。 今回はIBLTのデータ構造と実装について記載します。 なお、使った図などはこちらにスライドとしてまとめています。 データ構造 IBLTは以下のようにm個のcellを持ちます。 各cellには、count、keySum、valu…

Bitcoin Cashのブロック伝搬速度を10倍にするGrapheneで使われているInvertible Bloom Lookup Tables(IBLT)について調べてみた

Bitcoin Cashのブロック伝搬速度を10倍にするという話もあるGrapheneでも使われている Invertible Bloom Lookup Tables(以下、IBLT)について調べました。 背景 IBLTはもともと集合一致などで使われるデータ構造です。ブロックチェーンに限った技術ではありま…

Atom gotestsでレシーバがあったときにテストが自動生成されないバグを直した話

Atom gotestsでレシーバがあったときにテストが生成されないバグを直した話 少し前に以下のツイートをし、Atom pluginのgotestsを使って ユニットテストの自動生成をしてました。 goのテスト自動生成ツール。めっちゃ便利。すごい。https://t.co/15Fd5sq2VI—…

【Golang】gobで変数をファイルに保存する

gobは、Go専用のバイナリシリアライズフォーマットです。 シリアライズフォーマットとしては、Protocol Buffers1がデファクトでしょうし、Go専用のgobは他の言語で扱えず、使い勝手としても難しいところです。 しかし、Goしか使っていないような環境で、変数…

Visual Studio Codeをインストールするときにやったこと

AtomからVScodeに移行したメモです。 自分しか使ってないようなkey-bindとかもありますが、 同じように設定に困ったら参考にしてください。 カラーテーマ Atom One Dark Theme 表示関連 goのソースコードのみタブを半角スペース2つへ "[go]": { "editor.inse…

ブロックチェーンアプリケーション開発の教科書を読んでハマったところメモ

ブロックチェーンアプリケーション開発の教科書 / 加嵜長門(著), 篠原航(著), 丸山弘詩(編集)を読みました。 仮想通貨の基礎知識、事例:1-5章 Ethereumのスマートコントラクト実装:6-8章 今現在議論となっているトピック、これからブロックチェーンがどう…

【Golang】Disjoint-set algorithmによる無向グラフのcycle detectを実装する

Cycle in Undirected Graph Graph Algorithmを視聴したので、Disjoint set algorithmによるcycle detect実装してみます。 Disjoint set algorithmでは、以下3つの操作を使うことでcycle detectを行います。 MakeSet 各nodeだけの集合を作る(初期化) Union 2…

【Golang】reflect.DeepEqualでsliceとmapを組み合わせて比較する

先日、集合や族を扱うパッケージを書いていたところ、mapやsliceが混じった構造でどのようにEqualを実装するかで少しハマりました。reflect.DeepEqualの実装を見て解決したので備忘として整理します。 ちょうどGoで違うmapであることをテストする でも、同じ…

Golangでgraphパッケージを書いた

グラフ理論のアルゴリズムで遊ぶための前準備として、graphパッケージを自作してみました。 基本的な操作として、以下ができます。 無向グラフ/有向グラフの生成 頂点(Vertex)の追加/削除 辺(Edge)の追加/削除 How to Install $ go get github.com/cipepser/…

【Golang】LINE Notifyで画像を送る

先日の記事では、LINE Notifyでメッセージを送りました。 今回は画像を送ってみます。 少し検索してみても、メッセージを送る記事ばかりで画像を送るのはあまりないですね。 LINE公式のSDKでもimageFileで検索しても、実装されていないようなので、自分で実…