2019年読んで良かった本、記事

2019年に読んだ本と読んで良かった記事のリスト。自分用。 リストは、必ずしも今年に発表されたものではなく、自分が読んだタイミングが今年。 以前は年度ごとに振り返っていたが、ここ2年ほどやらなくなってしまったので再開(年末のほうが他の方に触発され…

【Rust】mapとand_thenの違い

この記事は Rust Advent Calendar 2019 の9日目の記事です。 最近、すごいHaskellを読み終わりました。 HaskellやってからRustに戻ってくるとmapとand_thenの違いがわかってよいな— さいぺ (@cipepser) 2019年10月15日 Rustに戻ってきたので、改めてmapとand…

GoでCount-min sketchを実装する

この記事は Go Advent Calendar 2019 の2日目の記事です。 こんにちは!さいぺです。 サムネのGopherくんは最近趣味で描いたものを、せっかくなので載せました。 オリジナルのThe Go gopher(Gopherくん)は、Renée Frenchによってデザインされました。 さて…

Go1.13のError wrappingを触ってみる

2019年9月3日にGo 1.13がリリースされました。 リリースノートを見ていて、Error wrappingが気になったので触ってみます。 何はともあれ、ドキュメントを見てみます。 errorsのドキュメントを確認すると、以下4つの関数が存在します。 func As(err error, ta…

Rustでprotobufのゼロ値がどうやって実現されているか

以前、以下の記事たちを書きました。 cipepser.hatenablog.com cipepser.hatenablog.com Rustで0byteを読み込むとどうなるのか(Option型になるのか)気になったので検証してみます。 0byteをrust-protobufで読み込む protobufを読み込むコードは、Golangで…

実践Rust入門を読んだ

実践Rust入門 言語仕様から開発手法まで, κeen, 河野達也, 小松礼人を読みました。本書の特徴は以下の3つでしょう。 2018 Editionに対応している FFIについて日本語で書かれた書籍 実践 を意識した内容になっている 本記事では、特に3つ目の実践的という観点…

Rustでsliceをシャッフルする

メモ書きです。 O'Reilly Japan - プログラミングRustを読んでいたら rand::Rng - Rustでsliceのシャッフルができるとあったので試したところrand::Rng::shuffleがdeprecatedになっていました。 SliceRandom::shuffleを使った例を残します。 Cargo.tomlは以…

メモリをダンプしてRustのsliceとVecを理解する

タイトルの通りなんですが、RustのsliceやVecがしっくり来ていないので、メモリ上でどのように表現されているのかという観点で理解を深めようと思います。 環境 ❯ cargo version cargo 1.32.0 ❯ rustc --version rustc 1.33.0 また今回の環境ではusizeは8バ…

BLS署名について

以下を書いたので、BLS署名についてもまとめておく。 cipepser.hatenablog.com なお、本内容はブロックチェーン系プロジェクトで着目される暗号技術 のP.22に書かれているBLS署名について自分なりに理解するためのメモである。1 BLS署名はその名の通り、署名…

BLS署名における双線形性(ペアリング)について

ブロックチェーン系プロジェクトで着目される暗号技術のP.21-22を理解するために双線形性(ペアリング)について調べた。自分が理解するに至った軌跡をメモベースで残す。 余談だが、調べる過程で双線形写像(Bilinear maps)とペアリングの違いが気になった…

Raspberry Pi 3 Model b+でビットコインフルノードを構築する

背景 フルノードの重要性とLightning NetworkやProof of Stakeがノード運営インセンティブに与える影響 - YouTube やフルノードの重要性とフルノードが広がった世界について改めて考える - ビットコインダンジョン2.0 を読んで(見て)、ビットコインフルノ…

【Raspberry Pi】マウントするファイルシステムを間違えて起動できなくなった

ラズパイを買ったので RaspberryPi 3 にUSBの外付けHDD(NTFSフォーマット)を接続する - min117の日記を参考に、外付けHDDをマウントしたところ、ntfs-3gをインストール後rebootしたらラズパイの起動ができなくなりました。 ファイルシステムに明るくないた…

haskell-ide-engineで ld: symbol(s) not found for architecture x86_64 のエラーが出る

vscode と haskell-ide-engine で Haskell 開発環境を構築する - Qiita をもとに環境構築を進めていたところ以下のエラーが出て、haskell-ide-engineをmakeすることができませんでした。 ❯ make hie-8.6.3 (中略) cabal-install-2.4.1.0: configure Complete…

Writing A Compiler In Goを読んだ

Writing A Compiler In Goを読みました。 本書は、Writing An Interpreter In Go(邦訳:Go言語でつくるインタプリタ)の続編で、前作で開発したプログラミング言語MonkeyのコンパイラとVirtual Machine(以下、VM)を実装する内容となっています。 本書を読む…

165行で実装するProtocol Buffersデコーダ(ミニマム版)

この記事は Go2 Advent Calendar 2018の11日目の記事です。 今年の後半くらいに Protocol Buffers の仕様を読み始めたら、とてもシンプルかつコンパクトな仕様なのにcompatibilityへの考慮が凄まじくて、2018年後半に書いた記事の大半がProtocol Buffersに関…

Rustでマルチインターフェースパケットキャプチャを実装する

この記事は Rust Advent Calendar 2018 の3日目の記事です。 本記事では、タイトルの通り、Rustでマルチインターフェースパケットキャプチャを実装します。 今回の記事で達成したい目標は以下2点です。 Rustでネットワークプログラミングをしたい マルチイン…

【GAS】「SpreadsheetApp.create を呼び出す権限がありません」を解決する

表題の通りです。 タイトルのエラーメッセージでググったところ、トリガーを設定し、解決されている方が多いようです。 しかし、当方の要件としては、トリガーで定期的に実行させる必要はなく、エラーメッセージは権限の問題なのでスコープを設定したかった…

clasp runがローカルで実行されない

背景 Google Apps Scriptをローカルで開発するために、 Google製のCLIツールclaspを導入しました。 Google Drive上のプロジェクトとclasp pushやclasp pullで同期できてとても便利なのですが、 以下事象でハマったので記事に残します。 事象 ローカルでコー…

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…