liblzma 0.2-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.txt +43 -0
- data/lib/liblzma.rb +131 -0
- data/lib/liblzma.so +0 -0
- data/samples/01-easy_using.rb +58 -0
- data/samples/02-streaming.rb +82 -0
- metadata +51 -0
data/README.txt
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# encoding:utf-8
|
2
|
+
|
3
|
+
= liblzma for Ruby
|
4
|
+
|
5
|
+
- AUTHOR : dearblue
|
6
|
+
- MAIL : dearblue@users.sourceforge.jp
|
7
|
+
- LICENSE : 2-clause BSD License (二条項BSDライセンス)
|
8
|
+
- PROJECTPAGE : http://sourceforge.jp/projects/rutsubo/
|
9
|
+
|
10
|
+
This document is written in Japanese.
|
11
|
+
|
12
|
+
|
13
|
+
== はじめに
|
14
|
+
|
15
|
+
xzユーティリティに含まれるliblzmaのRubyバインディングです。
|
16
|
+
|
17
|
+
gemパッケージになっており、『gem install liblzma-0.2.gem』でビルド、インストールが完了します。
|
18
|
+
|
19
|
+
MinGW32およびFreeBSD 9.0R i386で動作確認を行っています。
|
20
|
+
|
21
|
+
MinGW32向けにはバイナリパッケージも用意してあります (もしかしたらruby-mswin32でも動作するかもしれません)。
|
22
|
+
|
23
|
+
FreeBSD 9.0R i386 上では標準コンパイラであるGCCのほかにllvm clangでもビルド可能なことを確認してあります。
|
24
|
+
|
25
|
+
|
26
|
+
== 利用できる主な機能
|
27
|
+
|
28
|
+
※カッコ内は、本来のliblzmaが提供する関数を示す
|
29
|
+
|
30
|
+
* LZMA::Stream::Encoder/Decoder (lzma_stream_encoder / lzma_stream_decoder)
|
31
|
+
* LZMA::Stream::RawEncoder/RawDecoder (lzma_raw_encoder / lzma_raw_decoder)
|
32
|
+
* LZMA::Utils.crc32/crc64 (lzma_crc32 / lzma_crc64)
|
33
|
+
* LZMA::Filter::LZMA1/LZMA2/Delta
|
34
|
+
|
35
|
+
|
36
|
+
== 実際に利用するには
|
37
|
+
|
38
|
+
まともな文書化が出来ていないため、gemパッケージ内の『samples』ディレクトリに含まれる各サンプルを頼りにして下さい。
|
39
|
+
|
40
|
+
|
41
|
+
== ライセンスについて
|
42
|
+
|
43
|
+
liblzma for Ruby は、二条項BSDライセンスの下で利用できます。
|
data/lib/liblzma.rb
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
#vim: set fileencoding:utf-8
|
2
|
+
|
3
|
+
require_relative "liblzma.so"
|
4
|
+
|
5
|
+
module LZMA
|
6
|
+
module_function
|
7
|
+
def encode(data, *args)
|
8
|
+
s = Stream.encoder(Filter.lzma2(*args))
|
9
|
+
s.update(data, LZMA::FINISH)
|
10
|
+
end
|
11
|
+
|
12
|
+
module_function
|
13
|
+
def decode(data, *args)
|
14
|
+
s = Stream.auto_decoder(*args)
|
15
|
+
s.update(data, LZMA::FINISH)
|
16
|
+
end
|
17
|
+
|
18
|
+
module_function
|
19
|
+
def raw_encode(data, *args)
|
20
|
+
s = Stream.raw_encoder(*args)
|
21
|
+
s.update(data, LZMA::FINISH)
|
22
|
+
end
|
23
|
+
|
24
|
+
module_function
|
25
|
+
def raw_decode(data, *args)
|
26
|
+
s = Stream.raw_decoder(*args)
|
27
|
+
s.update(data, LZMA::FINISH)
|
28
|
+
end
|
29
|
+
|
30
|
+
class Stream
|
31
|
+
def self.encoder(*args)
|
32
|
+
Encoder.new(*args)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.decoder(*args)
|
36
|
+
Decoder.new(*args)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.auto_decoder(*args)
|
40
|
+
AutoDecoder.new(*args)
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.raw_encoder(*args)
|
44
|
+
RawEncoder.new(*args)
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.raw_decoder(*args)
|
48
|
+
RawDecoder.new(*args)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
module Utils
|
53
|
+
class CRC32 < Struct.new(:state, :init)
|
54
|
+
def initialize(state = 0)
|
55
|
+
state = state.to_i
|
56
|
+
super(state, state)
|
57
|
+
end
|
58
|
+
|
59
|
+
def update(data)
|
60
|
+
self.state = Utils.crc32(data, state)
|
61
|
+
self
|
62
|
+
end
|
63
|
+
|
64
|
+
alias << update
|
65
|
+
|
66
|
+
def finish
|
67
|
+
self
|
68
|
+
end
|
69
|
+
|
70
|
+
def reset
|
71
|
+
self.state = init
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
def digest
|
76
|
+
[state].pack("N")
|
77
|
+
end
|
78
|
+
|
79
|
+
def hexdigest
|
80
|
+
"%08x" % state
|
81
|
+
end
|
82
|
+
|
83
|
+
alias to_s hexdigest
|
84
|
+
|
85
|
+
def to_str
|
86
|
+
"CRC32 <#{hexdigest}>"
|
87
|
+
end
|
88
|
+
|
89
|
+
alias inspect to_str
|
90
|
+
end
|
91
|
+
|
92
|
+
class CRC64 < Struct.new(:state, :init)
|
93
|
+
def initialize(state = 0)
|
94
|
+
state = state.to_i
|
95
|
+
super(state, state)
|
96
|
+
end
|
97
|
+
|
98
|
+
def update(data)
|
99
|
+
self.state = Utils.crc64(data, state)
|
100
|
+
self
|
101
|
+
end
|
102
|
+
|
103
|
+
alias << update
|
104
|
+
|
105
|
+
def finish
|
106
|
+
self
|
107
|
+
end
|
108
|
+
|
109
|
+
def reset
|
110
|
+
self.state = init
|
111
|
+
self
|
112
|
+
end
|
113
|
+
|
114
|
+
def digest
|
115
|
+
[state].pack("N")
|
116
|
+
end
|
117
|
+
|
118
|
+
def hexdigest
|
119
|
+
"%016x" % state
|
120
|
+
end
|
121
|
+
|
122
|
+
alias to_s hexdigest
|
123
|
+
|
124
|
+
def to_str
|
125
|
+
"CRC64 <#{hexdigest}>"
|
126
|
+
end
|
127
|
+
|
128
|
+
alias inspect to_str
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
data/lib/liblzma.so
ADDED
Binary file
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#vim: set fileencoding:utf-8
|
3
|
+
|
4
|
+
# このrubyスクリプトはliblzmaの利用手引きを兼ねたサンプルスクリプトです。
|
5
|
+
|
6
|
+
|
7
|
+
# rubyでliblzmaの機能を利用するのに必要なのは、次の一文のみです
|
8
|
+
require "liblzma"
|
9
|
+
|
10
|
+
|
11
|
+
# 圧縮するデータを用意します
|
12
|
+
original_data = "0123456789abcdefghijklmnopqrstuvwxyz\n" * 10
|
13
|
+
|
14
|
+
|
15
|
+
# liblzmaを使って、データを圧縮します (xzデータストリームそのものが出力されます)
|
16
|
+
encoded_data = LZMA.encode(original_data)
|
17
|
+
|
18
|
+
|
19
|
+
# 圧縮レベルを変える場合は、第二引数に0から9の整数値を与えます
|
20
|
+
# この例は xz -1 と等価です
|
21
|
+
# (『9』を与える場合、作業メモリ空間が700MBほど必要になります)
|
22
|
+
encoded_data = LZMA.encode(original_data, 1)
|
23
|
+
|
24
|
+
|
25
|
+
# さらに細かい調整は、圧縮レベル(プリセット値)の後にハッシュ値を指定します
|
26
|
+
# この例ではプリセット値を省略しています
|
27
|
+
# (プリセット値の規定値はliblzma由来であり、『6』です)
|
28
|
+
encoded_data = LZMA.encode(original_data, mode: LZMA::MODE_FAST)
|
29
|
+
|
30
|
+
# この他にどんな値が与えられるかは、LZMA::Filter::LZMA2.newを参考にしてください
|
31
|
+
|
32
|
+
|
33
|
+
# 必要であればファイルに書き出しましょう
|
34
|
+
# xzデータストリームそのものです
|
35
|
+
File.write("sample.txt.xz", encoded_data, mode: "wb")
|
36
|
+
|
37
|
+
# 出力されたファイルがxzユーティリティ(もしくは7-Zip)で開けることを確認してください
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
# 圧縮されたデータを伸張してみましょう
|
42
|
+
# たったこれだけです
|
43
|
+
puts LZMA.decode(encoded_data)
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
# 今回は処理したいデータをあらかじめ用意してから、一気に処理を行う方法を提示しました
|
48
|
+
# 現実には少しずつデータを処理していく必要がある事例も少なくありません
|
49
|
+
# (巨大な――数ギガバイトにも及ぶ――ファイルなどはオンメモリでは現実的に処理できませんね)
|
50
|
+
# データを少しずつ圧縮/伸張していく、ストリーム志向での処理は 02-* にて提示します
|
51
|
+
|
52
|
+
|
53
|
+
# 今回利用したクラス/モジュール/メソッド
|
54
|
+
# LZMA.encode
|
55
|
+
# LZMA.decode
|
56
|
+
|
57
|
+
|
58
|
+
# [EOF]
|
@@ -0,0 +1,82 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#vim: set fileencoding:utf-8
|
3
|
+
|
4
|
+
# このrubyスクリプトはruby-lzmaの利用手引きを兼ねたサンプルスクリプトです。
|
5
|
+
|
6
|
+
|
7
|
+
# 01-* ではデータの全てを用意してから処理を行う方法を提示しますた。
|
8
|
+
# このサンプルではオンメモリでは難しい大きなデータを処理する方法を提示します。
|
9
|
+
|
10
|
+
|
11
|
+
# 始めはお決まりで
|
12
|
+
require "liblzma"
|
13
|
+
|
14
|
+
# 今回のサンプルでファイルI/Oを再現するためにStringIOを利用します
|
15
|
+
require "stringio"
|
16
|
+
|
17
|
+
# 圧縮元となるデータを用意します
|
18
|
+
original_data = "abcdefghijklmnopqrstuvwxyz" * 50
|
19
|
+
|
20
|
+
|
21
|
+
# まずは圧縮してみましょう
|
22
|
+
source = StringIO.new(original_data)
|
23
|
+
dest = ""
|
24
|
+
encoder = LZMA::Stream.encoder(LZMA::Filter.lzma2) # (1)
|
25
|
+
while fragment = source.read(16) # (2)
|
26
|
+
dest << encoder.update(fragment) # -
|
27
|
+
end # -
|
28
|
+
dest << encoder.finish # (3)
|
29
|
+
|
30
|
+
# (1) はじめに圧縮器を構築します
|
31
|
+
# LZMA::Stream.encoderの引数は、1つ以上をとることが出来ます (上限はliblzma由来となる4つです)
|
32
|
+
# LZMA::Filter.lzma2の引数は、LZMA.encodeの二つ目以降の引数と同じです
|
33
|
+
# (LZMA::Filter.lzma2(1) とか LZMA::Filter.lzma2(mode: LZMA::MODE_FAST) とか)
|
34
|
+
# (2) 取り込んだ部分データを処理します
|
35
|
+
# (3) データの終わりを通知し、圧縮器内に残ったデータを取り出します
|
36
|
+
# これを忘れるとxzデータストリームとして間違ったものが生成されます
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
encoded_data = dest
|
41
|
+
|
42
|
+
|
43
|
+
# 伸張も圧縮とほとんど同じです
|
44
|
+
source = StringIO.new(encoded_data)
|
45
|
+
dest = ""
|
46
|
+
decoder = LZMA::Stream.decoder # (1)
|
47
|
+
while fragment = source.read(16) # (2)
|
48
|
+
dest << decoder.update(fragment) # -
|
49
|
+
end # -
|
50
|
+
dest << decoder.finish # (3)
|
51
|
+
|
52
|
+
puts(dest == original_data ? "data ok" : "bad data")
|
53
|
+
|
54
|
+
# 圧縮時と伸張時の違いがわかりますか?
|
55
|
+
# はじめ(1)の伸張器の構築部分 (encoderかdecoderか) を変更するだけで、後は同じような文で処理を行えます
|
56
|
+
|
57
|
+
|
58
|
+
# 上の例ではxzデータストリームのみの対応です
|
59
|
+
# lzmaデータストリームは対象となりません
|
60
|
+
# xzもlzmaも区別なく伸張したい場合は、decoder ではなく auto_decoder を使います
|
61
|
+
source = StringIO.new(encoded_data)
|
62
|
+
dest = ""
|
63
|
+
decoder = LZMA::Stream.auto_decoder # (1)
|
64
|
+
while fragment = source.read(16) # (2)
|
65
|
+
dest << decoder.update(fragment) # -
|
66
|
+
end # -
|
67
|
+
dest << decoder.finish # (3)
|
68
|
+
|
69
|
+
puts(dest == original_data ? "data ok" : "bad data")
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
# 今回利用したクラス/モジュール/メソッド
|
74
|
+
# LZMA::Stream.encoder LZMA::Stream::Encoder.new と等価
|
75
|
+
# LZMA::Stream.decoder LZMA::Stream::Decoder.new と等価
|
76
|
+
# LZMA::Stream.auto_decoder LZMA::Stream::AutoDecoder.new と等価
|
77
|
+
# LZMA::Filter.lzma2 LZMA::Filter::LZMA2.new と等価
|
78
|
+
# LZMA::Stream#update
|
79
|
+
# LZMA::Stream#finish
|
80
|
+
|
81
|
+
|
82
|
+
# [EOF]
|
metadata
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: liblzma
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.2'
|
5
|
+
prerelease:
|
6
|
+
platform: mingw32
|
7
|
+
authors:
|
8
|
+
- dearblue
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-03-31 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description:
|
15
|
+
email: dearblue@users.sourceforge.jp
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- README.txt
|
21
|
+
- lib/liblzma.rb
|
22
|
+
- lib/liblzma.so
|
23
|
+
- samples/01-easy_using.rb
|
24
|
+
- samples/02-streaming.rb
|
25
|
+
homepage:
|
26
|
+
licenses:
|
27
|
+
- 2-clause BSD License
|
28
|
+
post_install_message:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.9.3
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubyforge_project:
|
46
|
+
rubygems_version: 1.8.16
|
47
|
+
signing_key:
|
48
|
+
specification_version: 3
|
49
|
+
summary: ruby bindings for liblzma that is included in the xz utilities
|
50
|
+
test_files: []
|
51
|
+
has_rdoc: false
|