エムオーテックス株式会社が運営するテックブログです。

OSSを使うときは思い込みに気をつけよう

こんにちは、アプリケーションチームの東(あずま)です。

OSS(オープンソースソフトウェア)を用いた開発で、自分の思い込みによりファイル圧縮の実装が出来ていなかった失敗事例について、しくじり先生の様な形で共有できればと思います。

どのようなミスをしたのか

ある業務で、複数のファイルをzip形式で1つのファイルに圧縮する必要があったため、SwiftベースのZipFoundation[1]を用いてプログラムを作成しました。

作成したプログラムをテストしたところ、単にファイルを一つに纏めたアーカイブファイルとなってしまうことに気が付きました。

zip形式とは何か

自分が犯したミスを具体的に説明する前に、前提知識として知っていただきたい事があります。

普段から多用しているzip形式とは何でしょうか。当たり前のように使っているため、あまり意識した事がないかもしれません。

zip形式とは、可逆データ圧縮アルゴリズムDeflate(デフレート)[2]などの様々な圧縮アルゴリズムを用いてファイルを一つにまとめることが出来るアーカイブファイルの一種です。

圧縮アルゴリズムとして何が使用できるのかは、Compression method[3]で下図の通りに定義されています。

(必要な箇所だけ切り取っています。)

No. Contents
0 The file is stored (no compression)
.. ....
7 Reserved for Tokenizing compression algorithm
8 The file is Deflated
9 Enhanced Deflating using Deflate64(tm)
.. ....

因みに、Compression method 1番 ~ 6番は非推奨です。

4.4.5.1 Methods 1-6 are legacy algorithms and are no longer recommended for use when compressing files.[3]

zip形式が圧縮してないとはどういうことか

この記事の冒頭で、生成されたzip形式ファイルが圧縮されておらず、単にファイルを一つに纏めたアーカイブファイルになることをふれました。

それはどのような時に起こるのか、既にお気づきの方がいらっしゃるかもしれませんが、先ほど紹介したCompression methodの0番(no Compression)が採用された状態のときに発生します。

普段使用するGUI操作では、必ず圧縮処理が入るので、圧縮後のzip形式ファイルが圧縮前のファイルサイズと変わらないといった現象は基本的には発生しません。

今回起こってしまったのは、圧縮アルゴリズムを指定しなくてもデフォルトで圧縮されるだろうと思い込んだまま開発してしまっていた事が原因です。

幸いにもこのミスによる影響は少なく、改修も簡単なものでしたが、皆さんも開発する際は思い込みに気をつけていただければと思います。

Swiftでの実装

次に実装の方で見ていきます。

画像にあるプログラムでは、50KBのtext.txtを圧縮し、text.txtと同じディレクトリにtmp/test.zipとして保存するコードを書いています。

ここでは、実行後に生成されるzip形式ファイルのファイルサイズに注目してください。

圧縮アルゴリズムdeflateを指定した場合

Compression methodにDeflateが指定されている時


text.txtを正しく圧縮出来たzip形式ファイルになっている

圧縮アルゴリズムdeflateを指定した場合は、画像の通り、50KBから244Bに正しく圧縮されていることが確認できます。

圧縮アルゴリズムを指定していない場合

Compression methodが指定されていない時


text.txtが圧縮されていない

圧縮アルゴリズムを指定していない場合、text.txtのファイルサイズと全く同じファイルサイズのtmp/test.zipが生成され、50KBのtext.txtから変わらず非圧縮である事が確認できます。

ライブラリの仕様

デフォルトでは非圧縮[1]

ライブラリのコード内に記載されている仕様には、CompressionMethodの初期値はdeflateでは無く、no compression(非圧縮)であることが記載されています。

まとめ

開発する際は、使用するライブラリに対して「こうしてくれるだろう」という思い込みは非常に危険な考え方であることを学びました。

また、今回の調査で、開発に使用していたライブラリのライセンスはMIT License[4]となっていることに気付きました。

ソフトウェアは「現状のまま」で、明示であるか暗黙であるかを問わず、何らの保証もなく提供されます。

ここでいう保証とは、商品性、特定の目的への適合性、および権利非侵害についての保証も含みますが、それに限定されるものではありません。

作者または著作権者は、契約行為、不法行為、またはそれ以外であろうと、ソフトウェアに起因または関連し、あるいはソフトウェアの使用またはその他の扱いによって生じる一切の請求、損害、その他の義務について何らの責任も負わないものとします。

MIT Licence 日本語訳文[4]

MIT Licenseライセンスを調べると、上記の日本語訳文の通り、ソフトウェアの保証や責任を一切取らないため、このライセンスが付いているソフトウェア起因による不具合があったとしても、使用者側で対応する必要があります。

その為、ライブラリの動作が正しいことを確認するためにも、RFCドキュメントやZip仕様書[2]などの公式な文書を必ず読むことを心がける必要があると感じました。

参考資料