非表示の入力フィールドの値として YAML を送信する Web アプリケーション (Ruby on Rails) があります。
ここで、ブラウザーに送信されるテキストのサイズを縮小したいと考えています。最小限のデータを送信するロスレス圧縮の最も効率的な形式は何ですか? サーバー側で圧縮と解凍の追加コストが発生しても問題ありません。
非表示の入力フィールドの値として YAML を送信する Web アプリケーション (Ruby on Rails) があります。
ここで、ブラウザーに送信されるテキストのサイズを縮小したいと考えています。最小限のデータを送信するロスレス圧縮の最も効率的な形式は何ですか? サーバー側で圧縮と解凍の追加コストが発生しても問題ありません。
ruby コアで zlib 実装を使用して、データを in/de-flate することができます。
require "zlib"
data = "some long yaml string" * 100
compressed_data = Zlib::Deflate.deflate(data)
#=> "x\x9C+\xCE\xCFMU\xC8\xC9\xCFKW\xA8L\xCC\xCDQ(.)\xCA\xCCK/\x1E\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15D\x15\x04\x00\xB3G%\xA6"
圧縮データを base64 エンコードして、印刷可能にする必要があります。
require 'base64'
encoded_data = Base64.encode64 compressed_data
#=> "eJwrzs9NVcjJz0tXqEzMzVEoLinKzEsvHhUcFRwVHBUcFRwVHBUcFUQVBACz\nRyWm\n"
後で、クライアント側で、pako (javascript への zlib ポート) を使用してデータを取り戻すことができます。この回答は、おそらく JS 部分の実装に役立ちます。
これがどれほど効果的かを理解するために、サンプル文字列のサイズを次に示します。
data.size # 2100
compressed_data.size # 48
encoded_data.size # 66
クライアントで圧縮し、サーバーで膨張する場合、同じことが逆になります。
Zlib::Inflate.inflate(Base64.decode64(encoded_data))
#=> "some long yaml stringsome long yaml str ... (shortened, as the string is long :)
免責事項: