Rokiのチラ裏

学生による学習のログ

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