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.
@@ -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ライセンスの下で利用できます。
@@ -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
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