[#277137] executing VIM on a remote machine? — "Gian Holland" <gianmh@...>

Is is possible with ruby to execute vim on a remote machine to edit a file?

11 messages 2007/11/01

[#277159] Who required that!? — Trans <transfire@...>

Is there any way to ask a file what other file require/load 'd it? I

15 messages 2007/11/02
[#277180] Re: Who required that!? — "ara.t.howard" <ara.t.howard@...> 2007/11/02

[#277359] Unicode illegal characters problem — "Axel Etzold" <AEtzold@...>

Dear all,

16 messages 2007/11/03

[#277377] dragons and factorials (keyboard input) — Thufir <hawat.thufir@...>

I'm getting keyboard input successfully, but I'm getting a string. I

13 messages 2007/11/03

[#277385] x=[]; x[:bla][:some_key] does not work? — Joshua Muheim <forum@...>

Hi all

24 messages 2007/11/03

[#277517] Reading a class-file and calling it at runtime. — Miss Elaine Eos <Misc@...>

I'm trying to read-in a folder full of "plug-ins" and call each of them,

19 messages 2007/11/05
[#277534] Re: [n00b] Reading a class-file and calling it at runtime. — "Sean O'Halpin" <sean.ohalpin@...> 2007/11/05

On 11/5/07, Miss Elaine Eos <Misc@your-pants.playnaked.com> wrote:

[#277579] Re: Reading a class-file and calling it at runtime. — 7stud -- <bbxx789_05ss@...> 2007/11/05

Sean O'halpin wrote:

[#277615] Faking the refering page with Mechanize — Ehud Rosenberg <ehudros@...>

Hi,

13 messages 2007/11/06
[#277617] Re: Faking the refering page with Mechanize — Konrad Meyer <konrad@...> 2007/11/06

Quoth Ehud Rosenberg:

[#277719] Language Popularity - PHP vs Ruby? — Marc Heiler <shevegen@...>

Hi,

26 messages 2007/11/06
[#277773] Re: Language Popularity - PHP vs Ruby? — Ilan Berci <coder68@...> 2007/11/06

Marc Heiler wrote:

[#277881] Re: Language Popularity - PHP vs Ruby? — Alex Young <alex@...> 2007/11/07

Ilan Berci wrote:

[#277785] Re: JRuby performance questions answered — Isaac Gouy <igouy2@...>

Quoting Charles Oliver Nutter <charles.nutter / sun.com>:

23 messages 2007/11/06
[#277789] Re: JRuby performance questions answered — Roger Pack <rogerpack2005@...> 2007/11/06

[#278300] Re: JRuby performance questions answered — Roger Pack <rogerpack2005@...> 2007/11/09

[#278343] Re: JRuby performance questions answered — "Rick DeNatale" <rick.denatale@...> 2007/11/10

On 11/9/07, Roger Pack <rogerpack2005@gmail.com> wrote:

[#278385] Re: JRuby performance questions answered — "M. Edward (Ed) Borasky" <znmeb@...> 2007/11/10

Rick DeNatale wrote:

[#278397] Re: JRuby performance questions answered — Sean Surname <x3qh85202@...> 2007/11/10

M. Edward (Ed) Borasky wrote:

[#277797] Is there a "||" that treats "" also as false? — Joshua Muheim <forum@...>

Hi all

15 messages 2007/11/07

[#277900] a problem related string(250 score) — Johnson Wang <99100@163.com>

How to solve this problem in Ruby????

13 messages 2007/11/07

[#277931] Windows: Scheduled Ruby script won't run — bdezonia@...

Hello all,

12 messages 2007/11/07

[#277944] how to delete array — Surjit Nameirakpam <surjit.meitei@...>

Problem

21 messages 2007/11/07
[#277952] Re: how to delete array — "Leslie Viljoen" <leslieviljoen@...> 2007/11/07

On Nov 7, 2007 10:02 PM, Surjit Nameirakpam <surjit.meitei@gmail.com> wrote:

[#277954] Re: how to delete array — Surjit Nameirakpam <surjit.meitei@...> 2007/11/07

My business logic doesn't help me find which values i have to delete but

[#277955] Re: how to delete array — Surjit Nameirakpam <surjit.meitei@...> 2007/11/07

Surjit Nameirakpam wrote:

[#277980] alternate to case; generating a list of sub-classes — Thufir <hawat.thufir@...>

The below uses pseudo-random number generation to populate an array

11 messages 2007/11/07

[#278070] local variables, eval, and parsing — furtive.clown@...

17 messages 2007/11/08
[#278076] Re: local variables, eval, and parsing — furtive.clown@... 2007/11/08

val = 44

[#278089] Re: local variables, eval, and parsing — Randy Kramer <rhkramer@...> 2007/11/08

On Thursday 08 November 2007 11:25 am, furtive.clown@gmail.com wrote:

[#278099] Re: local variables, eval, and parsing — furtive.clown@... 2007/11/08

On Nov 8, 1:10 pm, Randy Kramer <rhkra...@gmail.com> wrote:

[#278130] Re: local variables, eval, and parsing — Randy Kramer <rhkramer@...> 2007/11/08

On Thursday 08 November 2007 01:45 pm, furtive.clown@gmail.com wrote:

[#278120] 'Class.inherited' v. 'inherited' syntax inside Class — 7stud -- <bbxx789_05ss@...>

How come when you redefine the inherited method in Class, you don't use

12 messages 2007/11/08

[#278171] Ruby/Fastcgi going into uninterruptible after random periods of time — "nate" <ruby@...>

Hello there -

11 messages 2007/11/09

[#278226] Current Quizmaster Retiring — James Edward Gray II <james@...>

When I started the Ruby Quiz project, I made some off-hand comment

28 messages 2007/11/09

[#278271] enterprise ruby — Roger Pack <rogerpack2005@...>

I am thinking of doing a 'side by side' distro of Ruby that includes the

50 messages 2007/11/09
[#278276] Re: enterprise ruby — Robert Klemme <shortcutter@...> 2007/11/09

On 09.11.2007 21:28, Roger Pack wrote:

[#278305] Re: enterprise ruby — Lionel Bouton <lionel-subscription@...> 2007/11/10

Robert Klemme wrote the following on 09.11.2007 22:05 :

[#278415] Re: enterprise ruby — Charles Oliver Nutter <charles.nutter@...> 2007/11/11

Lionel Bouton wrote:

[#278592] Re: enterprise ruby — Jay Levitt <jay+news@...> 2007/11/12

On Sun, 11 Nov 2007 22:32:14 -0500, M. Edward (Ed) Borasky wrote:

[#278616] Re: enterprise ruby — "M. Edward (Ed) Borasky" <znmeb@...> 2007/11/12

Jay Levitt wrote:

[#278310] equivalent injecting implementations? — Trans <transfire@...>

Are these strictly equivalent? I get the feeling no, but I haven't

14 messages 2007/11/10
[#278344] Re: equivalent injecting implementations? — "Rick DeNatale" <rick.denatale@...> 2007/11/10

On 11/9/07, Trans <transfire@gmail.com> wrote:

[#278354] The Man or Boy Recursion Test — Werner <wdahn@...>

Hello,

17 messages 2007/11/10
[#278392] Re: The Man or Boy Recursion Test — Tim Hunter <TimHunter@...> 2007/11/10

Werner wrote:

[#278410] Re: The Man or Boy Recursion Test — Lloyd Linklater <lloyd@2live4.com> 2007/11/10

Tim Hunter wrote:

[#278453] Re: The Man or Boy Recursion Test — Tim Hunter <TimHunter@...> 2007/11/11

Lloyd Linklater wrote:

[#278458] Re: The Man or Boy Recursion Test — "Rick DeNatale" <rick.denatale@...> 2007/11/11

On Nov 11, 2007 9:21 AM, Tim Hunter <TimHunter@nc.rr.com> wrote:

[#278413] ruby-1.8.6-p111 build on osx 10.5.0 fails; ok on 10.4.10. bug or config? — snowcrash+rubytalk <schneecrash+rubytalk@...>

hi,

11 messages 2007/11/11
[#278447] Re: ruby-1.8.6-p111 build on osx 10.5.0 fails; ok on 10.4.10. bug or config? — "Laurent Sansonetti" <laurent.sansonetti@...> 2007/11/11

On Nov 11, 2007 1:27 AM, snowcrash+rubytalk

[#278539] comp.lang.fortran challenge — Bil Kleb <Bil.Kleb@...>

Having Ruby fun with the comp.lang.fortran folks:

14 messages 2007/11/12

[#278575] does Ruby has method properties — Thilina Buddhika <thilinamb@...>

In java script it is possible to something like this,

16 messages 2007/11/12

[#278643] alias_method :tap, :affect — Josh Susser <josh@...>

46 messages 2007/11/12
[#278652] Re: alias_method :tap, :affect — "Rick DeNatale" <rick.denatale@...> 2007/11/12

On Nov 12, 2007 12:58 PM, Josh Susser <josh@hasmanythrough.com> wrote:

[#278657] Re: alias_method :tap, :affect — furtive.clown@... 2007/11/12

[#278663] Re: alias_method :tap, :affect — "Martin DeMello" <martindemello@...> 2007/11/12

On Nov 12, 2007 11:10 AM, <furtive.clown@gmail.com> wrote:

[#278675] Re: alias_method :tap, :affect — furtive.clown@... 2007/11/12

On Nov 12, 2:31 pm, Martin DeMello <martindeme...@gmail.com> wrote:

[#278678] Re: alias_method :tap, :affect — James Edward Gray II <james@...> 2007/11/12

On Nov 12, 2007, at 2:40 PM, furtive.clown@gmail.com wrote:

[#278685] Re: alias_method :tap, :affect — furtive.clown@... 2007/11/12

On Nov 12, 3:55 pm, James Edward Gray II <ja...@grayproductions.net>

[#278688] Re: alias_method :tap, :affect — James Edward Gray II <james@...> 2007/11/12

On Nov 12, 2007, at 3:25 PM, furtive.clown@gmail.com wrote:

[#278691] Re: alias_method :tap, :affect — furtive.clown@... 2007/11/12

On Nov 12, 4:37 pm, James Edward Gray II <ja...@grayproductions.net>

[#278692] Re: alias_method :tap, :affect — James Edward Gray II <james@...> 2007/11/12

On Nov 12, 2007, at 4:20 PM, furtive.clown@gmail.com wrote:

[#278693] Re: alias_method :tap, :affect — furtive.clown@... 2007/11/12

On Nov 12, 5:25 pm, James Edward Gray II <ja...@grayproductions.net>

[#278695] Re: alias_method :tap, :affect — James Edward Gray II <james@...> 2007/11/12

On Nov 12, 2007, at 4:35 PM, furtive.clown@gmail.com wrote:

[#278705] Re: alias_method :tap, :affect — furtive.clown@... 2007/11/12

>

[#278706] Re: alias_method :tap, :affect — James Edward Gray II <james@...> 2007/11/12

On Nov 12, 2007, at 5:30 PM, furtive.clown@gmail.com wrote:

[#278708] Re: alias_method :tap, :affect — furtive.clown@... 2007/11/12

On Nov 12, 6:39 pm, James Edward Gray II <ja...@grayproductions.net>

[#278710] Re: alias_method :tap, :affect — Raul Parolari <raulparolari@...> 2007/11/13

unknown wrote:

[#278742] Yielding an object and caring about the result: the cousin of Object#tap — furtive.clown@...

The idea of Object#tap is to insert a "listener" (like tapping a phone

36 messages 2007/11/13
[#278744] Re: Yielding an object and caring about the result: the cousin of Object#tap — furtive.clown@... 2007/11/13

[#278853] Re: Yielding an object and caring about the result: the cousin of Object#tap — "ara.t.howard" <ara.t.howard@...> 2007/11/13

[#278864] Re: Yielding an object and caring about the result: the cousin of Object#tap — furtive.clown@... 2007/11/13

Ara,

[#278884] Re: Yielding an object and caring about the result: the cousin of Object#tap — -a <ara.t.howard@...> 2007/11/13

[#278981] Re: Yielding an object and caring about the result: the cousin of Object#tap — furtive.clown@... 2007/11/14

Let's compare them again. I changed some variable names which will

[#278840] Why are so many people confused about "Enterprise" software? — "Kyle Schmitt" <kyleaschmitt@...>

Really, why are so many people confused about "Enterprise" software,

10 messages 2007/11/13

[#278871] Ordered Hash Usefulness — "Devi Web Development" <devi.webmaster@...>

On Nov 12, 2007 7:56 AM, James Edward Gray II <james@grayproductions.net> wrote:

19 messages 2007/11/13

[#278878] recursion with blocks — Mike Perham <mperham@...>

I have a tree structure where I want to walk the structure and find a

13 messages 2007/11/13

[#278928] rails incredibly slow (update) — Ron Jeffries <ronjeffries@...>

After 24 minutes of waiting, the Welcome Aboard window came up in my

75 messages 2007/11/14
[#278936] Re: rails incredibly slow (update) — Ron Jeffries <ronjeffries@...> 2007/11/14

On Tue, 13 Nov 2007 23:22:29 -0500, Mohit Sindhwani

[#279008] ruby incredibly slow (update 2) — Ron Jeffries <ronjeffries@...> 2007/11/14

On Wed, 14 Nov 2007 11:42:17 -0500, Tanner Burson

[#279418] Re: ruby incredibly slow (update 2) — Ron Jeffries <ronjeffries@...> 2007/11/17

On Fri, 16 Nov 2007 07:51:51 -0500, Bob Hutchison <hutch@recursive.ca>

[#279710] Re: ruby incredibly slow (update 2) — Bob Hutchison <hutch@...> 2007/11/19

[#279121] webrick alternative — Michael Conrad <list-ruby@...>

Hi,

20 messages 2007/11/15

[#279241] Alternative Ruby grammar — Markus Liedl <m.liedl@...>

I have spent the last months to write an alternative Ruby grammar now

23 messages 2007/11/16

[#279263] meta-class subclass relationships — Greg Weeks <greg.weeks@...>

Ruby exposes its singleton meta-classes, eg:

16 messages 2007/11/16
[#279288] Re: meta-class subclass relationships — "David A. Black" <dblack@...> 2007/11/16

Hi --

[#279347] Goedel (#147) — Ruby Quiz <james@...>

The three rules of Ruby Quiz:

21 messages 2007/11/16

[#279360] "instance_eval" (eg, sent to a class object) — Greg Weeks <greg.weeks@...>

I've poked around, but I don't get instance_eval at all.

11 messages 2007/11/16

[#279419] Composition: Build objects from other objects — Thufir <hawat.thufir@...>

<http://www.javaworld.com/javaworld/jw-06-2001/jw-0608-java101.html> has

22 messages 2007/11/17

[#279539] Five Top programming Languages — bicomplex@...

Five Top programming Languages

15 messages 2007/11/18

[#279564] GUI and ruby — ulazar <ulazar@...>

I would like to create an interface GUI with ruby. What I have to use? I

17 messages 2007/11/18

[#279642] Open-ended ranges? — Clifford Heath <no@...>

Folk,

21 messages 2007/11/19

[#279670] False positives in editing data — RichardOnRails <RichardDummyMailbox58407@...>

Hi All,

39 messages 2007/11/19

[#279671] Is there an equivalent in irb to command: history in bash? — Stephen Bannasch <stephen.bannasch@...>

Is there an equivalent in irb to the command history in bash?

11 messages 2007/11/19
[#279675] Re: Is there an equivalent in irb to command: history in bash? — Chris Shea <cmshea@...> 2007/11/19

On Nov 18, 10:44 pm, Stephen Bannasch <stephen.banna...@deanbrook.org>

[#279738] Read last line of a file — Shuaib Zahda <shuaib.zahda@...>

Hi all

17 messages 2007/11/19

[#279822] RubyGems 0.9.5 — Eric Hodel <drbrain@...7.net>

RubyGems 0.9.5 adds several new features and fixes several bugs.

56 messages 2007/11/20
[#279841] Re: RubyGems 0.9.5 — Michael Greenly <mgreenly@...> 2007/11/20

I got caught by some "tired at the end of the day" stupidity...

[#279903] Re: RubyGems 0.9.5 — "Rick DeNatale" <rick.denatale@...> 2007/11/20

On Nov 20, 2007 12:53 AM, Michael Greenly <mgreenly@gmail.com> wrote:

[#279907] Re: RubyGems 0.9.5 — Michael Greenly <mgreenly@...> 2007/11/20

Rick Denatale wrote:

[#279921] Re: RubyGems 0.9.5 — "M. Edward (Ed) Borasky" <znmeb@...> 2007/11/20

Michael Greenly wrote:

[#279928] Re: RubyGems 0.9.5 — "Austin Ziegler" <halostatue@...> 2007/11/20

On 11/20/07, M. Edward (Ed) Borasky <znmeb@cesmail.net> wrote:

[#279935] Re: RubyGems 0.9.5 — Michael Greenly <mgreenly@...> 2007/11/20

Austin Ziegler wrote:

[#280023] Re: RubyGems 0.9.5 — Eric Hodel <drbrain@...7.net> 2007/11/20

On Nov 20, 2007, at 08:18 , Michael Greenly wrote:

[#280086] Re: RubyGems 0.9.5 — Sylvain Joyeux <sylvain.joyeux@...> 2007/11/21

On Wed, Nov 21, 2007 at 08:09:18AM +0900, Eric Hodel wrote:

[#280119] Re: RubyGems 0.9.5 — "Austin Ziegler" <halostatue@...> 2007/11/21

On 11/21/07, Sylvain Joyeux <sylvain.joyeux@polytechnique.org> wrote:

[#279870] eigenvalues, eigenvectors in Ruby ??? — unbewusst.sein@... (Une B騅ue)

40 messages 2007/11/20

[#279877] read, write, seek method in a ring buffer class — Martin Durai <martin@...>

Could any body help me with creating a ring buffer class using a string.

12 messages 2007/11/20

[#279887] is there an nicer way for this expression? — Remco Hh <remco@...>

hi,

18 messages 2007/11/20

[#279896] Choosing a scripting language for scientific programming — deltaquattro <deltaquattro@...>

Hi,

14 messages 2007/11/20

[#279940] AJAX without Rails — Miki Vz <mikisvaz@...>

Hi, I'm pretty new to Ajax.

24 messages 2007/11/20
[#279953] Re: AJAX without Rails — Miki Vz <mikisvaz@...> 2007/11/20

Actually, I'm not sure I'm using eruby, I'm using mod_ruby and

[#279961] Re: AJAX without Rails — Deepak Vohra <dvohra09@...> 2007/11/20

http://www.regdeveloper.co.uk/2007/01/15/ajax_rails_tutorial/

[#279963] Re: AJAX without Rails — Miki Vz <mikisvaz@...> 2007/11/20

Isn't this precisely a rails tutorial? I'm trying not to use rails,

[#279967] Re: AJAX without Rails — Deepak Vohra <dvohra09@...> 2007/11/20

Ruby on Rails is the only Ajax framework for Ruby.

[#279984] Packet : A Pure Ruby Library for Event Driven Network Programming — hemant <gethemant@...>

Hi Folks,

11 messages 2007/11/20

[#280005] Ruby Tool Survey — Tim Bray <Tim.Bray@...>

I'm running a survey to find out what tools Ruby and Rails people

24 messages 2007/11/20

[#280091] porting java methods to ruby — Martin Durai <martin@...>

could any one help me out to solve this.

19 messages 2007/11/21

[#280232] How to give depth to arrays? — Chris Morales <primo.tertio@...>

Hi,

12 messages 2007/11/22

[#280316] Checking whether a string is a number in disguise? — Peter Bunyan <peter.bunyan@...>

I'm working on an RPN calculator (don't ask why...) and I'm having

10 messages 2007/11/22

[#280521] Iterating through class names using a block — Ge Bro <boomstik@...>

Hey all,

14 messages 2007/11/24

[#280542] Convert words to numbers and back? — Jordon Bedwell <jordon@...>

I was wondering if somebody could give me some insight and help on how

10 messages 2007/11/24

[#280645] Moving files matching Regex — Mark Woodward <markonlinux@...>

Hi all,

16 messages 2007/11/25

[#280664] specify start postion of Regexp matching — makoto kuwata <kwa@...>

Hi, all.

16 messages 2007/11/25

[#280670] Creating a rubygem - a story and help request — Phrogz <phrogz@...>

The Story

11 messages 2007/11/25

[#280708] European Ruby Conference 2008 in Prague, Czech Republic? — Karel Minařík <karel.minarik@...>

Hi all,

13 messages 2007/11/25

[#280818] Removing duplicates and substrings from an array — "Sam Larbi" <slarbi@...>

I've got an array of strings, say like:

12 messages 2007/11/26

[#280901] Most elegant way to do this? — rbysamppi@...

Are there any more elegant, concise, pithy, and more Rubyish ways of

31 messages 2007/11/27

[#280905] Bizarre Floating point errors in Ruby? Serious bug? — space.ship.traveller@...

Hi,

16 messages 2007/11/27

[#280921] FEATURE SUGGESTION: Accept default value for to_f and to_i — Mr Magpie <gazmcgheesubs@...>

I suggest that to_i() and to_f() have an optional parameter added with

13 messages 2007/11/27

[#280923] Ruby on OLPC?? — "M. Edward (Ed) Borasky" <znmeb@...>

I've been seriously considering the One Laptop Per Child Give One Get

25 messages 2007/11/27

[#280947] Re: "Why I Program In Ruby (And Maybe Why You Shouldn't)" — Raul Parolari <raulparolari@...>

Trollen Lord wrote:

36 messages 2007/11/27
[#281035] Re: "Why I Program In Ruby (And Maybe Why You Shouldn't)" — MonkeeSage <MonkeeSage@...> 2007/11/27

On Nov 27, 11:42 am, Trollen Lord <trollenl...@gmail.com> wrote:

[#281081] Re: "Why I Program In Ruby (And Maybe Why You Shouldn't)" — MonkeeSage <MonkeeSage@...> 2007/11/27

On Nov 27, 3:24 pm, Trollen Lord <trollenl...@gmail.com> wrote:

[#281012] Accessing a file server with ruby — Anthony <improvcornartist@...>

This seems like it should be a simple solution, but I don't know

15 messages 2007/11/27

[#281157] Equivalent for unix "read" command in rake tasks? — Rob Lucas <roblucas@...>

Hi,

10 messages 2007/11/28

[#281174] Ruby needs continuations... — "Just Another Victim of the Ambient Morality" <ihatespam@...>

Warning: I don't really know what I'm talking about so if I make any

26 messages 2007/11/28

[#281224] Im trying to make Thumbnail pics -- any suggestions? — wiz_pendases@...

Im trying to make Thumbnail pics -- any suggestions? (dont know wher

10 messages 2007/11/28

[#281273] Custom Protocol — thefed <fedzor@...>

I understand that I've asked a similar question that of custom packets.

16 messages 2007/11/28

[#281295] Creating Databases in Ruby — "Will Mueller" <will.liljon@...>

Hello All,

12 messages 2007/11/29

[#281331] Hash Sorting — Nathan Viswa <nathanv@...>

Can not understand how the block after sort works! Need help. thanks.

25 messages 2007/11/29

[#281385] Negate a character sequence in a regular expression? — crm_114@...

For the following string:

12 messages 2007/11/29

[#281432] when 1.9.0 will be released? — sayoyo Sayoyo <sayoyo@...>

Hi, does someone know when the 1.9.0 will be released?

17 messages 2007/11/30

[#281478] Postfix to Infix (#148) — Ruby Quiz <james@...>

The three rules of Ruby Quiz:

45 messages 2007/11/30

[#281519] Unicode in Regex — Greg Willits <lists@...>

This is mostly a Ruby thing, and partly a Rails thing.

33 messages 2007/11/30

[SUMMARY] Vehicle Counters (#146)

From: Ruby Quiz <james@...>
Date: 2007-11-15 12:56:16 UTC
List: ruby-talk #279103
This is a cool little data mining problem.  Unfortunately, it is a fair bit of
work to get a good solution.  Justin Either sent in the only full solution and
even he chose to cut a few corners.  His code does produce almost 200 lines of
interesting feedback when run on the sample data set though, so it's fun to play
around with.  The downside is that it's close to 300 lines of code.  Because of
that, I'm going to try giving a pretty high-level overview of how it works.

Let's work backwards this time and just follow the code:

	# ...
	
	if ARGV.size < 1
	  puts "Usage: vehicle_counter.rb datafile [-avg]"
	else
	  vc = VehicleCounter.new
	  vc.process(ARGV[0], ARGV[1] != nil)
	end

This is the code that actually gets executed when you run the program.  I always
call that the application code.

Here we see a simple branch that either presents a usage message or builds a
VehicleCounter and calls process() on it.  This could actually be just a module,
since it doesn't maintain any state.  It may help you to think of the following
code that way:

	# ...
	
	class VehicleCounter
	  # ...
	  
	  def process(file, report_averages)
	    raw_data = parse(file)
	    for sensor in 0..1 
	      sensor_report = DirectionDataReport.new(raw_data[sensor])
	      sensor_report.report(sensor, report_averages)
	    end
	  end
	  
	  # ...
	end
	
	# ...

This defines the overall process of this program which is just two steps:  read
in the data and build a report.  The parse() method manages the reading step
while reporting is encapsulated in DirectionDataReport objects.  We will begin
with the reading:

	  # ...
	  
	  Dir_A = 0
	  Dir_B = 1
	  
	  def parse(file)
	    times = []
	    dirs = [[], []]
	    
	    f = File.open(file)
	    f.each_line do |line|
	      sensor, time = parse_record(line)
	      times << time
	      
	      if (times.size % 2) == 0
	        if (times.size == 2 and sensor == Dir_A) or
	           (times.size == 4 and sensor == Dir_B)
	           
	           # Remove "B" records from second direction
	           times = [times[0], times[2]] if sensor == Dir_B
	           
	           dirs[sensor] << times
	           times = []
	         elsif (times.size == 4 and sensor != Dir_B)
	          puts "Parse error"
	          times = []
	         end
	      elsif (times.size % 2) == 1 and sensor == Dir_B
	        puts "Parse error - Unexpected B record"
	      end
	    end
	    f.close
	    
	    dirs
	  end
	  
	  def parse_record(data)
	    unpacked = data.unpack("a1a*")
	    return unpacked[0] == "A" ? Dir_A : Dir_B, unpacked[1].to_i
	  end
	  
	  # ...

This parser is what I meant by cutting corners earlier.  The data provided is
quite simple and you don't have to worry about cars going both directions at the
same time when working with it.  Given that, a pair of A times is a northbound
car and a set of A, B, A, B times is a southbound car.  This parse just hunts
for those sets.

Both sets of times are maintained in the Array of Arrays called dirs.  The
constants are used to select the right group based on the indicator found in
unpack()ing the last record of the group.  These two Arrays are the ultimate
results of this method.

Note that the file reading loop could be reduced to a File.foreach() call.

The rest of the code is reporting.  We saw a DirectionDataReport initialized in
the process() method and then witnessed a call to report() on that object. 
These two steps are the primary interface:

	MSecPerMin = 1000 * 60
	MSecPerHour = MSecPerMin * 60
	InchesPerMile = 63360
	
	class DirectionDataReport
	  Verbose = false
	  Sensors = %w(Northbound Southbound)
	  Days = %w(Mon Tue Wed Thu Fri Sat Sun)
	  
	  def initialize(raw_data)
	    @raw_data = raw_data
	  end
	  
	  def report(sensor, report_averages)
	    puts "Direction: #{Sensors[sensor]}"
	    puts "Total Cars: #{self.total_count}"
	    
	    report_time_periods(sensor, report_averages, MSecPerHour * 12)
	    report_time_periods(sensor, report_averages, MSecPerHour)
	    report_time_periods(sensor, report_averages, MSecPerHour / 2)
	    report_time_periods(sensor, report_averages, MSecPerHour / 4)
	    puts ""
	  end
	  
	  def total_count()
	    @raw_data.size
	  end
	  
	  # ...

You can see here that the constructor just squirrels away the data from the
parse.  The report() method, on the other, hand drives the output process. 
After reporting the direction and a total car count, it displays time oriented
breakdowns for various scales:  12 hours, one hour, 30 minutes, and 15 minutes.

Here is the report_time_periods() method and three of the methods it relies on:

	  # ...
	  
	  def report_time_periods(sensor, report_averages, time_period_length)
	    days = create_time_periods(time_period_length)
	    num_time_periods = (MSecPerHour * 24) / time_period_length
	
	    counts = count_per_time_period(days)
	    avg_speeds = speed_per_time_period(days)
	    avg_dists = dist_per_time_period(days)
	    
	    puts("\nTime Interval: #{time_period_length/MSecPerMin} Minutes")
	    if (num_time_periods > 2)
	      peaks = find_peak_times(days)
	      puts("Peak Times")
	      for i in 0...peaks.size
	        printf("#{Days[i]}:")
	        peaks[i].size.times {|p|
	          printf(format_time_interval_index(peaks[i][p][1],
	                                            time_period_length))
	        }
	        puts ""
	      end
	    end
	    
	    puts("Statistics")
	    printf("Data    ")
	    printf("\tDay") if not report_averages
	    
	    num_time_periods.times{|i|
	      printf(format_time_interval_index(i, time_period_length))
	    } 
	    report_column_data(days, num_time_periods, report_averages, counts,
	                       report_averages ? "Avg Count" : "Count    ", "% 5d")
	    report_column_data(days, num_time_periods, report_averages, avg_speeds,
	                       "Avg Speed", "%02.02f")
	    report_column_data(days, num_time_periods, report_averages, avg_dists,
	                       "Avg Dist ", "%02.02f")
	    puts ""
	  end
	  
	  def create_time_periods(time_period_length = MSecPerHour)
	    days = []
	    time_periods = nil
	    prev_start = @raw_data[0][0] + 1
	    
	    for data in @raw_data
	      if prev_start > data[0]
	        days << time_periods if time_periods != nil
	        
	        cur_time_period = 0
	        time_periods = [[]]
	        
	        puts "New day: data=#{data[0]}" if Verbose
	      elsif data[0] > ((cur_time_period + 1) * time_period_length)
	        while data[0] > ((cur_time_period + 1) * time_period_length)
	          cur_time_period += 1
	          time_periods[cur_time_period] = []
	        end
	        
	        puts "New time period: data=#{data[0]}" if Verbose
	      end
	      
	      time_periods[cur_time_period] << data
	      prev_start = data[0]
	    end
	    
	    days << time_periods
	    days
	  end
	  
	  def format_time_interval_index(index, time_period_length)
	    sprintf("\t%02d:%02d", 
	        index * time_period_length / MSecPerHour,
	        (index * time_period_length / MSecPerMin) % 60)
	  end
	  
	  def report_column_data(days, num_time_periods, report_averages, data,
	                         data_label, format_string)
	    if report_averages
	      printf("\n#{data_label}")
	      for time in 0...num_time_periods
	        avg = 0
	        days.size.times {|day| avg += data[day][time] }
	        printf("\t#{format_string}", avg / days.size)          
	      end
	    else
	      for day in 0...days.size
	        printf("\n#{data_label}\t#{Days[day]}")
	        for time in 0...num_time_periods
	          printf("\t#{format_string}", data[day][time])
	        end
	      end
	    end
	  end
	  
	  # ...

There is a lot of code here obviously, but none of it is very complex.  First,
report_time_periods() breaks the data down into time intervals using
create_time_periods().  That method is just a partition tool for the data.  Once
it's divided out, a few utility method we will examine next are used to separate
the interesting information out.

After that, the entire rest of the of the method is printing code for what it
found.  (The peak data section actually calculates, again using another helper,
and prints for appropriate data ranges.)  Most of the print work is delegated to
the bottom two methods and much or their magic is for printing columnar data.

Here are the helpers I glossed over and the helpers they rely on:

	  # ...
	  
	  def find_peak_times(days, num_peaks=4)
	    days.map do |day| 
	      find_daily_peak_times(day, num_peaks)
	    end
	  end
	  
	  def find_daily_peak_times(daily_time_periods, num_peaks)
	    peaks = []
	    daily_time_periods.size.times {|i|
	      peaks << [daily_time_periods[i].size, i]
	    }
	    peaks.sort.reverse.slice(0, num_peaks).sort {|a,b| a[1]<=>b[1]}
	  end
	  
	  def count_per_time_period(days)
	    days.map do |day|
	      day.map {|time_period| time_period.size}
	    end
	  end
	  
	  def speed_per_time_period(days)
	    days.map do |day| 
	      day.map {|time_period| calc_average_speed(time_period) } 
	    end
	  end
	
	  def dist_per_time_period(days)
	    days.map do |day| 
	      day.map {|time_period| calc_average_distance(time_period) } 
	    end
	  end  
	  
	  def calc_average_speed(time_period)
	    return 0 if time_period.size == 0
	    
	    sum = 0    
	    for time in time_period
	      sum += calc_speed(time[0], time[1])
	    end    
	    sum / (time_period.size)
	  end
	
	  def calc_speed(start_time, end_time)
	    return (100.0 / (end_time - start_time)) *
	           MSecPerHour / (InchesPerMile * 1.0) 
	  end  
	  
	  def calc_average_distance(time_period)
	    return 0 if time_period.size <= 1 # Need at least 2 cars
	    sum = 0
	    for i in 0...(time_period.size - 1)
	      sum += calc_distance(time_period[0], time_period[1])
	    end
	    return sum / (time_period.size - 1)
	  end
	
	  def calc_distance(leader_time, follower_time)
	    follower_speed = calc_speed(follower_time[0], follower_time[1])
	    
	    dist = follower_speed * ((follower_time[0] - leader_time[0]) /
	           (MSecPerHour * 1.0))
	    
	    return dist
	  end
	end
	
	# ...

There are three kinds of helpers here.  The peak methods just sort the data and
take so many entries off the top.  The *_per_time_period() method are wrappers
that apply the calc_*() methods over periods of data.  Which means the calc_*()
methods are where the action is.  They figure out car speeds, distances between
cars, and the averages for both using simple math.  This is the primary data
that we see in the report output.

Again it's a lot of code to cover, but Justin has produced a great end result. 
I'm not going to include the output here because it too is large, but go run the
program and take a look at what it builds.

My thanks to Justin for the heroic effort and Gavin for the interesting problem.

The Ruby Quiz began with an encoding problem that came out of a book and
tomorrow we have another one for you...

In This Thread

Prev Next