zlib ラッパー
少し以前に実装したものの話題となるが、zlib のラッパーを自作ライブラリの方に実装したものの、ブログに特に書いていなかったのでそのメモ。次のように利用できる。
テストは次のように、フリードキュメントである赤毛のアンのテキストを圧縮/解凍をし、それぞれ gzip との実行結果で差異がないかをチェックすることで行なっている。
1 種類のフリードキュメントに対する圧縮, 解凍ではテストが不十分であるように感じたのと, 単一のサーバーに対して負荷がかかってしまうことを避けるために, 候補からランダムでフリードキュメントを選択し, それを利用してテストするようにした.
最後にこれはお遊びであるが、当然 git の blob オブジェクトも同ラッパーで解凍できる(意味はない)。次は普通にgit cat-file
によって blob オブジェクトを解凍/閲覧している例。
$ git clone https://github.com/falgon/git_playground.git $ cd git_playground $ git cat-file -p HEAD | grep tree | sed -e s/tree// | xargs git cat-file -p | cut -d ' ' -f 3 | cut -f1 | xargs git cat-file -p | cut -d ' ' -f 3 | cut -f1 | xargs git cat-file -p hello
似た機能を同ラッパーで次のように実装できる。blob オブジェクトは、コード内のコメントにある通りある一定のフォーマットのヘッダが先頭にあるので、それをスキップする。
次のように実行できる。
$ g++-7 -std=c++1z -Wall -Wextra -pedantic -lz blob_decompress.cpp -o blob_decompress $ git clone https://github.com/falgon/git_playground.git $ cd git_playground $ ../blob_decompress .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a hello