[BOUNTY] Pure Ruby Zlib::GzipWriter

H

Heesob Park

Hi,

2009/1/8 Charles L. said:
Heh. :) Somehow I think he's got it covered. That reimplementation of
zlib in ruby is actually pretty cool. I'm curious Park, as to how much
you did by hand and how much you were able to automate it...?
I dit it all by hand. There is no royal road to translating C to Ruby:)
I've put the deflate code i wrote on pastie - http://pastie.org/355367

It's about 600 lines, but needs cleaning up. Will probably be ~500 when
I've added in dynamic trees and cleaned it up a bit.

Prelim benchmarks show the current bottleneck to be the LZ77
implementation which is interesting. I think for it to perform
acceptably, a lot more of the code needs to become more idiomatic,
higher-level ruby.

In my test, the deflation is very slow but the inflation is endurable.
Moreover, for the compatibility of the various Ruby version, It shows
bad performance in Ruby 1.8.x.

Regards,

Park Heesob
 
D

Daniel Berger

Hi,

)

I dit it all by hand. There is no royal road to translating C to Ruby:)

Excellent, thanks!
In my test, the deflation is very slow but the inflation is endurable.
Moreover, for the compatibility of the various Ruby version, It shows
bad performance in Ruby 1.8.x.

As long as it's usable I'm happy. We can benchmark, profile and
optimize later. :)

regards,

Dan
 
C

Charles L.

Roger said:
Maybe you can collaborate? :)
Let us know when somebody think it's about done :)

-=r

I'm not sure there's much room for collaboration at the Zlib wrapper &
below level, but perhaps the GzipFile and upwards (ie Reader/Writer)
implementations can be shared.

The big thing is just good specs, and the existing rubyspec ones could
use some work which will benefit all of us.

I've added most of the remaining missing functionality to my version (ie
dynamic huffman tree's etc), and added back in the inflate functionality
from zliby, and put the result up on github -
http://github.com/aquasync/ruby-zlib/tree/master

I've since added enough of the GzipWriter & GzipFile functionality that
the existing specs all pass (see below. note the GzipFile specs use
GzipWriter). Unable to push this last commit to github presently, but
will try later.

It is likely complete enough for the purposes of creating rubygems, but
is still missing functionality, which needs specing out (Eg wtf is
Zlib::GzipWriter.wrap, Zlib::GzipWriter reimplements a lot of IO
functions like puts, etc).

Zlib::Deflate#set_dictionary
- sets the dictionary

Zlib::Deflate#deflate
- deflates some data

Zlib::Deflate::deflate
- deflates some data

Zlib::GzipFile#closed?
- returns the closed status

Zlib::GzipFile#close
- finishes the stream and closes the io

Zlib::GzipFile#comment
- returns the name
- raises an error on a closed stream

Zlib::GzipFile#orig_name
- returns the name
- raises an error on a closed stream

Zlib::GzipWriter#mtime=
- sets mtime using Integer
- sets mtime using Time
- raises if the header was written

GzipWriter#write
- writes some compressed data
 
D

Daniel Berger

I'm not sure there's much room for collaboration at the Zlib wrapper &
below level, but perhaps the GzipFile and upwards (ie Reader/Writer)
implementations can be shared.

The big thing is just good specs, and the existing rubyspec ones could
use some work which will benefit all of us.
Agreed.

I've added most of the remaining missing functionality to my version (ie
dynamic huffman tree's etc), and added back in the inflate functionality
from zliby, and put the result up on github -http://github.com/aquasync/r=
uby-zlib/tree/master

Thanks. Unfortunately, I cannot download it. IE7 and FF3 simply do
nothing when I click on the download link. FF2 (before I upgraded)
gave me a "file not found" error.

This actually happens to me a lot with github, on not just on Windows.
I've since added enough of the GzipWriter & GzipFile functionality that
the existing specs all pass (see below. note the GzipFile specs use
GzipWriter). Unable to push this last commit to github presently, but
will try later.

Ok, I'll look for it and just copy/paste files individually when
you're ready.

Regards,

Dan
 
D

Daniel Berger

Hi,

:) ) 7


Finally I translated the whole zlib.c to ruby code.
You can download athttp://121.78.227.9/rbzlib/pzlib.rb

Looks very promising but doesn't quite work yet:

C:\>gem install ptools
ERROR: While executing gem ... (NoMethodError)
undefined method `ZSTREAM_IS_FINISHED' for #<Zlib::GzipReader:
0x2f8e8bc>

I think you need some tests. ;)

BTW, I'm assuming this is basically a wholesale replacement of zliby?
If so, the module should be renamed from PZlib to just Zlib.
Otherwise, Rubygems will complain about the lack of a Gem::Zlib
definition.

Keep up the good work!

Regards,

Dan
 
D

Daniel Berger

I'm not sure there's much room for collaboration at the Zlib wrapper &
below level, but perhaps the GzipFile and upwards (ie Reader/Writer)
implementations can be shared.

The big thing is just good specs, and the existing rubyspec ones could
use some work which will benefit all of us.

I've added most of the remaining missing functionality to my version (ie
dynamic huffman tree's etc), and added back in the inflate functionality
from zliby, and put the result up on github -http://github.com/aquasync/r=
uby-zlib/tree/master

<snip>

Ok, I was able to download the project and I ran the specs:

C:\ruby\src\ruby-zlib>spec specs
.............FF.......................

1)
'Zlib::Deflate#params changes the deflate parameters' FAILED
expected: "x\001\000\v\000\364\377abcdefghijk\002,'\027\000#
\364\005<",
got: "x\234KLJNIMK\317\310\314\312\316\311\005\000#
\364\005<" (using =3D=3D)
C:/ruby/src/ruby-zlib/specs/deflate/params_spec.rb:16

2)
NameError in 'Zlib::Deflate#set_dictionary sets the dictionary'
uninitialized constant Zlib::Deflate
C:/ruby/src/ruby-zlib/specs/deflate/set_dictionary_spec.rb:6
C:/ruby/src/ruby-zlib/specs/deflate/set_dictionary_spec.rb:5:in `each'
C:/ruby/src/ruby-zlib/specs/deflate/set_dictionary_spec.rb:5

Finished in 1.688 seconds

38 examples, 2 failures

Ruby 1.8.6-p114 built with VC++ 8
Windows XP Pro
RSpec 1.1.11

Regards,

Dan
 
C

Charles L.

Daniel said:
Ok, I was able to download the project and I ran the specs:

C:\ruby\src\ruby-zlib>spec specs
.............FF.......................

1)
'Zlib::Deflate#params changes the deflate parameters' FAILED
expected: "x\001\000\v\000\364\377abcdefghijk\002,'\027\000#
\364\005<",
got: "x\234KLJNIMK\317\310\314\312\316\311\005\000#
\364\005<" (using ==)
C:/ruby/src/ruby-zlib/specs/deflate/params_spec.rb:16

2)
NameError in 'Zlib::Deflate#set_dictionary sets the dictionary'
uninitialized constant Zlib::Deflate
C:/ruby/src/ruby-zlib/specs/deflate/set_dictionary_spec.rb:6
C:/ruby/src/ruby-zlib/specs/deflate/set_dictionary_spec.rb:5:in `each'
C:/ruby/src/ruby-zlib/specs/deflate/set_dictionary_spec.rb:5

Finished in 1.688 seconds

38 examples, 2 failures

Ruby 1.8.6-p114 built with VC++ 8
Windows XP Pro
RSpec 1.1.11

Regards,

Dan

Yeah the github download functionality seems broken for me most of the
time also... :/

Anyway, the params failure is the only failure I get. Thats because I've
not implemented the NO_COMPRESSION mode yet, and is an easy fix. The
other error you're getting is odd, as Zlib::Deflate is defined, and if
it weren't none of the other deflate specs would have passed!
 
H

Heesob Park

Hi,

2009/1/10 Daniel Berger said:
Hi,



Looks very promising but doesn't quite work yet:

C:\>gem install ptools
ERROR: While executing gem ... (NoMethodError)
undefined method `ZSTREAM_IS_FINISHED' for #<Zlib::GzipReader:
0x2f8e8bc>

I think you need some tests. ;)

BTW, I'm assuming this is basically a wholesale replacement of zliby?
If so, the module should be renamed from PZlib to just Zlib.
Otherwise, Rubygems will complain about the lack of a Gem::Zlib
definition.

Keep up the good work!
I fixed some typo and renamed PZlib to Zlib and pzlib.rb to zlib.rb
I succeeded "gem install ptools" with zlib.rb

You can download it at http://121.78.227.9/rbzlib/zlib.rb

Regards,

Park Heesob
 
L

Luis Lavena

Yeah the github download functionality seems broken for me most of the
time also... :/

Anyway, the params failure is the only failure I get. Thats because I've
not implemented the NO_COMPRESSION mode yet, and is an easy fix. The
other error you're getting is odd, as Zlib::Deflate is defined, and if
it weren't none of the other deflate specs would have passed!

The work-in-progress of One-Click Installer:

Luis@KEORE (D:\Users\Luis\projects\oss\ruby-zlib.git)
$ spec specs
..............F........................

1)
'Zlib::Deflate#params changes the deflate parameters' FAILED
expected: "x\001\000\v\000\364\377abcdefghijk\002,'\027\000#
\364\005<",
got: "x\234KLJNIMK\317\310\314\312\316\311\005\000#
\364\005<" (using ==)
D:/Users/Luis/projects/oss/ruby-zlib.git/specs/deflate/params_spec.rb:
16

Finished in 1.219 seconds

38 examples, 1 failure

Luis@KEORE (D:\Users\Luis\projects\oss\ruby-zlib.git)
$ ruby -v
ruby 1.8.6 (2008-03-03 patchlevel 114) [i386-mingw32]

Luis@KEORE (D:\Users\Luis\projects\oss\ruby-zlib.git)
$ spec --version
rspec 1.1.11.6


Not bad, really not bad!

Anyone knows any web application for bounties? I'm interested in
contribute to this one and also one for Readline!!!

Regards,
 
D

Daniel Berger

Yeah the github download functionality seems broken for me most of the
time also... :/

Anyway, the params failure is the only failure I get. Thats because I've
not implemented the NO_COMPRESSION mode yet, and is an easy fix. The
other error you're getting is odd, as Zlib::Deflate is defined, and if
it weren't none of the other deflate specs would have passed!

Ok, I tried again. Reading seemed to work fine. For writing it worked
fine for small libs, but when I tried it against my largest project,
windows-pr, I got this:

C:\Documents and Settings\djberge\workspace\windows-pr>ruby windows-
pr.gemspec
C:/ruby/lib/ruby/site_ruby/1.8/zlib/deflate.rb:859:in `log': Result
too large - log (Errno::ERANGE)
from C:/ruby/lib/ruby/site_ruby/1.8/zlib/deflate.rb:859:in
`log2'
from C:/ruby/lib/ruby/site_ruby/1.8/zlib/deflate.rb:901:in
`chooseblock'
from C:/ruby/lib/ruby/site_ruby/1.8/zlib/deflate.rb:882:in
`times'
from C:/ruby/lib/ruby/site_ruby/1.8/zlib/deflate.rb:882:in
`chooseblock'
from C:/ruby/lib/ruby/site_ruby/1.8/zlib/deflate.rb:613:in
`outsym'
from C:/ruby/lib/ruby/site_ruby/1.8/zlib/deflate.rb:575:in
`match'
from C:/ruby/lib/ruby/site_ruby/1.8/zlib/deflate.rb:430:in
`lz77_compress'
from C:/ruby/lib/ruby/site_ruby/1.8/zlib/deflate.rb:490:in
`deflate'
... 10 levels...
from C:/ruby/lib/ruby/site_ruby/1.8/rubygems/builder.rb:68:in
`open'
from C:/ruby/lib/ruby/site_ruby/1.8/rubygems/builder.rb:68:in
`write_package'
from C:/ruby/lib/ruby/site_ruby/1.8/rubygems/builder.rb:37:in
`build'
from windows-pr.gemspec:25

It's about 60 files. If you'd like to try windows-pr yourself you can
grab it via:

cvs -d :pserver:[email protected]:/var/cvs/win32utils login

cvs -d :pserver:[email protected]:/var/cvs/win32utils checkout

Regards,

Dan
 
D

Daniel Berger

On Jan 9, 9:26=A0pm, "Charles L." <[email protected]> wrote:

Anyone knows any web application for bounties? I'm interested in
contribute to this one and also one for Readline!!!

I think that's a fantastic idea Luis!

I can live without a pure Ruby readline (though I'd certainly welcome
it). I'd rather have a pure Ruby OpenSSL. :)

Regards,

Dan
 
D

Daniel Berger

Hi,

There's a project out there called "zliby" [1] which partially
implements the zlib library. Unfortunately, only the Zlib::GzipReader
class has been implemented so far. I'd like to have a pure Ruby
implementation of the Zlib::GzipWriter class.

I've put in a feature request [2] but I'd like to see it expedited. In
order to expedite this, I'm offering $100 to anyone who can implement
it. In order to qualify for the bounty, your Zlib::GzipWriter class
must meet the following criteria:

* It must be pure Ruby. No extensions. No FFI.
* It must have tests (and pass them)
* It must match the current Zlib::GzipWriter interface
* It must be cross platform
* It must be able to generate a proper gem file from a gemspec (the
acid test)
* It must be contributed back to the zliby project
* It must be done within 60 days of this post

<snip>

And the winner is...Park Heesob! We actually had two competitors for
the bounty (much to my surprise), and it was very close (again, to my
surprise), but in the end Park's code passed an acid test that
Charles' code did not.[1]

So, congratulations to Park Heesob for not only creating a
Zlib::GzipWriter implementation, but for also creating a pure Ruby
version of the underlying zlib 1.2.3 library!

WOOHOO!

Regards,

Dan

[1] However, I hate to see Charles go unrewarded for his wonderful
efforts, so any matchers are free to distribute their bounties as they
see fit.
 
M

Michael Letterle

Daniel said:
So, congratulationns to Park Heesob for not only creating a
Zlib::GzipWriter implementation, but for also creating a pure Ruby
version of the underlying zlib 1.2.3 library!

WOOHOO!

Regards,

Dan

[1] However, I hate to see Charles go unrewarded for his wonderful
efforts, so any matchers are free to distribute their bounties as they
see fit.


This is just awesome, thanks Dan for putting up some cash to make this
happen! Compression was more difficult then decompression and I just
didn't have the time. Going to look into combining Park's code into
zliby.. though Charles stuff looks interesting too....
 
L

Luis Lavena

There's a project out there called "zliby" [1] which partially
implements the zlib library. Unfortunately, only the Zlib::GzipReader
class has been implemented so far. I'd like to have a pure Ruby
implementation of the Zlib::GzipWriter class.
I've put in a feature request [2] but I'd like to see it expedited. In
order to expedite this, I'm offering $100 to anyone who can implement
it. In order to qualify for the bounty, your Zlib::GzipWriter class
must meet the following criteria:
* It must be pure Ruby. No extensions. No FFI.
* It must have tests (and pass them)
* It must match the current Zlib::GzipWriter interface
* It must be cross platform
* It must be able to generate a proper gem file from a gemspec (the
acid test)
* It must be contributed back to the zliby project
* It must be done within 60 days of this post

<snip>

And the winner is...Park Heesob! We actually had two competitors for
the bounty (much to my surprise), and it was very close (again, to my
surprise), but in the end Park's code passed an acid test that
Charles' code did not.[1]

So, congratulations to Park Heesob for not only creating a
Zlib::GzipWriter implementation, but for also creating a pure Ruby
version of the underlying zlib 1.2.3 library!

WOOHOO!

Regards,

Dan

[1] However, I hate to see Charles go unrewarded for his wonderful
efforts, so any matchers are free to distribute their bounties as they
see fit.

I have some bucks with Park and Charles names printed on them ;-)

Park: I have your Paypal info, will send you as soon as possible.

Charles: can you tell me your paypal email?

Again: do anyone knows a good platform to to bounties for open source
projects?

Regards,
 
C

Charles L.

Luis said:
I have some bucks with Park and Charles names printed on them ;-)

Park: I have your Paypal info, will send you as soon as possible.

Charles: can you tell me your paypal email?

Again: do anyone knows a good platform to to bounties for open source
projects?

Regards,

Thanks Luis, but never mind, it was more about the challenge, and also
supporting the effort to ease problems on windows. I primarily use ruby
on windows, and make use of the fruits of your (one click installer),
and daniel berger's (win32 process, sys-*, et al) labors every day (at
work that is :). Props to you guys for making ruby on windows useable...
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,774
Messages
2,569,598
Members
45,153
Latest member
NamKaufman
Top