C++でProtocol Bufferを試してみた

Protocol Bufferとはシリアライズ、デシリアライズ対象のデータ構造を定義したインタフェース定義言語になります。言語に依存しないのでgRPCなどの通信でも使われていまして、Googleのオリジナルの実装にはC++, Java, Pythonなどがあります。

developers.google.com

言語に依存しないデータ構造等してJsonもありますが、Jsonに比べるとシンプルさとパフォーマンスを目的においているようですが、文字列型が多い場合はJsonの方がパフォーマンスが良かったりするので、どちらのパフォーマンスが良いかはデータ定義にも依存するようです。

medium.com

今回はGoogleのドキュメントにあるC++チュートリアルのデータ定義を用いてBoost::Asioでサーバ、クライアント間でシリアライズ、デシリアライズの確認をしてみます。

続きを読む

JavaのNettyとC++のBoost.AsioでTCP通信してみた

JavaのNettyとC++のBoost.AsioでTCP接続を試してみたときのメモになります。

Nettyとは

Netty は非同期のイベント駆動型ネットワークアプリケーションフレームワークで、FTP,SMTP,HTTPなどのレガシープロトコルから得られた経験をもとに開発の容易さ、パフォーマンス、安定性、柔軟性の実現に成功しているらしいです。

netty.io

続きを読む

Javaでサイズ付きMapを比べてみた

Javaで上限サイズ付きのMapが実装が必要でしたのでいくつか比べてみました。具体的にはLinkedHashMapとCaffeineを使ったので、その実装内容を見たうえで結果を比較していきたいと思います。

続きを読む

パーサジェネレータでパーサを出力してみる

BNFを読み込んでパーサを出力し、実際にパースしASTの出力が確認できました。 パーサを出力するものはパーサジェネレータというと思うのですが、こちらはパーサコンビネータを使っています。パーサコンビネータはパーサのパーツを組み合わせてより複雑なパーサを出力できるもので、今回はパーサコンビネータの出力がParser[Parser[BnfParseResult]]のようになっています。これはBNFを読み込んだ結果としてParser[BnfParseResult]を出力し、さらにこれに対して文字列を読み込ませることでBnfParseResultを出力するというものになっています。

パーサコンビネータのライブラリとして以下を使用しました。

github.com

続きを読む

Rustのactix-webでJWTを試してみた

今更ですがRustのactix-webでJWT(JSON Web Token)を試してみました。JWTとはJsonをBase64URLエンコードし、署名を付けることで改ざんを検知できるようなものになっていますす。JWTをクッキーにして渡すことでサーバサイドでセッションを保有しないということもできるのですが、2017年くらいにリリースされたPlayFramework2.6でこれがデフォルトになったのがインパクトがあったので印象に残っています。JWTのクッキーを使うことでサーバ間でのセッション情報の同期は必要がなくなりスケールアウトしやすくなるという特徴があるようです。

続きを読む