Ruby Weekly News 24th April - 1st May 2005

Discussion in 'Ruby' started by Tim Sutherland, May 7, 2005.


    Here it is, all the latest news from two weeks ago ...

    I will hopefully have the next newsletter in the next few days.
    (Which you shouldn't use as an excuse for not reading this one!)

    Ruby Weekly News 24th April - 1st 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

    * Ishii-san died

    daigo announced to RedHanded "Masaru Ishii, a great Japanese Rubyist,
    died at the rail disaster, where 106 people died. He introduced
    RubyUnit with the author, Suketa-san. It was the predecessor of the
    current Test::Unit in Ruby 1.8."

    "I love unit testing. I pay his last respects."

    Ruby User Groups

    * Omaha, NE Ruby User's Group First Meeting

    Blaine Buxton announced a new user group - for Omaha, Nebraska, U.S.
    The first meeting was on the second of May 2005.

    * Seattle.rb Meeting Tonight

    Ryan Davis announced the April 28th 2005 meeting of the Seattle.rb
    user group.

    The plan was for Ryan to talk about profilers, then demonstrate some
    "very very cool stuff". "Eric will also be demonstrating his code
    metric analyzer for SVN."

    * tulsa.rb

    Tim Morgan and others were looking for other Rubyists in Tulsa,
    Oklahoma in the U.S., to "create a Tulsa Ruby Brigade."

    (Interestingly, they were using to co-ordinate.)

    Quote of the Week

    Curt Hibbs announced that Ruby is the "Most Loved" programming language:

    "Ruby is loved 3 times more than Python
    and a whopping 50 times more than Java!"

    Is anyone surprised? ;-)


    Interesting threads this week included:

    Cloning into an object

    Eric Mahurin asked how he could copy one object into another
    (shallow copy). "It would be nice to handle the case where the objects
    have a different class, but I would at least like to know how to do it
    when the classes are the same."

    As an example, he wanted to be able to write

    dest = # or if necessary
    source = "hello world"
    destid =


    dest -> "hello world" -> true
    dest.class -> String

    George Ogata said that the evil.rb project defines an Object#become
    method, which does what is desired. It is modelled after the Smalltalk
    method of the same name.

    Robert Klemme suggested simply copying the instance variables from the
    source object into the destination. He noted however that this wouldn't
    work well for objects defined in C, such as String and Array, because
    these have state which is only visible from the C level.

    Eric tried out Object#become, and found it did what he wanted.
    "It looks like it might be made standard in ruby at some point."
    "Anybody know when/if become will be made standard?"

    nobu replied,
    "When: time_t wrap arounds (where sizeof(time_t) == 8), perhaps.
    If: Matz.become(Evil) executed successfully."

    Per-project RubyGem stats

    Tom Copeland: "One nice thing about RubyForge is that you can see how many
    times your project has been downloaded. But downloads via RubyGems don't
    get put in the RubyForge database, so they don't show up in the charts.
    This is sad."

    He then gave a link that provides download stats for the top 500 RubyGems
    in the current month.

    Lyle Johnson "Huh. What are these "Rake" and "Rails" gems that are getting
    so many downloads?" ("P.S. That was a joke, people.")

    determining when inside `class << self'

    Ara.T.Howard wondered if it was possible to implement a method
    inside_metaclass? so that

    class << foo
    p inside_metaclass? #=> true
    p inside_metaclass? #=> false

    (Note: There is no consensus that these things should be called
    "metaclasses". A variety of names were discussed in a thread covered last
    week, "Article: Seeing Metaclasses Clearly".)

    Mark Hubbart noticed that "metaclasses have a peculiar inspect value", and
    provided an implementation of inside_metaclass? that parses the inspect
    output. "This code is breakable, but probably only if you try to".

    Carlos came up with
    self.is_a?(Class) && !self.ancestors.include?(self)

    George Ogata gave a C implementation that used

    The above is a robust solution, unlike the previous suggestions which can
    be broken by someone e.g. changing Class#inspect or Module#ancestors.

    Robert Klemme wrote a pure-Ruby implementation that attempts to call
    self.allocate, and if it fails, checks the exception message to see if it
    is "can't create instance of virtual class".

    Along the way, Mark Hubbart had discovered that if you dup a metaclass,
    you gain the ability to instantiate it.

    Mark found this surprising, and George Ogata explained that "duping a
    metaclass doesn't really return a metaclass. That is, it is no longer a
    thing tied to one object; it's just a free-roaming class like any other."

    "What you may have noticed is that #dup-ing a class doesn't copy it's
    singleton-class-ness, but #clone-ing does. Replace your `dup' with
    `clone', and you'll get an error, since you can't instantiate the clone".

    There was further discussion of this behaviour.

    BLOG: zenprofile (& berkeley) & zenoptimize

    Ryan Davis blogged about a couple of tools he was developing.

    The first was zenprofile, a new profiler which "tries to strike a balance
    between code readability and speed".

    The profiler bundled with Ruby 1.8 (profile.rb) is very slow. On the other
    hand, it's implementation is simple - 65 lines of pure Ruby code. (It uses
    set_trace_func to wrap all method calls.)

    Shugo Maeda's ruby-prof is a newer library that is much faster - thirty
    times faster in some cases. It is also more complex - 701 lines of code
    which is a mixture of C and Ruby.

    Ryan attempted to rewrite ruby-prof to be pure Ruby code, but found that
    it was using too many Ruby internals for this to be easy. Instead, he
    ported the 65-line profile.rb to C. (Using RubyInline.) The result was 182
    lines of C code that was almost as fast as Shugo's (perhaps two times

    The second tool was zenoptimizer. It uses ruby2c, RubyInline and "a
    lightweight version of zenprofile" to create a library that will
    automatically optimise performance critical sections of code in your
    program when you use ruby -rzenoptimizer your_prog.rb.

    Building Ruby extensions on OS X Tiger

    Richard Kilmer forwarded a message from Tony Arnold explaining how to
    build native extensions for the Ruby shipped with Mac OS X Tiger. (It
    involved editing rbconfig.rb.) Chad Fowler gave the following alternative

    sudo gem install fixrbconfig
    sudo fixrbconfig

    There were some comments as to what the exact values of various flags like
    LIBRUBY_LDSHARED should be.

    Chad indicated he may release another version of his "fixer upper gem" to
    improve on these.

    ActiveRecord auto populated columns

    Brandon Campbell knew of some fields that would be added automatically by
    ActiveRecord (which is used by Rails) - created_on and updated_by.

    Where could he find the full list of fields that are added?

    Chris McGrath pointed out the MagicFieldNames page on the Rails wiki.

    Performance of SyncEnumerator

    Matt Mower profiled some of his code, and found that the following code
    was taking up a lot of time (particularly in calls to Kernel.callcc).

    # Re-formatted from Matt's original code
    def euclidean_distance(vector)
    Math.sqrt(, vector).collect { |i, j|
    (i-j) ** 2
    }.inject(0) { |s, v| s + v }

    "However I'm now wondering if the magic which makes SyncEnumerator work is
    of the expensive kind (I'm assuming this is where all the Kernel#cc calls
    are coming from as well)."

    SyncEnumerator is used to take two (or more) "internal iterators"
    (iterators that use yield, for example Array#each) and iterate over both
    of them at the same time.

    Ken Kunz gave a link to a RedHanded post Enumerate Side-by-side with
    SyncEnumerator. The comments replying to the post suggest the use of
    Enumerable#zip, which does a similar thing to SyncEnumerator but performs
    much better.

    Matt's code converted to use zip might look like

    def euclidean_distance(vector)
    sum = { |i, j|
    (i-j) ** 2
    }.inject(0) { |s, v| s + v }

    The reason for the big difference is that SyncEnumerator uses
    continuations (which are implemented inefficiently in the current Ruby
    interpreter), while Enumerable#zip converts its arguments into Arrays.
    (Which is a problem when the argument is an infinite or large sequence.)

    Matt himself re-implemented his method in a similar way to:

    def euclidean_distance2(vector)
    sum = 0
    each_with_index { |x, i|
    y = vector
    sum += (x-y) ** 2

    He concluded with "It's a pity about the slowness of continuations since
    we agree that SyncEnumerator provides a very neat solution. As you
    observed maybe Rite/YARV will improve the situation. We can but hope!"

    Ruby and IDE

    A thread discussing Ruby IDEs popped up again.

    Much of it compared graphical IDEs like Eclipse with Emacs and vi(m).

    Austin Ziegler had some interesting comments; "Type-based code completion
    is the very thing that will NOT work in Ruby. It *can't*. The best you can
    get is a "statistically likely" code completion that may break under a lot
    of circumstances."

    "IMO, a good Ruby IDE will support debugging; have ri and rdoc information
    easily and quickly available, and that's about it."

    Days in month

    Dan Fitzpatrick wanted to know whether there is a method in Date or Time
    to tell you what the last day of the month is.

    The answer was "no", but Ken Kunz posted

    class Date
    def days_in_month
    Date.civil(year, month, -1).day

    KDE `applets' in Ruby?

    Phil Tomson recalled an announcement some months ago about writing KDE
    applets in Ruby.

    It turned out that that wasn't really what he wanted, but Richard Dale
    gave a good example for adding an icon to the system tray. He also showed
    how to start konsole with a DCOP call - all in Ruby.

    The examples used Korundum, the Ruby bindings for the KDE libraries.

    ruby and COM

    Joel VanderWerf asked
    "What's the best way to work with a COM interface from ruby?"
    "Is COM functionality built into the win32ole lib that ships with ruby now?"

    Adelle Hartley: "Yes."

    library for doing html escaping...

    Sean T Allen was searching on RubyForge for a library to escape the HTML
    in a String. (e.g. turn "&" to "&amp;".) He couldn't find it, and it was
    driving him crazy!

    Phlip said that this functionality is included with Ruby - it's in the CGI

    require 'cgi'
    s = CGI::escapeHTML('foo&bar')

    RubyGems and RDoc

    James Edward Gray II asked if you could "set RDoc options, like main and
    title, in a Gem specification?"

    Assaph Mehr said that it was indeed possible, via spec.rdoc_options. He
    also gave a link to the GemspecReference page from the RubyGems wiki that
    explains this.

    Hash as Checklist

    basi had a Hash like:

    h = {
    "one" => true,
    "two" => true,
    "three" => true,
    "four" => true,
    "five" => true

    "But typing the dummy value "true" is a waste of effort, and there's an
    ugliness in there. Is there a better way to design a simple checklist?"

    Assaph Mehr gave the answer:

    require 'set'
    s = %w{one two three four}
    s.member? 'one' # true
    s.member? 'seven' # false

    Rails + Amrita, Rails + XTemplate?

    Greg McIntyre asked "Has anybody thought about putting Amrita/XTemplate
    support in Rails?"

    Jeff Barczewski said that DHH had added templating support to Rails, based
    on work from Jamis Buck. (As far as he could recall.)

    This provides hooks for invoking whatever templating engine you wish to

    Reporting Ruby Bugs

    Michael Schonberg wanted to know where he should go to report Ruby bugs.

    Tim Hunter said one option was on RubyForge - "In the upper-right corner
    of the page, under "Support/Links" is the link "Report a Ruby Bug"".

    Rails on JRuby?

    John Wells asked about the possibility of using Rails with JRuby (an
    implementation of Ruby in Java).

    Thomas E Enebo said that JRuby as yet lacks much socket support, so
    wouldn't be able to run Rails as-is. He also thought about the possibility
    of changing Rails to run as a Java servlet.

    In a different direction, Lyndon Samson used IKVM.NET to turn the JRuby
    jar into a .NET CLR executable. He could then run Ruby code under .NET.
    (It was like a Ruby interpreter written in .NET.)

    Starting and stopping a child process in Windows

    In a thread about dealing with processes on Windows, nobu posted some code
    which did pid = spawn("cmd.exe").

    spawn is a new feature of the Ruby 1.9 development branch. It is a
    portable way of launching a program and getting a Process back that you
    can control.

    New Releases

    * RMagick 1.8.0

    Tim Hunter released a new version of RMagick, the Ruby bindings for
    the ImageMagick and GraphicsMagick image processing libraries.

    It now incorporates RVG (Ruby Vector Graphics), which was previously a
    separate library. "RVG is a library for drawing 2D graphics with an
    API based on the SVG specification."

    "RVG would be a good library to use if you're writing an application
    that needs to programmatically generate drawings, such as a charting
    application, especially if you need to export your drawings in
    multiple resolutions (web, print, etc.) and multiple image formats."

    * One-Click Ruby Installer 182-15 for Windows

    Curt Hibbs released the One-Click Ruby Installer for Windows based on
    Ruby 1.8.2 final.

    "It mostly upgrades included extensions and applications to their most
    recent versions." The fxri program was also added.

    "fxri combines a nice interactive search interface to the Ruby
    documentation along with an interactive ruby session (irb)-all wrapped
    up in a nice GUI shell."

    * foxGUIb 0.4

    Henon put out a development release of foxGUIb, an interactive builder
    for graphical interfaces that use the FOX toolkit. The major change is
    that it now works with fox12.

    * HighLine 0.2.0

    James Edward Gray II released a version of the solution he wrote for
    the HighLine Ruby Quiz.

    "HighLine was designed to ease the tedious tasks of doing
    [line-oriented] console input".

    * Kwartz-ruby 2.0.0 released - Ruby on Rails support

    kwatch announced Kwartz-ruby 2.0.0, a templating system for multiple
    programming languages (Ruby, PHP, Java). It now has Rails support.

    * Su Doku 0.0.2 (beta2) in Ruby

    Dr Balwinder S Dheeman posted an update to his implementation of the
    Su Doku puzzle game, using an ANSI console UI.

    * Arachno Ruby IDE 0.5.5 for Linux

    Lothar Scholz declared ready the latest Linux version of the Arachno
    Ruby IDE.

    "You can download a time unlimited trial version".

    Daniel Berger asked if there was any chance of a Solaris version
    (SPARC), but Lothar said "Sorry, no chance for sparc hardware

    * sys-proctable 0.7.0

    Daniel Berger, "After many moons", announced sys-proctable 0.7.0, a
    Ruby library for getting information on processes.

    The Win32 version has been completely revamped. There have also been
    changes to the other supported platforms (Linux, Solaris, FreeBSD).

    * Classifier 1.2 with Bayesian and NEW LSI classification

    Lucas Carlson, with the help of David Fayram, added LSI classification
    to his Classifier library.
    Tim Sutherland, May 7, 2005
    1. Advertisements

  2. Rob .

    Rob . Guest

    How useful are jEdit users finding the type-based method completion in
    jEdit's Ruby Editor Plugin? Have you been more productive now you have
    this feature? I'm sure there are more improvements to be made as time
    goes by; release 0.6.5 hopefully has fixed the bugs reported so far.
    The plugin's integrated RDocViewer displays method documentation in
    sync with the selection on the method completion popup, which is an
    attempt to address Austin's final point below.


    Tim Sutherland wrote:
    Ruby and IDE
    A thread discussing Ruby IDEs popped up again. ...

    Austin Ziegler had some interesting comments; "Type-based code completion
    is the very thing that will NOT work in Ruby. It *can't*. The best you ca=
    get is a "statistically likely" code completion that may break under a lo=
    of circumstances."

    "IMO, a good Ruby IDE will support debugging; have ri and rdoc informatio=
    easily and quickly available, and that's about it."
    Rob ., May 12, 2005
    1. Advertisements

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Tim Sutherland
    Feb 1, 2005
  2. Tim Sutherland
  3. Tim Sutherland

    Ruby Weekly News 4th - 10th April 2005

    Tim Sutherland, Apr 11, 2005, in forum: Ruby
    Tim Sutherland
    Apr 16, 2005
  4. Tim Sutherland

    Ruby Weekly News 18th - 24th April 2005

    Tim Sutherland, Apr 26, 2005, in forum: Ruby
    Ryan Davis
    Apr 28, 2005
  5. Tim Sutherland

    Ruby Weekly News 24th - 30th October 2005

    Tim Sutherland, Nov 1, 2005, in forum: Ruby
    Tim Sutherland
    Nov 1, 2005