[#144186] Re: array of object insert polices — "Pe, Botp" <botp@...>

dave [mailto:dave.m@email.it] wrote:

14 messages 2005/06/01

[#144206] Implementing a Read-Only array — Gavin Kistner <gavin@...>

Right up front, let me say that I realize that I can't prevent

14 messages 2005/06/01

[#144224] Method Chaining Issues — "aartist" <aartist@...>

try this:

28 messages 2005/06/01
[#144231] Re: Method Chaining Issues — "Phrogz" <gavin@...> 2005/06/01

This is a FAQ, though no page on the RubyGarden wiki seems to address

[#144240] Re: Method Chaining Issues — Nikolai Weibull <mailing-lists.ruby-talk@...> 2005/06/01

Phrogz wrote:

[#144230] ternary operator confusion — Belorion <belorion@...>

I don't know if this is "improper" use of the ternary operator, but I

19 messages 2005/06/01
[#144233] Re: ternary operator confusion — "Phrogz" <gavin@...> 2005/06/01

true ? a.push(1) : a.push(2)

[#144257] Re: ternary operator confusion — "Marcel Molina Jr." <marcel@...> 2005/06/01

On Thu, Jun 02, 2005 at 01:40:23AM +0900, Phrogz wrote:

[#144263] Re: ternary operator confusion — Eric Mahurin <eric_mahurin@...> 2005/06/01

--- "Marcel Molina Jr." <marcel@vernix.org> wrote:

[#144453] RubyScript2Exe and GUI toolkits — Erik Veenstra <pan@...>

13 messages 2005/06/03

[#144487] Building a business case for Ruby — Joe Van Dyk <joevandyk@...>

Hi,

29 messages 2005/06/03

[#144535] ruby-dev summary 26128-26222 — Minero Aoki <aamine@...>

Hi all,

11 messages 2005/06/04

[#144579] Package, a future replacement for setup.rb and mkmf.rb — Christian Neukirchen <chneukirchen@...>

29 messages 2005/06/04

[#144672] newbie read.scan (?) question — "Bruce D'Arcus" <bdarcus.lists@...>

Hi,

16 messages 2005/06/06

[#144691] making a duck — Eric Mahurin <eric_mahurin@...>

Regarding duck-typing... Is there an easy way make a "duck"?

27 messages 2005/06/06

[#144867] ruby-wish@ruby-lang.org mailing list — dave <dave.m@...>

19 messages 2005/06/08
[#144870] Re: [PROPOSAL] ruby-wish@ruby-lang.org mailing list — "Robert Klemme" <bob.news@...> 2005/06/08

Austin Ziegler wrote:

[#144890] RubyStuff: The Ruby Shop for Ruby Programmers — James Britt <james_b@...>

Announcing the formal grand opening of Ruby Stuff: The Ruby Shop for

36 messages 2005/06/08

[#144966] python/ruby benchmark. — "\"</script>" <groleo@...>

I took a look at

78 messages 2005/06/09
[#144967] Re: python/ruby benchmark. — gabriele renzi <surrender_it@...> 2005/06/09

"</script> ha scritto:

[#144974] Re: python/ruby benchmark. — Lothar Scholz <mailinglists@...> 2005/06/09

Hello gabriele,

[#144977] Re: python/ruby benchmark. — Kent Sibilev <ksruby@...> 2005/06/09

Java is an order of magnitude faster than Ruby. The development of a

[#144980] Re: python/ruby benchmark. — Lothar Scholz <mailinglists@...> 2005/06/09

Hello Kent,

[#144983] Re: python/ruby benchmark. — "Ryan Leavengood" <mrcode@...> 2005/06/09

Lothar Scholz said:

[#145196] Re: python/ruby benchmark(don't shoot the messenger) — ptkwt@... (Phil Tomson) 2005/06/12

In article <9e7db91105061106485b68d629@mail.gmail.com>,

[#145207] Re: python/ruby benchmark(don't shoot the messenger) — Steven Jenkins <steven.jenkins@...> 2005/06/12

Phil Tomson wrote:

[#145212] Re: python/ruby benchmark(don't shoot the messenger) — Austin Ziegler <halostatue@...> 2005/06/12

On 6/12/05, Steven Jenkins <steven.jenkins@ieee.org> wrote:

[#145219] Re: python/ruby benchmark(don't shoot the messenger) — Steven Jenkins <steven.jenkins@...> 2005/06/12

Austin Ziegler wrote:

[#145223] Re: python/ruby benchmark(don't shoot the messenger) — Austin Ziegler <halostatue@...> 2005/06/12

On 6/12/05, Steven Jenkins <steven.jenkins@ieee.org> wrote:

[#145240] Re: python/ruby benchmark(don't shoot the messenger) — Steven Jenkins <steven.jenkins@...> 2005/06/12

Austin Ziegler wrote:

[#145241] Re: python/ruby benchmark(don't shoot the messenger) — Austin Ziegler <halostatue@...> 2005/06/13

On 6/12/05, Steven Jenkins <steven.jenkins@ieee.org> wrote:

[#145000] RDoc

Hi, I have a question. When I compiled ruby-1.8.2

13 messages 2005/06/09
[#145003] Re: RDoc — Eric Hodel <drbrain@...7.net> 2005/06/09

On 09 Jun 2005, at 13:55, Jesffffas Antonio Sfffe1nchez A. wrote:

[#145238] finding Hash subsets based on key value — "ee" <erik.eide@...>

Hi

17 messages 2005/06/12

[#145304] PDF::Writer 1.0 (version 1.0.1) — Austin Ziegler <halostatue@...>

= PDF::Writer

21 messages 2005/06/13
[#145411] Re: [ANN] PDF::Writer 1.0 (version 1.0.1) — Jason Foreman <threeve.org@...> 2005/06/14

No love from PDF::Writer on Mac OS X 10.4.1. I hope to get this fixed

[#145420] Re: [ANN] PDF::Writer 1.0 (version 1.0.1) — Austin Ziegler <halostatue@...> 2005/06/14

On 6/14/05, Jason Foreman <threeve.org@gmail.com> wrote:

[#145432] Re: [ANN] PDF::Writer 1.0 (version 1.0.1) — Jamis Buck <jamis@37signals.com> 2005/06/15

On Jun 14, 2005, at 5:11 PM, Austin Ziegler wrote:

[#145339] survey: what editor do you use to hack ruby? — Lowell Kirsh <lkirsh@...>

I've been having a tough time getting emacs set up properly with ruby

62 messages 2005/06/14

[#145390] Ruby and recursion (Ackermann benchmark) — ptkwt@... (Phil Tomson)

14 messages 2005/06/14

[#145586] How to make a browser in Ruby Tk — sujeet kumar <sujeetkr@...>

Hi

13 messages 2005/06/16

[#145636] Super-scalar Optimizations — "Phrogz" <gavin@...>

I was looking over the shoulder of a C++ coworker yesterday, when he

14 messages 2005/06/16

[#145677] Truth maintenance system in Ruby — "itsme213" <itsme213@...>

Anyone know of any kind of truth-maintenance system implemented in Ruby (or,

12 messages 2005/06/17

[#145720] Frameless RDoc template ('technology preview') — ES <ruby-ml@...>

Hi!

17 messages 2005/06/17

[#145779] Newbe questions... — "Chuck Brotman" <brotman@...>

In Ruby Is there a prefered (or otherwise elegant) way to do an inner &

17 messages 2005/06/18

[#145790] GC.disable not working? — Eric Mahurin <eric_mahurin@...>

From what I can tell, GC.disable doesn't work. I'm wanting to

37 messages 2005/06/18
[#145822] Re: GC.disable not working? — ts <decoux@...> 2005/06/19

>>>>> "E" == Eric Mahurin <eric_mahurin@yahoo.com> writes:

[#146024] evaluation of ruby — "Franz Hartmann" <porschefranz@...> 2005/06/21

Hello all,

[#145830] preventing instantiation — "R. Mark Volkmann" <mark@...>

What is the recommended way in Ruby to prevent other classes from creating

13 messages 2005/06/19
[#145831] Re: preventing instantiation — Gavri Fernandez <gavri.fernandez@...> 2005/06/19

On 6/19/05, R. Mark Volkmann <mark@ociweb.com> wrote:

[#145879] x==1 vs 1==x — Gavin Kistner <gavin@...>

I'm against _premature_ optimization in theory, but believe that a

19 messages 2005/06/20
[#145880] Re: x==1 vs 1==x — ts <decoux@...> 2005/06/20

>>>>> "G" == Gavin Kistner <gavin@refinery.com> writes:

[#145943] Chess Variants (II) (#36) — James Edward Gray II <james@...>

I don't want to spoil all the fun, in case anyone is still attempting

12 messages 2005/06/20

[#146038] 1. Ruby result: 101 seconds , 2. Java result:9.8 seconds, 3. Perl result:62 seconds — Michael Tan <mtan1232000@...>

Just new to Ruby since last week, running my same functional program on the windows XP(Pentium M1.5G), the Ruby version is 10 times slower than the Java version. The program is to find the prime numbers like 2, 3,5, 7, 11, 13... Are there setup issues? or it is normal?

47 messages 2005/06/21
[#146044] Re: 1. Ruby result: 101 seconds , 2. Java result:9.8 seconds, 3. Perl result:62 seconds — "Florian Frank" <flori@...> 2005/06/21

Michael Tan wrote:

[#146047] Re: 1. Ruby result: 101 seconds , 2. Java result:9.8 seconds, 3. Perl result:62 seconds — Jim Freeze <jim@...> 2005/06/21

* Florian Frank <flori@nixe.ping.de> [2005-06-22 05:40:14 +0900]:

[#146050] Re: 1. Ruby result: 101 seconds , 2. Java result:9.8 seconds, 3. Perl result:62 seconds — "Ryan Leavengood" <mrcode@...> 2005/06/21

Jim Freeze said:

[#146132] Re: 1. Ruby result: 101 seconds , 2. Java result:9.8 seconds, 3. Perl result:62 seconds — "Mark Thomas" <mrt@...> 2005/06/22

Florian Frank wrote:

[#146064] rubyscript2exe — Joe Van Dyk <joevandyk@...>

Hi,

14 messages 2005/06/21

[#146169] spidering a website to build a sitemap — Bill Guindon <agorilla@...>

I need to spider a site and build a sitemap for it. I've looked

17 messages 2005/06/22

[#146178] traits-0.4.0 - the coffee release — "Ara.T.Howard" <Ara.T.Howard@...>

15 messages 2005/06/22

[#146328] string to Class object — "R. Mark Volkmann" <mark@...>

How can I create a Class object from a String that contains the name of a class?

15 messages 2005/06/24

[#146380] Application-0.6.0 — Jim Freeze <jim@...>

CommandLine - Application and OptionParser

22 messages 2005/06/24

[#146391] ASP.NET vs Ruby on Rails — Stephen Kellett <snail@...>

HI Folks,

21 messages 2005/06/24
[#146457] Re: ASP.NET vs Ruby on Rails — "Dema" <demetriusnunes@...> 2005/06/25

Hi Stephen,

[#146425] speeding up Process.detach frequency — Joe Van Dyk <joevandyk@...>

Is there any way to speed up Process.detach? The ri documentation for

14 messages 2005/06/25

[#146483] I saw the beauty of Ruby Re: 1. Ruby result: 101 seconds , 2. Java result:9.8 seconds, 3. Perl result:62 seconds — Michael Tan <mtan1232000@...>

22 messages 2005/06/26
[#146485] Re: I saw the beauty of Ruby Re: 1. Ruby result: 101 seconds , 2. Java result:9.8 seconds, 3. Perl result:62 seconds — "Florian Frank" <flori@...> 2005/06/26

Michael Tan wrote:

[#146504] Re: I saw the beauty of Ruby Re: 1. Ruby result: 101 seconds , 2. Java result:9.8 seconds, 3. Perl result:62 seconds — Brad Wilson <dotnetguy@...> 2005/06/26

For comparison, the port of your code to (less than elegant) C#.

[#146515] Re: I saw the beauty of Ruby Re: 1. Ruby result: 101 seconds , 2. Java result:9.8 seconds, 3. Perl result:62 seconds — Florian Gro<florgro@...> 2005/06/26

Brad Wilson wrote:

[#146491] What do you want to see in a Sparklines Library? — Daniel Nugent <nugend@...>

This is sort of an interest gauging/feature request poll.

17 messages 2005/06/26
[#146506] Re: What do you want to see in a Sparklines Library? — Daniel Amelang <daniel.amelang@...> 2005/06/26

See what's already been done before you get too far.

[#146517] Re: What do you want to see in a Sparklines Library? — Daniel Nugent <nugend@...> 2005/06/26

Yup, seen the stuff on RedHanded, I was planning on writing a little

[#146562] RCM - A Ruby Configuration Management System — Michael Neumann <mneumann@...>

Hi all,

22 messages 2005/06/27

[#146630] yield does not take a block — Daniel Brockman <daniel@...>

Under ruby 1.9.0 (2005-06-23) [i386-linux], irb 0.9.5(05/04/13),

48 messages 2005/06/28
[#146666] Re: yield does not take a block — Daniel Brockman <daniel@...> 2005/06/28

Yukihiro Matsumoto <matz@ruby-lang.org> writes:

[#146680] Re: yield does not take a block — Yukihiro Matsumoto <matz@...> 2005/06/28

Hi,

[#146684] Re: yield does not take a block — Eric Mahurin <eric_mahurin@...> 2005/06/28

[#146779] Re: yield does not take a block — "Adam P. Jenkins" <thorin@...> 2005/06/29

Eric Mahurin wrote:

[#146700] Anything in new Eclipse for Rubyists? — "jfry" <jeff.fry@...>

Hey there, I know that a number of folks on the list use Eclipse as

14 messages 2005/06/28

[#146773] Programmers Contest: Fit pictures on a page — hicinbothem@...

GLOSSY: The Summer Programmer Of The Month Contest is underway!

18 messages 2005/06/29

[#146815] shift vs. slice!(0) and others — Eric Mahurin <eric_mahurin@...>

I just did some benchmarking of various ways to insert/delete

12 messages 2005/06/29

[SUMMARY] Chess Variants (I) (#35)

From: Ruby Quiz <james@...>
Date: 2005-06-16 13:00:00 UTC
List: ruby-talk #145582
As Gavin Kistner pointed out, this quiz was too much work.  There's nothing that
hard about a chess game, as long as you don't need an AI, but there's just a lot
of things you have to take care of.

You have to define moves for six different pieces, build a board with some
helper methods that can handle chess geometry, and handle edge cases like
en-passant, castling and pawn promotion.  That's just a lot of tedious work.

Check is the real challenge, for me anyway, because it affects so much of the
game.  You must get out of check when you're in check.  You can never make a
move that puts you in check.  You can't even castle through a square if you
would be in check in that square.  All that eventually adds up.

What I should have done with this quiz was provide a chess library and then ask
for the variations, which is the interesting part of the challenge.  Luckily,
Ruby Quiz solvers are always making me look good, and that's basically what we
have now, thanks to their efforts.  Three people have submitted libraries and
another person has submitted an example of how to use an existing library to
solve this problem, with very little code even.  Now, if anyone else wants to
give round two a try, my hope is that you'll use these libraries as jumping off
points and still be able to join in on the fun.

The three libraries are surprisingly similar.  We all had about the same idea,
build a class hierarchy for the pieces and create a board.  I believe even
Bangkok, the library used by Jim Menard's example works that way.  The idea is
that common chess piece behavior goes in a Piece class.  Then you subclass Piece
for Pawn, Knight, etc., adding the unique behaviors.  In chess, this generally
amounts to the piece's unique moves.

Paolo Capriotti skipped the chess subclasses and rolled the move types into the
Board class.  This isn't unreasonable.  Knowing what moves a piece can make at
any point in the game requires knowledge of the board.  Those of us who use
piece classes pass the board down to the piece to account for this.  Paolo just
reverses that.

The other essential part of a chess library is a Board object, as I said before.
Chess definitely has its own geometry and you need an object that encompasses
that.  One question is how to refer to the square themselves.  You can go with a
two dimensional array style notation, wrap those x and y pairs in a class, or
lean on chess notation and accept things like "e4".  When dealing with chess
positions, we often need information about ranks, files, diagonals, those wacky
L-shaped knight jumps, etc.  Board provides this information as well. 

Obviously, Board also needs to provide piece moving routines and this can be
heavy lifting.  These methods need to be aware of castling, pawn promotion,
en-passant capture, and check.  That's the real guts of a chess game.

I'm not going to dump entire chess libraries in here.  Instead, I'll show usage.
Here's Paolo's chess game portion of rchess.rb:

	class ChessGame
	  attr_reader :board
	  include UI
	  
	  def initialize
	    @board = Board.new(8,8)
	    @board.promotion_piece = :queen
	    
	    (0...8).each do |x|
	      @board[x,1] = Piece.new( :black, :pawn )
	      @board[x,6] = Piece.new( :white, :pawn )
	    end
	    
	    @board[0,0] = Piece.new( :black, :rook )
	    @board[1,0] = Piece.new( :black, :knight )
	    @board[2,0] = Piece.new( :black, :bishop )
	    @board[3,0] = Piece.new( :black, :queen )
	    @board[4,0] = Piece.new( :black, :king )
	    @board[5,0] = Piece.new( :black, :bishop )
	    @board[6,0] = Piece.new( :black, :knight )
	    @board[7,0] = Piece.new( :black, :rook )
	    
	    @board[0,7] = Piece.new( :white, :rook )
	    @board[1,7] = Piece.new( :white, :knight )
	    @board[2,7] = Piece.new( :white, :bishop )
	    @board[3,7] = Piece.new( :white, :queen )
	    @board[4,7] = Piece.new( :white, :king )
	    @board[5,7] = Piece.new( :white, :bishop )
	    @board[6,7] = Piece.new( :white, :knight )
	    @board[7,7] = Piece.new( :white, :rook )
	  end
	  
	  def play
	    while (state = @board.game_state) == :in_game
	      begin
	        move
	      rescue RuntimeError => err
	        print "\n"
	        if err.message == "no move"
	          say :exiting
	        else
	          say err.message
	        end
	        return
	      end
	    end
	    show_board
	    say state
	  end
	  
	  def move
	    loop do
	      say ""
	      show_board
	      from, to = ask_move
	      raise "no move" unless from
	      if @board.is_valid(from) and @board.is_valid(to) and
	         @board.legal_move(from, to)
	        if @board.promotion(from, to)
	          @board.promotion_piece = ask_promotion_piece
	        end
	        @board.move(from, to)
	        break
	      else
	        say :invalid_move
	      end
	    end    
	  end
	end

	@game = ChessGame.new
	@game.play

You can see that Paolo's library also includes a UI module, which this game
object makes use of.  The constructor is straight forward, it sets up some
initial state information, including a board, and places the pieces in their
starting positions.  Notice that the Board object is indexed as a
multidimensional array and the pieces can be constructed from just a color and a
type.

The play() method is the game itself.  It's really just a loop looking for an
end game condition.  Aside from a little error checking and displaying the final
state, it simply calls move() again and again.

Which brings us to the move() method.  It shows the board (with the help of the
UI method show_board()) and then asks for a move (another UI helper).  You can
see that the move is validated using the Board object, and then Board.move() is
called to advance the game.

The final two lines kick off the methods we just examined.  All the details are
handled by the library itself.

Here's the same thing using my own library:

	#!/usr/local/bin/ruby -w

	# chess
	#
	#  Created by James Edward Gray II on 2005-06-14.
	#  Copyright 2005 Gray Productions. All rights reserved.

	require "chess"

	board = Chess::Board.new

	puts
	puts "Welcome to Ruby Quiz Chess."

	# player move loop
	loop do
		# show board
		puts
		puts board
		puts

		# watch for end conditions
		if board.in_checkmate?
			puts "Checkmate!  " +
			     "It's #{board.turn == :white ? 'Black' : 'White'}'s game."
			puts
			break
		elsif board.in_stalemate?
			puts "Stalemate."
			puts
			break
		elsif board.in_check?
			puts "Check."
		end

		# move input loop
		move = nil
		loop do
			print "#{board.turn.to_s.capitalize}'s Move (from to):  "
			move = $stdin.gets.chomp
			
			# validate move
			moves = board.moves
			if move !~ /^\s*([a-h][1-8])\s*([a-h][1-8])\s*$/
				puts "Invalid move format.  Use from to.  (Example:  e2 e4.)"
			elsif board[$1].nil?
				puts "No piece on that square."
			elsif board[$1].color != board.turn
				puts "That's not your piece to move."
			elsif board.in_check? and ( (m = moves.assoc($1)).nil? or
				                        not m.last.include?($2) )
				puts "You must move out of check."
			elsif not (board[$1].captures + board[$1].moves).include?($2)
				puts "That piece can't move to that square."
			elsif ((m = moves.assoc($1)).nil? or not m.last.include?($2))
				puts "You can't move into check."
			else
				break
			end
		end
		
		# make move, with promotion if needed
		if board[$1].is_a?(Chess::Pawn) and $2[1, 1] == "8"
			from, to = $1, $2

			print "Promote to (k, b, r, or q)?  "
			promote = $stdin.gets.chomp
			
			case promote.downcase[0, 1]
			when "k"
				board.move($1, $2, Chess::Knight)
			when "b"
				board.move($1, $2, Chess::Bishop)
			when "r"
				board.move($1, $2, Chess::Rook)
			else
				board.move($1, $2, Chess::Queen)
			end
		else
			board.move($1, $2)
		end
	end

I pull in my chess library, and create a Chess::Board.  Next, I display a
welcome message then launch into my game loop which begins by printing the
board.  My Board object defines to_s(), so you can just print it as needed.

My chess game then checks for game end conditions using helper methods on Board
like in_checkmate?() and in_stalemate?().  When found, the code prints messages
and breaks out of the game loop.

The next loop is my move input loop.  It looks like a lot of code but there are
two good reasons for that.  One, I wanted good error messages, so I'm checking
every little thing that could have gone wrong and printing a custom message for
it.  Two, I avoiding using HighLine to simplify the process, so I wouldn't add
the dependancy to the library.  So really I'm just reading input and printing
error messages here, nothing exciting.

The final chunk of code checks to see if the requested move is a pawn promotion.
When it is, the user is prompted to choose the new piece type.  Either way, the
requested move is passed along to Board.move(), which handles the rest of the
game.

One last example.  Let's look at Gavin Kistner's code:

	if $0 == __FILE__
		include GKChess
		require "rubygems"
		require "highline/import"
		board = Board.new
		while !board.game_over?
			puts "\n#{board}\n\n"
			puts "Move ##{board.move_number}, #{board.turn}'s turn"
			#puts "(#{@turn} is in check)" if board.king_in_check?( @turn )

			piece = ask( "\tPiece to move: ",
			             lambda { |loc| board[ loc ] } ){ |q|
				q.responses[ :not_valid ] = ""
				q.validate = lambda { |loc|
					case loc
						when /[a-h][1-8]/i
							if piece = board[ loc ]
								if piece.color == board.turn
									if !piece.possible_moves.empty?
										true
									else
										puts "That #{piece.name} has no " +
										     "legal moves available."
										false
									end
								else
									puts "The #{piece.name} at #{loc} " +
									     "does not belong to #{board.turn}!"
									false
								end
							else
								puts "There is no piece at #{loc}!"
								false
							end
						else
							puts "(Please enter the location such as " +
							     "a8 or c3)"
							false
					end
				}
			}

			valid_locations = piece.possible_moves.collect{ |move|
				move.colrow
			}

			dest = ask( "\tMove #{piece.name} to: " ){ |q|
				q.responses[ :not_valid ] = "The #{piece.name} cannot " +
					"move there. Valid moves: " +
					"#{valid_locations.sort.join(', ')}."
				q.validate = lambda { |loc|
					valid_locations.include?( loc.downcase )
				}
			}

			board.move( piece.colrow, dest )
		end
	end

Gavin start's by pulling in the GKChess namespace and the HighLine library to
ease the input fetching process.  The code then creates a Board and loops
looking for Board.game_over?().  It prints the board and turn, much like my own
code did, then fetches a move from the player.

Again, this looks like a lot of code, mainly because of the error messages.  The
player is asked to select a piece (which HighLine fetches and returns), then the
code loads all the valid moves for that piece (using possible_moves()). 
Finally, the player is asked to select one of those moves for the piece and
Board.move() is called to make it happen.

As I said, all three solutions were surprisingly similar.

Now we have to think about how we would adapt these to chess variations. 
Obviously, you need to get a little familiar with your library of choice.  Get
to know the methods it provides.  Then, you'll probably need to subclass some of
the objects and override them with some special behavior.  At that point, you
should be able to plug your chess variant objects into something like the above
examples.  Of course, any code handles some changes better than others and
that's were the real fun comes in.

I hope you'll consider giving next week's challenge a shot, even if you didn't
suffer through this week's torture.  Grab a library and start adapting.  See how
it goes.

I apologize for not estimating this challenge better and presenting it in a more
digestible format.  Thanks so much to Gavin Kistner, Jim Menard, and Paolo
Capriotti for for trying it anyway!

In This Thread

Prev Next