[#227503] open-uril ECONNREFUSED problem — Cyrus Ghalambor <cyrusg@...>

I'm working on a simple scraping tool and the open() method has suddenly

12 messages 2006/12/01

[#227527] Gateway is malfunctioning — "Trans" <transfire@...>

Someone recently mentioned missing posts. I just did a comparsion of

31 messages 2006/12/01

[#227574] Turtle Graphics (#104) — Ruby Quiz <james@...>

The three rules of Ruby Quiz:

37 messages 2006/12/01
[#227598] Re: [QUIZ] Turtle Graphics (#104) — "Harold Hausman" <hhausman@...> 2006/12/01

On 12/1/06, Ruby Quiz <james@grayproductions.net> wrote:

[#227606] Re: [QUIZ] Turtle Graphics (#104) — James Edward Gray II <james@...> 2006/12/01

On Dec 1, 2006, at 9:42 AM, Harold Hausman wrote:

[#227620] Re: [QUIZ] Turtle Graphics (#104) — "Harold Hausman" <hhausman@...> 2006/12/01

On 12/2/06, James Edward Gray II <james@grayproductions.net> wrote:

[#227661] Re: [QUIZ] Turtle Graphics (#104) — Daniel Martin <martin@...> 2006/12/01

"Harold Hausman" <hhausman@gmail.com> writes:

[#227670] Re: [QUIZ] Turtle Graphics (#104) — James Edward Gray II <james@...> 2006/12/01

On Dec 1, 2006, at 3:44 PM, Daniel Martin wrote:

[#227682] Re: tk.rb warning in Turtle Graphics (#104) — Edwin Fine <efine145-nospam01@...> 2006/12/02

/usr/local/lib/ruby/site_ruby/1.8/tk.rb:1187: warning: instance variable

[#227713] Re: tk.rb warning in Turtle Graphics (#104) — Morton Goldberg <m_goldberg@...> 2006/12/02

On Dec 1, 2006, at 7:22 PM, Edwin Fine wrote:

[#227630] Simple iteration in a function problem — Blake Miller <blakeage@...>

i'm trying to do this, and I'm stuck

34 messages 2006/12/01

[#227702] calculations on lists of numbers — ara.t.howard@...

38 messages 2006/12/02

[#227739] openssl error - ubuntu — "Chad" <carimura@...>

Help!

27 messages 2006/12/02
[#227741] Re: openssl error - ubuntu — Jose francisco Gonzalez carmona <pgonzalez@...> 2006/12/02

[#227787] Re: openssl error - ubuntu — "Chad" <carimura@...> 2006/12/02

Absolutely... I'm not a linux expert though, but I have a feeling

[#227822] Re: openssl error - ubuntu — "Chad" <carimura@...> 2006/12/02

I finally figured it out.

[#305614] Re: openssl error - ubuntu — James George <james@...> 2008/06/19

Thanks a lot pal, it worked perfectly for me too. I had the same openssl

[#305645] Re: openssl error - ubuntu — Marc Heiler <shevegen@...> 2008/06/19

So much for distribution's package managers making your life easier,

[#227801] comma separating output from array.to_s — "jansenh" <henning.jansen@...>

hi comp.lang.ruby

18 messages 2006/12/02

[#227819] Factory pattern, abstract base class — "Daniel Berger" <djberg96@...>

Hi all,

16 messages 2006/12/02

[#227839] Why does a test fail when I predicted it's exception class? — "Richard" <RichardDummyMailbox58407@...>

Hi,

10 messages 2006/12/03

[#227857] File.size() returning negative for large files ???? — "Greg Hauptmann" <greg.hauptmann.ruby@...>

Hi,

13 messages 2006/12/03
[#227859] Re: File.size() returning negative for large files ???? — Damjan Rems <d_rems@...> 2006/12/03

Greg Hauptmann wrote:

[#227860] I'm a new member — "Quỳnh Trần" <quynh_khanh2002@...>

Hi evrybody!

16 messages 2006/12/03

[#227873] Simple and stuppid bug (can anyone find it?) — "paul" <pjvleeuwen@...>

Hi all,

13 messages 2006/12/03

[#227979] method overloading like Java? — Daniel Finnie <danfinnie@...>

In Java, you could write the following code:

12 messages 2006/12/04

[#228031] Question about Ruby philosophy — Zouplaz <user@...>

Hello, when I compare Ruby to Java there is something I don't understand .

46 messages 2006/12/04
[#228134] Re: Question about Ruby philosophy — "Max Muermann" <ruby@...> 2006/12/05

On 12/4/06, Zouplaz <user@domain.invalid> wrote:

[#228047] replace delimiter in unicode encdoded file — "ciapecki" <ciapecki@...>

Is there a way in ruby to:

20 messages 2006/12/04

[#228127] How do I catch a missing method on a passed block? — "J2M" <james2mccarthy@...>

I would like to invoke method_missing on baz in this code;

34 messages 2006/12/04
[#228211] Re: How do I catch a missing method on a passed block? — Daniel Schierbeck <daniel.schierbeck@...> 2006/12/05

On Tue, 2006-12-05 at 08:04 +0900, J2M wrote:

[#228213] Re: How do I catch a missing method on a passed block? — Logan Capaldo <logancapaldo@...> 2006/12/05

On Tue, Dec 05, 2006 at 11:54:06PM +0900, Daniel Schierbeck wrote:

[#228266] md5 function in Ruby — Denys Yakhnenko <dyakhnenko@...>

Hello all:

14 messages 2006/12/05

[#228273] Lisp comprehensions => SQL — "Victor \"Zverok\" Shepelev" <vshepelev@...>

Hi all.

24 messages 2006/12/05

[#228352] Newbie: working with a text file and converting to xml — Adam Teale <ateale@...>

hi Guys,

12 messages 2006/12/06

[#228379] Calling super in overwritten methods — Joerg Diekmann <joergd@...>

Hi - not sure if this is possible - but it feels like it could be with

12 messages 2006/12/06

[#228380] join_with — "Martin DeMello" <martindemello@...>

While golfing with the hex_ip thread, I realised that map takes no

33 messages 2006/12/06
[#229469] map taking an argument (was: Re: join_with) — dblack@... 2006/12/13

Hi --

[#228422] invasive parameters as method mode variables — "Trans" <transfire@...>

Working on a method where I would like one part of it's operations to

15 messages 2006/12/06

[#228605] Show your support for Rubinius! — "Sam Smoot" <ssmoot@...>

(I hope you don't mind a bit of cross-posting, but seeing as how the

17 messages 2006/12/07
[#228613] Re: Show your support for Rubinius! — "Tim Pease" <tim.pease@...> 2006/12/07

On 12/7/06, Sam Smoot <ssmoot@gmail.com> wrote:

[#228618] Re: Show your support for Rubinius! — "Brian Mitchell" <binary42@...> 2006/12/07

On 12/7/06, Tim Pease <tim.pease@gmail.com> wrote:

[#228620] Re: Show your support for Rubinius! — "Wilson Bilkovich" <wilsonb@...> 2006/12/07

On 12/7/06, Brian Mitchell <binary42@gmail.com> wrote:

[#228622] Re: Show your support for Rubinius! — benjohn@... 2006/12/07

I'd like to know more about Rubinius, but all the info I've got on it

[#228628] Array changing after concat function — WKC CCC <wai-kee.chung@...>

Can someone shed some light on this problem. In the example, I am

17 messages 2006/12/07

[#228716] Am I missing something about BER-compressed integer? — "Francis Cianfrocca" <garbagecat10@...>

All:

12 messages 2006/12/08

[#228738] Tournament Matchups (#105) — Ruby Quiz <james@...>

The three rules of Ruby Quiz:

23 messages 2006/12/08

[#228875] Ruby Core + Php FrontEnd (open) — Flaab Mrlinux <flaab_mrlinux@...>

Good afternoon everyone.

13 messages 2006/12/09

[#228945] format problem — chen li <chen_li3@...>

Hi all,

23 messages 2006/12/10

[#229119] else inside rescue is useless? — "cap" <capitain@...>

http://www.awprofessional.com/bookstore/product.asp?isbn=0672328844&rl=1

20 messages 2006/12/11

[#229122] Newbie questions — Dav Jones <kakaze@...21.com>

Hello, I'm quite new to this whole Ruby malarky and I'm having some real

15 messages 2006/12/11

[#229244] Re: Ruby for Kids? — "Jeff_M" <JeffMcGrath@...>

18 messages 2006/12/12

[#229350] C => Ruby plus TCP serialization using Marshal.dump/load — "Nathan Baker" <nathanb@...>

Hey,

12 messages 2006/12/12

[#229351] - Bible 1.0.1 - A bible reference parsing and text retrieval tool — "Justin Bailey" <jgbailey@...>

All,

13 messages 2006/12/12

[#229397] Restricted capture in Regexp — benjohn@...

Is there a regexp feature that lets me require something to be present

16 messages 2006/12/13

[#229398] How to improve my Ruby skills ? — Zouplaz <user@...>

Hello there... Like many others I've discovered Ruby when I started

11 messages 2006/12/13

[#229467] Net::Ldap question — Eduardo Y瘻ez Parareda <eduardo.yanezNOSPAM@...>

Hello, I'm trying this plugin in a rails app and think I need some help.

13 messages 2006/12/13
[#229486] Re: Net::Ldap question — Eduardo Y瘻ez Parareda <eduardo.yanezNOSPAM@...> 2006/12/13

Hehe, sorry again. I've reading documentation of this library and already know

[#229514] Re: Net::Ldap question — "Francis Cianfrocca" <garbagecat10@...> 2006/12/13

On 12/13/06, Eduardo Y瘻ez Parareda <eduardo.yanezNOSPAM@nospamgmail.com> wrote:

[#229511] Random idea - private, blocks, constants — "Daniel Berger" <djberg96@...>

Hi all,

14 messages 2006/12/13

[#229598] CTI Corporativo auto responses — "Daniel Berger" <djberg96@...>

All,

14 messages 2006/12/14

[#229600] Swap contents in two files — Christopher Latif <christopherl@...>

I have two files, I want to swap the contents of the files in my

17 messages 2006/12/14

[#229763] Chess960 (#106) — Ruby Quiz <james@...>

The three rules of Ruby Quiz:

33 messages 2006/12/15

[#229883] ZenTest autotest problems — Zouplaz <user@...>

Hello, I have big troubles using the latest autotest version (3.4.2)

11 messages 2006/12/16
[#229985] Re: ZenTest autotest problems — Eric Hodel <drbrain@...7.net> 2006/12/17

On Dec 16, 2006, at 01:40, Zouplaz wrote:

[#229990] Re: ZenTest autotest problems — Zouplaz <user@...> 2006/12/17

le 17/12/2006 07:43, Eric Hodel nous a dit:

[#230118] Re: ZenTest autotest problems — Eric Hodel <drbrain@...7.net> 2006/12/18

On Dec 17, 2006, at 24:55, Zouplaz wrote:

[#229906] Just some Ruby language ideas, comments wanted. — Daniel Finnie <danfinnie@...>

My first Ruby language idea is simple. Instead of having every method

13 messages 2006/12/16

[#229917] does Ruby generate WINDOWS and dialog boxes? — "Ken Laninga" <personal@...>

I just heard about Ruby and it looks fascinating. I see lots of code being

60 messages 2006/12/16
[#229922] Re: does Ruby generate WINDOWS and dialog boxes? — David Vallner <david@...> 2006/12/16

Ken Laninga wrote:

[#229939] Re: does Ruby generate WINDOWS and dialog boxes? — Joel VanderWerf <vjoel@...> 2006/12/16

David Vallner wrote:

[#229961] Re: does Ruby generate WINDOWS and dialog boxes? — Suraj Kurapati <snk@...> 2006/12/17

Joel VanderWerf wrote:

[#229967] Re: does Ruby generate WINDOWS and dialog boxes? — "Richard" <RichardDummyMailbox58407@...> 2006/12/17

[#229968] Re: does Ruby generate WINDOWS and dialog boxes? — David Vallner <david@...> 2006/12/17

Richard wrote:

[#229973] Re: does Ruby generate WINDOWS and dialog boxes? — "Richard" <RichardDummyMailbox58407@...> 2006/12/17

[#230007] Re: does Ruby generate WINDOWS and dialog boxes? — David Vallner <david@...> 2006/12/17

Richard wrote:

[#230065] Re: does Ruby generate WINDOWS and dialog boxes? — "Richard" <RichardDummyMailbox58407@...> 2006/12/17

> Odds are it Just Won't unless you only

[#230073] Re: does Ruby generate WINDOWS and dialog boxes? — David Vallner <david@...> 2006/12/17

Richard wrote:

[#230127] Re: does Ruby generate WINDOWS and dialog boxes? — "Richard" <RichardDummyMailbox58407@...> 2006/12/18

Disclaimer: All my assertions about Ruby, Rails, WEBrick and MySQL are

[#230008] Grabbing data off a webpage — Bil Kleb <Bil.Kleb@...>

OK, so I haven't done this in years.

12 messages 2006/12/17

[#230011] Ruby IDE — <adaworks@...>

I am new to Ruby, but I have used a lot of other

24 messages 2006/12/17

[#230089] Question regarding threads and I/O — "Michael W. Ryder" <_mwryder@...>

I am a veteran programmer but still am trying to learn Ruby. In the

14 messages 2006/12/17
[#230094] Re: Question regarding threads and I/O — Logan Capaldo <logancapaldo@...> 2006/12/18

On Mon, Dec 18, 2006 at 08:55:10AM +0900, Michael W. Ryder wrote:

[#230147] Problem installing Ruby/Tk — Christopher Latif <christopherl@...>

Installed Linux

14 messages 2006/12/18

[#230256] where have all the experienced users gone? — "Trans" <transfire@...>

seems like there's been a steady drop off in experienced ruby users on

63 messages 2006/12/19
[#230284] Re: [OT] where have all the experienced users gone? — Eric Hodel <drbrain@...7.net> 2006/12/19

On Dec 18, 2006, at 18:50, Trans wrote:

[#230327] Re: [OT] where have all the experienced users gone? — Jeremy Wells <jwells@...> 2006/12/19

Eric Hodel wrote:

[#230332] Re: [OT] where have all the experienced users gone? — "Robert Dober" <robert.dober@...> 2006/12/19

On 12/19/06, Jeremy Wells <jwells@servalsystems.co.uk> wrote:

[#230350] Re: [OT] where have all the experienced users gone? — "Jeremy McAnally" <jeremymcanally@...> 2006/12/19

I think it's also important that we all realize that we use mailing

[#230423] Re: [OT] where have all the experienced users gone? — James Edward Gray II <james@...> 2006/12/19

On Dec 19, 2006, at 7:52 AM, Jeremy McAnally wrote:

[#230322] Re: where have all the experienced users gone? — "Robert Dober" <robert.dober@...> 2006/12/19

On 12/19/06, Trans <transfire@gmail.com> wrote:

[#230507] Re: where have all the experienced users gone? — "Simon Strandgaard" <neoneye@...> 2006/12/20

On 12/19/06, Robert Dober <robert.dober@gmail.com> wrote:

[#230514] Re: where have all the experienced users gone? — "Robert Dober" <robert.dober@...> 2006/12/20

On 12/20/06, Simon Strandgaard <neoneye@gmail.com> wrote:

[#230295] string of strings... — Josselin <josselin@...>

I got an array of id's :

13 messages 2006/12/19

[#230328] compare two objects without take its ID in consideration — Lobosque Lucas <floyd_u2@...>

Is there a way to compare two objects without take its ID in

17 messages 2006/12/19

[#230450] ruby gotchas — Mark Guzman <segfault@...>

I've written up some ruby gotchas that have come up while using ruby.

16 messages 2006/12/19

[#230548] tricky sort for happy visitors of Paris — Josselin <josselin@...>

all happy visitors of Paris know about the 'arrondissement', an

20 messages 2006/12/20

[#230588] openssl on Red Hat not installed — Hueen Hueen <hueen@...>

So I'm one of the unlucky ones that don't have openssl properly

17 messages 2006/12/20

[#230602] Regexp Question: Checking for [joe][/joe] pairs — Joe Peck <joe@...>

Hey, I've got some text in @x and want there to be at least 1 and at

21 messages 2006/12/20

[#230648] Who's maintaining log4r? — jeffz_2002@...

Does anyone know who's maintaining the log4r project? The website at

29 messages 2006/12/20

[#230650] Searching Stings with Arrays? — Phil Cooperking <phil@...>

Hi, I've been having a little problem with this. most of my ruby is from

14 messages 2006/12/20

[#230755] Remove Ruby 1.8.5? — Christopher Latif <christopherl@...>

How do I remove Ruby 1.8.5 from linux? I have built it from source.

20 messages 2006/12/21
[#230874] Re: Remove Ruby 1.8.5? — David Vallner <david@...> 2006/12/21

M. Edward (Ed) Borasky wrote:

[#230879] Re: Remove Ruby 1.8.5? — Vincent Fourmond <vincent.fourmond@9online.fr> 2006/12/21

David Vallner wrote:

[#230792] Method named ***(other) — Julien Gaugaz <gaugaz@...3s.de>

Hi!

15 messages 2006/12/21
[#230799] Re: Method named ***(other) — "Vidar Hokstad" <vidar.hokstad@...> 2006/12/21

[#230829] Ruby's Trac Alternative — Bil Kleb <Bil.Kleb@...>

So I'm trying to use Trac for our FUN3D development,

27 messages 2006/12/21

[#230853] External Ruby Script in HTML — Naked Sushi <runfaster@...>

This probably has a simple answer, but I don't know it.

17 messages 2006/12/21

[#230869] Ruby replacement for ab? — Mat Schaffer <schapht@...>

So I've been hunting for a way to stress test a web application and

17 messages 2006/12/21

[#230983] Merry (slightly early) Christmas! Mr. Neighborly's Humble Little Ruby Book is free! — "Jeremy McAnally" <jeremymcanally@...>

Hello all,

15 messages 2006/12/22

[#231056] Question: Downloading files with open(-uri)? — Mariano Kamp <mariano.kamp@...>

Hi,

16 messages 2006/12/23

[#231072] Help with a ruby idiom — Tim Waters <timgwaters@...>

From the O'Reilly Cookbook there is code that keeps call functions in a

16 messages 2006/12/23

[#231181] Hpricot ri and rdoc documentation — "bbiker" <renard@...>

I have gem installed Hpricot-0.4 (mswin32) but no ri documentation or

15 messages 2006/12/24

[#231198] A problem about replacing a string in a template. — Kuang Dong <kuangdong@...>

File 1: test.tpl

13 messages 2006/12/25

[#231277] Newby - how to round up floating point number? — Dermot Moynihan <der_moyn@...>

Hi guys

14 messages 2006/12/26

[#231303] Hash with two identical keys? — "Trans" <transfire@...>

>From Facets' multiton.rb (which is primarily Floran Franks' work), I'm

15 messages 2006/12/26

[#231341] Peculiar Behavior for a Newby to Undertstand — Charles A Gray <smgspices@...>

I created a class for prime numbers as so:

14 messages 2006/12/27

[#231377] How to do TDD in Ruby? — mekondelta <Chris.Melikian@...>

15 messages 2006/12/27

[#231385] newbie with a weird technical problem (@ least I think it's weird) — "will" <will.graduate@...>

Yep, as the post title implies, I'm a newbie. Being a pragmatic newbie

10 messages 2006/12/27

[#231436] Handling of arbitrary length arrays in arguments to printf builtin — Nick Pavey <nick@...>

Hi Folks,

13 messages 2006/12/27
[#231437] Re: Handling of arbitrary length arrays in arguments to printf builtin — Timothy Hunter <TimHunter@...> 2006/12/27

Nick Pavey wrote:

[#231462] Higher-Order Procedures Tutorial (long) — "Nate Murray" <jashmenn@...>

Hey Guys,

16 messages 2006/12/28

[#231494] Strip is not stripping trailing whitespace — Taylor Strait <taylorstrait@...>

I have files with city names which have one or two trailing whitespaces:

14 messages 2006/12/28

[#231595] What we have here is a retard pretending to be a computer scientist — atbusbook@...

http://www.iam.unibe.ch/~scg/Archive/Papers/Scha04bOOEncapsulation.pdf

14 messages 2006/12/29
[#231602] Paper on strong Object Oriented Encapsulation (Was: some subject with needless insults) — Eric Hodel <drbrain@...7.net> 2006/12/29

On Dec 28, 2006, at 16:05, atbusbook@aol.com wrote:

[#231610] Re: Paper on strong Object Oriented Encapsulation (Was: some subject with needless insults) — "Jeff" <cohen.jeff@...> 2006/12/29

Eric Hodel wrote:

[#231686] how to properly format data when using TCPSocket.send() — Nathan Taylor <onebitcipher@...>

It would be greatly appreciated if someone would clue me in to what I am

12 messages 2006/12/29

[#231726] Methods validating their arguments: good or bad? — Michael Judge <mjudge@...>

15 messages 2006/12/29

[#231763] how to lex javascript for an assert_js system? — Phlip <phlip2005@...>

Ruboids:

14 messages 2006/12/30

[#231785] Proposal to create a new mailing list — Daniel Schierbeck <daniel.schierbeck@...>

Hello fellow Rubyphilics!

31 messages 2006/12/30

[#231801] Little Things — "Trans" <transfire@...>

I was a bit surprised about Matz mention of the little things in his

164 messages 2006/12/30
[#231848] Re: Little Things — Daniel Schierbeck <daniel.schierbeck@...> 2006/12/30

I mostly agree, with some of the additions of course being more

[#231882] Re: Little Things — dblack@... 2006/12/31

Hi --

[#231888] Re: Little Things — "Trans" <transfire@...> 2006/12/31

[#231893] Re: Little Things — Devin Mullins <twifkak@...> 2006/12/31

Trans wrote:

[#231898] Re: Little Things — "Rob Sanheim" <rsanheim@...> 2006/12/31

On 12/31/06, Devin Mullins <twifkak@comcast.net> wrote:

[#232438] Re: Little Things — Paulo Kh <paulo.koch@...> 2007/01/03

On 2006/12/31, at 07:38, Rob Sanheim wrote:

[#232439] Re: Little Things — ara.t.howard@... 2007/01/03

On Thu, 4 Jan 2007, [ISO-8859-1] Paulo Kh wrote:

[#232449] Re: Little Things — "Trans" <transfire@...> 2007/01/03

[#232451] Re: Little Things — ara.t.howard@... 2007/01/03

On Thu, 4 Jan 2007, Trans wrote:

[#232496] Re: Little Things — "Trans" <transfire@...> 2007/01/04

[#232501] Re: Little Things — ara.t.howard@... 2007/01/04

On Thu, 4 Jan 2007, Trans wrote:

[#232502] Re: Little Things — dblack@... 2007/01/04

Hi --

[#232503] Re: Little Things — ara.t.howard@... 2007/01/04

On Thu, 4 Jan 2007 dblack@wobblini.net wrote:

[#232544] Re: Little Things — Devin Mullins <twifkak@...> 2007/01/04

ara.t.howard@noaa.gov wrote:

[#232547] Re: Little Things — "Trans" <transfire@...> 2007/01/04

[#232571] Re: Little Things — Devin Mullins <twifkak@...> 2007/01/04

Trans wrote:

[#232587] Re: Little Things — "Trans" <transfire@...> 2007/01/04

[#232602] Re: Little Things — ara.t.howard@... 2007/01/04

On Thu, 4 Jan 2007, Trans wrote:

[#232615] Re: Little Things — "Trans" <transfire@...> 2007/01/04

[#232616] Re: Little Things — dblack@... 2007/01/04

Hi --

[#232619] Re: Little Things — ara.t.howard@... 2007/01/04

On Fri, 5 Jan 2007 dblack@wobblini.net wrote:

[#232626] Re: Little Things — dblack@... 2007/01/04

Hi --

[#232631] Re: Little Things — ara.t.howard@... 2007/01/04

On Fri, 5 Jan 2007 dblack@wobblini.net wrote:

[#232638] Re: Little Things — "Chris Carter" <cdcarter@...> 2007/01/04

On 1/4/07, ara.t.howard@noaa.gov <ara.t.howard@noaa.gov> wrote:

[#232650] Pervasive Methods [was: Little Things] — "Trans" <transfire@...> 2007/01/04

[#232652] Re: Pervasive Methods [was: Little Things] — ara.t.howard@... 2007/01/04

On Fri, 5 Jan 2007, Trans wrote:

[#232653] Re: Pervasive Methods [was: Little Things] — "Tim Pease" <tim.pease@...> 2007/01/04

On 1/4/07, ara.t.howard@noaa.gov <ara.t.howard@noaa.gov> wrote:

[#232656] Re: Pervasive Methods [was: Little Things] — ara.t.howard@... 2007/01/04

On Fri, 5 Jan 2007, Tim Pease wrote:

[#232657] Re: Pervasive Methods [was: Little Things] — "Trans" <transfire@...> 2007/01/04

[#232659] Re: Pervasive Methods [was: Little Things] — ara.t.howard@... 2007/01/04

On Fri, 5 Jan 2007, Trans wrote:

[#231932] Re: Little Things — Yukihiro Matsumoto <matz@...> 2006/12/31

Hi,

[#231821] Newbie: It works, how can I make it better? — Jay Bornhoft <jbornhoft@...>

I wrote this little prog giving the user two choices.

13 messages 2006/12/30

[#231938] Re: Status of Cardinal (was Re: Proposal to create a new mailing list) — "Francis Cianfrocca" <garbagecat10@...>

I'm not jumping back into this in a big way, since it's obvious

11 messages 2006/12/31

[#231941] Mini-RCR: Extra Argument for Array#join — James Edward Gray II <james@...>

I've been looking at the to_sentence() method in Rails. It's

17 messages 2006/12/31

[#231946] Open source credit card processing in ruby — snacktime <snacktime@...>

Just recently I have the option to open source a credit card

12 messages 2006/12/31
[#231956] Re: Open source credit card processing in ruby — "Francis Cianfrocca" <garbagecat10@...> 2006/12/31

On 12/31/06, M. Edward (Ed) Borasky <znmeb@cesmail.net> wrote:

[#231951] Re: Status of Cardinal (was Re: Proposal to create a new mailing list) — Charles Oliver Nutter <charles.nutter@...>

Robert Dober wrote:

9 messages 2006/12/31

[SUMMARY] Tournament Matchups (#105)

From: Ruby Quiz <james@...>
Date: 2006-12-14 14:15:57 UTC
List: ruby-talk #229609
Quite a few people took a stab at this problem with some mighty clever code. 
I'll confess that I spent a fair amount of time in IRb just to understand some
of the entries.  Perhaps that is instructive in and of itself though, so let me
share an exploration of code with you.

I want to take a look at Marshall T. Vandegrift's solution here.  It's some
clever code that taught me fun new tricks, but I had to play with it a bit to
understand all of it.  It begins with a simple require:

	#! /usr/bin/env ruby
	
	require 'facet/symbol/to_proc'
	
	# ...

If your not familiar with it, the Facets library is a collection of extensions
to Ruby.  As we see here, you can hand pick the extensions you will need for
your program.  Marshall asked for the popular Railsism Symbol#to_proc.  The
method goes something like:

	class Symbol
	  def to_proc
	    lambda { |arg| arg.send(self) }
	  end
	end

The version in the Facets library is a bit more powerful than that, but this is
all Marshall really needed.  The trick here is that Ruby translates a trailing
&whatever in a method call to whatever.to_proc().  Thus the above hack allows us
to shorthand common iterations like:

	words.map { |word| word.downcase }

to:

	words.map(&:downcase)

Let's get back to Marshall's code now:

	# ...
	
	class << Math
	  def log2(n); log(n) / log(2); end
	end
	
	# ...

Now I'm sure all you math geeks just looked at that and nodded, but I said,
"What's that for?"  To find out I decided to play with it in IRb a little:

	>> class << Math
	>>   def log2(n); log(n) / log(2); end
	>> end
	=> nil
	>> (1..10).map { |i| Math.log2(i) }
	=> [0.0, 1.0, 1.58496250072116, 2.0, 2.32192809488736, 2.58496250072116,
	    2.8073549220576, 3.0, 3.16992500144231, 3.32192809488736]
	>> (1..10).map { |i| Math.log2(i).ceil }
	=> [0, 1, 2, 2, 3, 3, 3, 3, 4, 4]
	>> puts (1..10).map { |i| "#{i}: #{Math.log2(i).ceil}" }
	1: 0
	2: 1
	3: 2
	4: 2
	5: 3
	6: 3
	7: 3
	8: 3
	9: 4
	10: 4
	=> nil

Let me talk you through my thought process a bit there.  I thought, well that
looks like a mathematical function that expects a numerical argument.  Let's
feed it a handful of numbers and see if I can make sense of the output.  Egad,
fractions!  OK, this doesn't seem like a problem to involve fractions, so we
probably need to round up or down.  I'll try up.  That set of numbers look
promising.  Let's match them up with the inputs and see if they mean anything to
me.

There are only a few numbers in this problem:  number of players, number of
byes, and number of rounds were all I could think of.  Ah yes, number of rounds.
Two players need only one game.  The quiz listed three rounds for both eight and
six player sets.  Looks like this is a handy way to calculate the needed number
of rounds.

Like I said, I'm sure most of you got to skip my little journey to enlightenment
there, but the rest of us have to use the tools we can.

Back to Marshall's code:

	# ...
	
	class Array
	  def half_size; size >> 1; end
	  def top_half; self[0, half_size]; end
	  def bottom_half; self[half_size, half_size]; end
	end
	
	# ...

This time I was pretty sure I knew what the code did, just from the method names
if nothing else.  I still had questions though.  "How does that work with odd
sizes?"  I asked IRb:

	>> class Array
	>>   def half_size; size >> 1; end
	>>   def top_half; self[0, half_size]; end
	>>   def bottom_half; self[half_size, half_size]; end
	>> end
	=> nil
	>> a = (1..5).to_a
	=> [1, 2, 3, 4, 5]
	>> a.half_size
	=> 2
	>> a.size / 2
	=> 2
	>> a.top_half
	=> [1, 2]
	>> a.bottom_half
	=> [3, 4]
	>> a.pop
	=> 5
	>> a
	=> [1, 2, 3, 4]
	>> a.half_size
	=> 2
	>> a.top_half
	=> [1, 2]
	>> a.bottom_half
	=> [3, 4]

Answer:  It doesn't.  Good to know.

To figure out why this doesn't matter, we need the next bit of code:

	# ...
	
	class Tournament
	  def initialize(players)
	    raise "Tournament requires 2 or more players" if players.size < 2
	
	    @players = players
	    @matches = (0...nrounds).inject(seed) do |(memo,)|
	      memo.top_half.zip(memo.bottom_half.reverse)
	    end
	  end
	
	  attr_reader :players
	  attr_reader :matches
	
	  def render(renderer = AsciiRenderer)
	    extend renderer
	    render_tournament
	  end
	
	  protected
	  def seed; @seed ||= players + Array.new(nbyes, :bye); end
	  def nplayers; players.size; end
	  def nrounds; Math.log2(nplayers).ceil; end
	  def nbyes; (1 << nrounds) - nplayers; end
	end
	
	# ...

My first reaction was, "Hey look at that nrounds() method.  I was right!"  The
second one was, "Ick.  Look at the nbyes() method.  Marshall knows more math
than James."  Back to IRb we go:

	>> def test_bytes(rounds, players)
	>>   pow_of_2 = 1 << rounds
	>>   byes     = pow_of_2 - players
	>>   puts "Byes #{byes} (pow_of_2 = #{pow_of_2})"
	>> end
	=> nil
	>> test_bytes(3, 6)
	Byes 2 (pow_of_2 = 8)
	=> nil
	>> test_bytes(3, 8)
	Byes 0 (pow_of_2 = 8)
	=> nil
	>> test_bytes(1, 2)
	Byes 0 (pow_of_2 = 2)
	=> nil

Bit shifting rounds places to the left appears to give us the power of two equal
to the number of players or just above.  Handy that.  With it we can just pull
off the number of players and we have a count of how many byes are needed.  Now
have another look at how this was put to use:

	  def seed; @seed ||= players + Array.new(nbyes, :bye); end

The seed() turns out to be an Array of players (on top) and byes (at the
bottom).  Given that, we know that seed().size() will be a power of two which is
an even number.  That tells us why the Array dividers didn't need to work with
odd counts.

It's all coming together.  Have one last peek at how the matchups are made:

	  def initialize(players)
	    raise "Tournament requires 2 or more players" if players.size < 2
	  
	    @players = players
	    @matches = (0...nrounds).inject(seed) do |(memo,)|
	      memo.top_half.zip(memo.bottom_half.reverse)
	    end
	  end

The entire tournament is arranged there with what gets my vote for the scariest
use of inject() I have ever seen.  The icky (memo,) construct is used to discard
the unused second value, which means inject() is pretty much a times() call
here, save that it updates the mutated Array at each step.  Here's a study of
what exactly is being constructed and a more verbose but hopefully easier to
understand way to write it:

  >> (0...3).inject([1, 2, 3, 4, 5, 6, :bye, :bye]) do |memo, unused|
  ?>   p memo
  >>   memo.top_half.zip(memo.bottom_half.reverse)
  >> end
  [1, 2, 3, 4, 5, 6, :bye, :bye]
  [[1, :bye], [2, :bye], [3, 6], [4, 5]]
  [[[1, :bye], [4, 5]], [[2, :bye], [3, 6]]]
  => [[[[1, :bye], [4, 5]], [[2, :bye], [3, 6]]]]
  >> matchups = [1, 2, 3, 4, 5, 6, :bye, :bye]
  => [1, 2, 3, 4, 5, 6, :bye, :bye]
  >> 3.times do
  ?>   p matchups
  >>   matchups = matchups.top_half.zip(matchups.bottom_half.reverse)
  >> end
  [1, 2, 3, 4, 5, 6, :bye, :bye]
  [[1, :bye], [2, :bye], [3, 6], [4, 5]]
  [[[1, :bye], [4, 5]], [[2, :bye], [3, 6]]]
  => 3
  >> matchups
  => [[[[1, :bye], [4, 5]], [[2, :bye], [3, 6]]]]

This shows the fascinating Array structure that gets built, nesting each round's
matchups.  I also tried to break down the operation into a more normal Ruby
construct.

At this point, we have the entire tournament planned out.  Now it's time to do
some drawing.

I'll stop clowning around with IRb at this point and just cover the code
normally.  I do think it's important to realize what a powerful tool of
exploration this can be though.  It's great to be able to segment out the
elements of code you don't understand and explore what it does by making a few
method calls.

How Marshall triggers the rendering code is more cleverness, but with Ruby this
time instead of math.  Let me refresh your memory:

	  attr_reader :matches
	  
	  def render(renderer = AsciiRenderer)
	    extend renderer
	    render_tournament
	  end

The matches() accessor and other utility methods provides all we need to render
results.  Marshall decides to use those as the methods supporting a rendering
mixin.  A call to render() then mixes the desired rendering Module into this
object and triggers the process.  This allows each tournament to use a different
renderer.

Here's the renderer included with the code for drawing ASCII charts:

	# ...
	
	module Tournament::AsciiRenderer
	  protected
	  def render_tournament
	    render_header.concat(render_rounds).join("\n")
	  end
	  
	  # ...

The end result, we can see, is just the headers plus each round.  Let's dip into
those rendering methods:

	  # ...
	  
	  private
	  def render_header
	    [ (1..nrounds).collect { |r| "R#{r}".ljust(width + 1) }.join,
	      ('=' * (nrounds * (width + 1))) ]
	  end
	  
	  # ...

The overall rendering process builds an Array of lines, which are join()ed as we
saw in render_tournament().  The lines here start the process off with a row of
round numbers and a row of equals signs to set them off from the content.

Then we get to round rendering, which is a little more involved:

	  # ...
	  
	  def render_rounds
	    render_match(matches.first)
	  end
	
	  def render_match(match)
	    unless match.kind_of? Array
	      draw = [ render_player(match), slot1 ]
	      (@flip = !@flip) ? draw : draw.reverse
	    else
	      draw = match.collect do |match_|
	        render_match(match_)
	      end.inject do |memo, draw_|
	        (memo << (' ' * memo.first.size)).concat(draw_)
	      end
	
	      fh = (draw.size - 3) / 4
	      sh = [ (draw.size + 1) / 4, 2 ].max
	      draw_ = [ [space]*sh, [flow]*fh, slot, [flow]*fh, [space]*sh ]
	      draw.zip(draw_.flatten).collect(&:join)
	    end
	  end
	
	  def render_player(player)
	    player.to_s.ljust(width)
	  end
	
	  def slot;  '|' << ('-' * width); end
	  def slot1;        ('-' * width); end
	  def flow;  '|' << (' ' * width); end
	  def space; ' ' << (' ' * width); end
	  
	  def width
	    @width ||= seed.collect { |x| x.to_s.size }.max;
	  end
	end
	
	# ...

The process begins in render_rounds() which strips an extra layer of nesting off
of matches() and makes a hand-off to render_match().

In render_match() the flow is split by a slightly confusing unless/else
construct.  Arrays (or rounds) are handled in the else clause, which recursively
renders each match and then joins the results together with enough slots()s,
flow()s, and space()s.  Strings and Symbols (or players) are handled in the
unless clause.  This is mainly just a delegation to render_player() and slot1(),
but the line order has to be reversed every other time to make even player names
list under the chart bar.

The width() is the helper we have seen used all through the rendering process to
determine field width which is just the longest player's name.  Note how the
value is cached here with the ||= operator, so it only has to be calculated the
first time.

All that remains is the code to start us off:

	# ...
	
	if __FILE__ == $0
	  puts Tournament.new(ARGV).render
	end

ARGV is assumed to be a list of player names in rank order and thus passed to
Tournament.new() to build the matches.  A call to render() generates the chart
which is dumped by puts().

Many of the solutions involved clever code in their own right, so don't forget
to look through them.  My thanks to all for giving us the fun code to play with
and to Marshall for teaching me some math.

Tomorrow we will tackle board setup for a Bobby Fischer created chess variant...

In This Thread

Prev Next