http://www.rubyweeklynews.org/20050529.html

   Ruby Weekly News 23rd - 29th May 2005
   -------------------------------------

   Ruby Weekly News is a summary of the week's activity on the ruby-talk
   mailing list / the comp.lang.ruby newsgroup, brought to you by
   Tim Sutherland.

Articles and Announcements
--------------------------

     * Rails Day Registration is Now Open!
       -----------------------------------

       Lucas Carlson announced "If you want your chance at thousands of
       dollars of prizes for one day's work with Rails, please register
       soon".

       Rails Day is a competition that gives you 24 hours to write the best
       web application you can, using Ruby on Rails. You can do it
       individually or as part of a two or three person group.

       It's all on June 4th (hurry!)

       Judges include Rails creator David Heinemeier Hansson and the
       co-author of `The Pragmatic Programmer' and `Programming Ruby', Dave
       Thomas.

     * 2005 ICFP Programming Contest
       -----------------------------

       Robby Findler announced that the 2005 Programming Contest of the
       International Conference on Functional Programming was just four weeks
       away.

       "This year's competition rewards programmers who can plan ahead. As
       before, we'll announce a problem and give you three days to solve it.
       Two weeks later, we'll announce a change to the problem specification
       and give you one day to adapt your program to the new spec. And you
       guessed it: the second half will be worth considerably more than the
       first."

     * Rail Beta Book now available
       ----------------------------

       Dave Thomas released the beta version of the Rails book he is
       co-writing; `Agile Web Development with Rails'.

       "This is basically a pre-copyedit, pre-layout version of the book,
       available as a PDF. Buy it now (either as a straight PDF or as a
       combo-pack with the paper book) and we'll ship you the Beta PDF now,
       then ship you the final PDF (along with the paper book if you ordered
       it) when the book is finished (around the first of August)."

Quote of the Week
-----------------

   Matz explaining POLS (Principle of Least Surprise).

   This acronym was often in the past used by Rubyists to cheerfully declare
   that language design decisions were resolved simply by determining which
   option was the `least surprising'.

   POLS has since become notorious for generating long, futile threads where
   someone with a background in one language argues that a feature should
   behave in a certain way (since that's the way the other language does it,
   that is the `least surprising' way to them). Of course, someone with a
   different background would then say `actually, I think the following would
   be the least surprising', and the thread spirals onwards.

   The quote itself:

    | Since someone will surprise for any arbitrary choice, it is impossible
    | to satisfy "least surprise" in his sense. The truth is two folds: a)
    | when there are two or more choices in the language design decision, I
    | take the one that makes _me_ surprise least. b) as a result, you will
    | have less surprise in Ruby than other languages, once you have
    | accustomed to it.
    |
    | But I'm tired of explaining POLS again and again. I haven't even used it
    | first. I hope no one will use the term "POLS" any more to sell Ruby.
    | It's free after all.

   Matz' comment was inspired by the thread
   'A different perspective on Ruby' which comments on a rant by Eric Will.
   (Warning: Rant contains a lot of swearing.)

   The rant listed a number of things that Eric didn't find `least
   surprising' - "So much for POLS ... So much for POLS ... So much for
   POLS."

   How about Language Agreeing with Matz' Expectations? Then people can
   complain that that Ruby isn't LAME :-)

Link of the Week
----------------

   Link of the Week: "Anarchaia" by Christian Neukirchen.

   A blog, sort of. (But mostly not.) It's an intermingling cascadra of
   links, quotes, images and thoughts all racing down the page (and down,
   down, down - it's very long, you see.)

   The #ruby-lang IRC channel is regularly quoted, as are other
   interesting-to-programmer places. It's freaking crazy awesome, man.

   Rubyists may know Christian from his Ruby projects,
     - RubyPants smart-quotes library
     - a Real Life Markup Language (RLML) parsing library
     - Nukumi static blogging system (and now Nukumi2)
     - slider, a "cool application launch bar"


   (Please send in your suggestions for the next Link of the Week.)

Threads
-------

   Interesting threads included:

  Useless hack of the saturday morning
  ------------------------------------

   gabriele renzi found a "nifty" piece of Perl code. He translated it into
   Ruby, the magic part of which was implementing the gather and take
   functions of Perl 6.

   gather-take is used to construct an array in the following way; gather
   takes a block and returns an array. Within the block, every time take is
   called it adds its argument to the array.

   Example:

 p gather {
   take 1
   take 2
   take 3
 }
 # -> [1, 2, 3]

   The above is equivalent to

 arr = []
 arr << 1
 arr << 2
 arr << 3
 p arr
 # -> [1, 2, 3]

   The difference is that the first example doesn't need to explicitly
   declare the array.

   gabriele's implementation:

 class Gatherer
   attr :gathered
   def take(arg)
     @gathered||=[]
     @gathered<< arg
   end
 end

 def gather &blk
   c=Gatherer.new
   c.instance_eval &blk
   c.gathered
 end

   Pay close attention to how he calls instance_eval on a block. That causes
   the block to be evaluated such that self inside the block is c, rather
   than the self from the lexical scope of the block definition.

   The result is that when the code inside the block calls take, it is c.take
   that is called.

   Christian Neukirchen (familiar name) thought it looked useful, but was
   concerned about unintended effects of the instance_eval. (It all goes
   horribly wrong, for example, if your block refers to instance variables or
   methods.)

   He suggested using Dynamic Variables instead.

   Chris also noted that gather-take is available in the GOO programming
   language, where it is known by packing-pack.

  preventing Object#send from dispatching to a global method?
  -----------------------------------------------------------

   Francis Hwang outlined the following snippet of code -

 def something; end

 class SomeClass
   def method_missing( sym, *args ) .... do magic; end
 end

   and asked if it is possible to make SomeClass.new.something call
   SomeClass#method_missing instead of the `global method' something. (Such
   methods are added to Object, and are therefore available to all objects by
   default.)

   Bertram Scharpf gave:

 class SomeClass
   undef :something
 end

   Jim Weirich suggested Francis look at the code in Builder::BlankSlate
   (part of the Builder for Markup library). It provides a class whose only
   methods are __send__ and __id__. It also uses undef.

   itsme213 said that this could all have been avoided if only `global
   methods' in Ruby were singletons of the main object, rather than additions
   to the Object class.

  a deepcopy for "array = [1,2,3]*5"?
  -----------------------------------

   Boris asked "What way would you create an array that contains 5 copies of
   an array, without the copies interfering with each other?"

   He had tried

 array = [[1,2,3]]*5
 # ->  [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]

   However the result is 5 references to the same array:

 array[1][1] = "a"
 # -> [[1,"a",3],[1,"a",3],[1,"a",3],[1,"a",3],[1,"a",3]]

   Brian Schr?der said he should simply use

 array = Array.new(5) { [1, 2, 3] }

   That creates an Array of 5 values. They are initialised by calling the
   block 5 times, which results in 5 different array objects.

  Making a scripting tutorial
  ---------------------------

   Vincent Foley would like to present Ruby to the Linux Users Group he
   attends, in Quebec. The audience is mostly system administrators rather
   than programmers, so it would be best to demonstrate Ruby's utility as a
   `scripting language'.

   What sort of material could he cover in an introduction? James Britt
   thought that Vincent shouldn't try to go over too much. Instead, "show
   enough about scripting in general, very high-level, and some Ruby in
   particular, so as to generate interest in further exploration."

   Henrik Horneber gave a link to whytheluckystiff's article
   'Wearing Ruby Slippers To Work' which shows Ruby code performing the
   same sort of tasks that sysadmins often use find, grep and friends for.

   Others posted links to tutorials and to presentations that have previously
   been used.

  UDPSocket#recvfrom is slow
  --------------------------

   Niklas Frykholm found that the UDPSocket#recvfrom method was "extremely
   slow" (two seconds per call), whereas UDPSocket#recv was super fast.

   He guessed that the difference was that recvfrom attempts to convert an IP
   address to a network name. "Apparently, on a (badly configured???) Windows
   network, this can be a really slow operation."

   Kent Sibilev said that you can write

 Socket.do_not_reverse_lookup = true

   to disable the conversion. Niklas confirmed that this solved his problem.

New Releases

     * cursor-0.6

       Eric Mahurin enhanced cursor, a library that provides powerful
       external iterator features based on the `cursor' editor metaphor.

       "Compared to most other general external iterators, Cursor offers two
       interesting features - ability to insert/delete and the ability to
       save/restore a position."

       Some interfaces were simplified and more methods added.

       The thread discussed the general approach, with Eric noting that he's
       working on a library called Grammar, "used to match what's next in
       Cursor".

     * Finite State Ma-thing 0.6

       Gavin Kistner announced the `Finite State Ma-thing', a library that
       assists in the implementation of finite state machines.

     * HighLine 0.6.1

       James Edward Gray II released HighLine 0.6.1. This resolves an
       installation issue for Windows users.

       HighLine is a library that makes it easy to write console
       applications. It provides high level services for such things as
       asking questions of the user and receiving answers.

     * ZenHacks 1.0.0

       Ryan Davis announced ZenHacks 1.0.0.

       "A cornucopia of hackery. Toys, Tricks and Tools that have spawned out
       of my other projects (RubyInline, ParseTree, Ruby2C, etc) but don't
       exactly fit there. This includes ZenDebugger, ZenProfiler,
       ZenOptimizer, ruby2ruby, and more."

     * Packgen 0.2

       Ghislain Mary released Packgen 0.2, a network packet generator. It can
       be used to analyse the performance of your network.

       This release includes the ability to generate graphs containing
       information such as "bandwidth, the packet size, the packet count, the
       packet loss, the interarrival and the jitter of your packet flows."