14th - 20th March 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

  • RubyGems Documentation Site
  • Jim Weirich announced the RubyGems Documentation Site, replacing the previous Wiki-based documentation. It now uses the Hieraki application (which is also used for the official Ruby on Rails documentation).

  • 2005 International Obfuscated Ruby Code Contest (IORCC)
  • Todd Nathan announced the “final stretch” of the 2005 International Obfuscated Ruby Code Contest (IORCC). “In addition to a covented right of claiming you are most obscure Ruby coder for 12 months time, you also have a shot at over 750 USD worth of prizes”, from a number of sponsors.

    The deadline for submissions is midnight on March 31, 2005. (It’s not clear what timezone.)

    Update: Florian Gross believes it’s UTC.

Quote of the Week

    Paul Duncan enthusiastically announced Raggle.

    After a more than a year of near-death rescue missions, high-speed car chases, and hair-splitting battles with evil masterminds, the mysterious Raggle Task Force (Codename: R4) has emerged once again to release Raggle 0.4.0, the most powerful Ruby-based console RSS aggregator humanity has ever seen!

Threads

nonblock extension for win32?

We covered this thread last week, but there were some significant additions this time around. Bill Kelly asked if it was likely that some of the libraries in Win32 Utils would become part of standard Ruby. Daniel Berger replied “No. At best some of the Win32 Utils packages might be included with the one-click Installer.”

Curt Hibbs responded positively, saying “I would really like to include some/many/all of the win32 utils in the one-click installer. But I am way over extended. I’ll get to it eventually, but if someone wants to help out it would speed things up.”

Later on, Shashank Date announced a One-click installer for win32utils that makes it much easier to install the win32utils packages.

MS Windows automation - howto use it?

Axel wanted to automate an application using the WIN32OLE library. How to you get from the following code to something that works for a different application? What should the argument to WIN32OLE.new be, and how do you find out what methods are available on the resulting object?

ie = WIN32OLE.new('InternetExplorer.Application')
ie.visible = true
ie.gohome 

Thomas pointed out the #ole_methods method. This tells you what methods the underlying COM interface supports, but not what arguments they expect. Adelle Hartley pointed to an OLE Object Browser written in Ruby that provides more information.

Dave Burt decided to write his own OLE browser.

_Update: No he didn’t! Dave actually took the browser mentioned by Adelle (which was written by Masaki Suketa) and added a Tk interface – he didn’t write his own browser. The original browser used VisualuRuby, a GUI library written on top of the Win32 interface._

async http request

Bob Aman was writing a Rails application (a common theme these days). He has a page which needs to query a web service, retrieve some RSS feeds and do SQL queries. Currently he was executing these one after the after. How could he do them all at the same time?

James Britt said he should use threads.

Paul Graham recommends Ruby

Joe Van Dyk read an article by Paul Graham on his recommendations for undergraduate computer science students and noticed that it recommends Ruby.

If you want to work at a cool little company or research lab, you’ll do better to learn Ruby on Linux.

Advice on PDF::Writer

Austin Ziegler is “in the middle of a major overhaul to PDF::Writer”, including many API changes. He’s almost ready to make a release, but the API for tables is still being worked on. Should he release now, and then make another API-incompatible change later, or wait?

Several people thought he should release it now. vruz:

Having the thing out will help to improve things faster and relieve Austin from the pressure of packing everything in a short period of time.

Another good reason for releasing now is not all generated documents will make use of tables.

Ruby mentions at Microsofts Competitive Influentials Summit

Gordon Hartley noticed some references to Ruby in a blog.

‘Richard Monson-Haefel asks “Is there a place for AOP in .NET or is it too sophisticated for your developers.” Don’s take is “My development platform should allow me to write code w/ a couple of beers in me.” He ragged a bit on Java developers and said their main problem is they think they’re smarter than they are. He also said that if he could change one thing at MSFT, it would be that Ruby becomes the language of choice.’

Codefest Grant - RubyGems cleanup and enhancement

Continuing this thread from last week, Mauricio Fernández responded to a question about the status of RPA (Ruby Production Archive).

The port/package manager (rpa-base) and the incipient infrastructure (repository, VCS, wiki) are unsatisfactory under our (admittedly severe) criteria. They will undergo major restructuring. Had they been deemed adequate, RPA would have been proposed for widespread public consumption long ago, but it was in a testing phase for a reason.

As far as the idea of combining RubyGems and RPA, Mauricio argued that they have fundamentally different goals. For example, RPA aims to work with existing tools (like rpm, FreeBSD ports etc.) and provide packages created by a dedicated team. In comparison, RubyGems is intended to be used instead of rpm etc. and packages are usually created by whoever developed the application or library.

Mauricio also said he would appreciate it if RubyGems developers would describe their goals in a similar way to the RPA Manifesto.

Chad Fowler said he did not want RubyGems to have a manifesto, but gave his take on the purposes of RubyGems:

1. A package format for Ruby libraries and applications.
2. A system for managing installation of such packages from both local and remote sources.
3. A “master source”/repository for such packages.
4. Intended to be Ruby’s standard for package creation and distribution.

Austin Ziegler disagreed with Mauricio’s comments, saying

Nothing about RubyGems *prevents* any of the above. Nothing. The gemspec can be translated into “native” tools, and the RPA-base layer could be implemented on top of RubyGems as a platform (e.g., making the sitelibdir and DATADIR support work), and since Matz seems to have indicated that RubyGems will become part of the core when it’s ready, then it will work transparently.

There was some push-back on that last part – Matz had previously said he wanted the RubyGems and RPA teams to agree on a common system. Matz clarified,

I just don’t want to discourage one side by merging another. If RPA camp say “OK, we go our way, nevertheless Gems merged in the distribution”, that’s fine for me. Did they?

There was no answer at the time this edition “went to press”.

how do you duck-type something to String, so String believes you?

Sam Roberts had implemented a class which defined #to_str (which indicates that the class should be considered a String, as opposed to merely defining #to_s). “That’s all fine, but that doesn’t mean that String will allow itself to be compared to my class.” (Via String#==.)

Navindra Umanee warned that

String is also strongly-typed in C as T_STRING, so Ruby duck-typing is not going to save you here. Ruby is riddled with that sort of thing, probably for efficiency and implementation reasons.

ES said that the String#== method turns str==other into other==str if other is not T_STRING. This means that Sam simply needs to define an #== method in his class that compares against a String.

One Click Installer

DaZoner asked if there would be a new release of the Ruby One-Click Windows Installer beyond 1.8.2-14 anytime soon?

Wolfgang Nádasi-Donner said he’d had problems with using irb with a German keyboard in the latest release. Stephan Kämper posted a link to the solution.

Curt Hibbs attempted to reply, but didn’t actually write anything. Perhaps we’ll find out his answer next week!

Examples for racc?

Ben Giddings wanted some examples of code that use the Racc parser.

Charles Comstock suggested looking in the sample or test directories of the Racc source tarball, and Luke Graham mentioned LittleLexer as an alternative parser.

RubyURL.com

Robby Russell created the site http://rubyurl.com/ to get his feet wet with Rails. It takes a long URL and returns a link like http://rubyurl.com/Hcq7h that forwards you to the real site.

There was some discussion of the approach taken. Thomas Hurst pointed out qurl.net, a Ruby-based link-forwarding server he’d written.

Hal Fulton asked

Had you considered a scheme in which the original domain name is part of the shortened URL?
http://rubyurl.com/www.yahoo.com:ajZkXDls
That way we could at least confirm what domain we were directed to.

Ruby UTF-8

Peter C was writing a Ruby program which included Japanese strings (encoded in UTF-8).

He was getting errors like
c:\> ruby -Ku myFile.rb
jpn.rb:1: undefined method `' for main:Object
(NoMethodError) 

The file was created in Windows notepad.

Wolfgang Nádasi-Donner explained that notepad writes a “Byte Order Mark” (BOM) at the beginning of UTF-8 encoded files.

Florian Gross suggested a workaround:

Another one is to have an assignment to a scratch variable at the beginning of the script. Ruby will parse the BOM as the part of the variable name and thus not complain about it.

Florian had posted a comment about this issue on ruby-core some months ago and thought Ruby should be able to accept files with a BOM.

Using C++ libraries in Ruby

T E wanted to know if it was possible to use C++ libraries from Ruby.

Nikolai Weibull referred to the ruby embedded into c++ page by Simon Strandgaard. It shows how to access C++ classes from Ruby, as well as Ruby classes from C++.

Ruby works well with C, so an alternative is to simply access the library via a C interface.

eval/binding question

Stefan Kaes discovered that

 def test1
    eval "x=25" 
    eval 'print "x=#{x}\n"'
  end

  test1

  def test2
    eval "x=25" 
    print "x=#{x}\n" 
  end

  test2 

produces

x=25
test.rb:189:in `test2': undefined local variable or method `x' for
main:Object ( NameError)
        from test.rb:192 

So test1 finds the variable, but test2 doesn’t.

Matz explained

local variables should be determined at compile time, thus local variables defined first in the eval’ed string, can only be accessed from other eval’ed strings. In addition, they will be more ephemeral in Ruby2, so that these variables will not be accessed from outside.

In summary, I recommend you not to use local variables for your purpose. They are wrong tool for it.

Stefan felt that it would be better to allow the variables to be accessed from outside, and Matz responded

But it’s not good strategy to persuade me to use “your expectation” or “your surprise”. This “limitation” has a lot of good aspects, such as better performance, better error detection, etc. I’d love to pay the cost of small restriction for these benefits as a language designer.

Naming tips for popen4-style library?

Jonathan Paisley wrote a new popen library featuring an OO interface, independent access to stdin, stdout, stderr, plus the ability to send signals to a child process and get its exit status. It is also thread-safe.

He has initially called it Popen4 (the name of the Python library it was modelled after), but is looking for a better name. (He later suggested “ChildProcess”.)

Daniel Berger recalled an Open4 class written by Ara Howard a year ago. This returned the pid of the child process as well as the streams. The win32-open3 package has an Open4 module that uses the same API as Ara’s.

Daniel felt that the Ruby community should try to reach consensus on the API for this feature.

Jonathan had previously discussed this issue with Ara and agreed that it would be good to decide on an API and behaviour.

Texas Hold'Em (#24)

Matthew D Moss came up with this week’s Ruby Quiz,

Interpret sets of hands in the “Texas Hold’Em” card game (a variation of Poker), to report “Full House”, “Two Pair”, “Flush” etc.

There was some fun discussion about poker.

Stable sort?

Hal Fulton wanted a “stable” sort algorithm, i.e. one where if two elements are judged to be equal in the ordering (where <=> returns 0) they end up in the same order relative to one another in the output as they were in the input.

Ruby’s Enumerable#sort uses the Quicksort algorithm, which is not “stable”.

Matz thought that the following would be a slightly inefficient solution, but not too bad:
n = 0
ary.sort_by {|x| n+= 1; [x, n]}

Opening for an entry level position in SLC Utah

A job to develop a Ruby on Rails application was posted. Jeremy Kemper said that people looking for Rails work should list themselves on the AvailableForHire page on the Rails wiki.

There is also a job postings page.

Wanted: A nice clean ruby app to disect

Curt Hibbs was part of a new Ruby User’s Group in Saint Louis, Missouri in the U.S. “About 90% of our members are new to Ruby, and we decided that a good way to get started would be to dissect the code of a Ruby app to learn Ruby and its idioms first-hand from *real* code.”

What applications would the community recommend?

James Edward Gray II suggested the Ruby Quiz solutions. Mike Clark thought RubLog would be worth looking at.

New Releases

Ruby/LDAP 0.9.1: LDAP API (RFC1823) library

Ian Macdonald recently took over maintenance of Ruby/LDAP from Takaaki Tateishi. The latest release includes some API tweaks. Connections can now be rebound with new credentials and an LDIF module has been added.

Alexandria 0.5.0

Laurent Sansonetti released Alexandria 0.5.0. It is a GNOME application for managing book collections. Export-to-XHTML support has been added, as has support for loaning, books without ISBN numbers, and many bug fixes.

One-click installer for win32utils

On behalf of the win32utils team, Shashank Date announced version 0.0.3 of the “one-click installer for win32utils”.

“This installer will install win32utils modules which are compatible with the latest one-click installer for Ruby on the Windows platform.”

RbTET a Ruby TET API binding

Neil Moses announced the first release of a Ruby binding to TET (Test Environment Toolkit).

FastCST 3.0 (Now w/ meta-data, get, and put)

FastCST 0.4: SMTP+POP3 Distribution, FastCST 0.4 Packaging Fix

Zed A. Shaw put up another release of FastCST, an experimental changeset tool. Version 0.3 added YAML meta-data support for changesets, plus get and put commands. Version 0.4 added send, recv and read commands to integrate the tool with email.

A tutorial was also written.

Kashmir/Elusion 0.2

Christian Neukirchen set out the first public release of Kashmir/Elusion, a templating engine that “tries to walk on the small path between the mess of raw evaluated Ruby like ERB and the clinical sterileness of data-driven templating like Amrita.”

webgen 0.3.1

Thomas Leitner released a new version of webgen, a tool for creating web pages from page description and template files. Major changes include improved picture gallery support, automatic validation of HTML files and configurable page file output names.

Orbjson 0.0.4 released

James Britt added support for asynchronous requests to Ruby Orbjson. This library provides Ruby-Javascript integration for JSON-RPC requests, making it easier to write web applications which use Ruby on the server and Javascript on the client. He later announced a tutorial he’d written for the library.

RhizMail 0.1.0

Francis Hwang release RhizMail 0.1.0, a “test-friendly” library for sending out emails that are customised to the destination user.

Nitro + Og 0.13.0

George Moschovitis improved Nitro (a web application framework) and Og (an object-relational mapper). Nitro now has a Mailer subsystem, an AJAX example (which shows how to develop a Google Suggest-style UI), and a Rails compatible directory structure. Og is better separated from Nitro, has database-related validations and many bugfixes.

MuraveyWeb -- Ruby CMS (with demo)

Dmitry V. Sabanin announced the first public release of MuraveyWeb, a CMS built with Ruby on Rails. It features separation of content and views. “With MW you can create and manage your content and then using MW API and Ruby On Rails you can build views to display it the way you like.”

Raggle 0.4.0

Paul Duncan warned “It’s SHOCKING… It’s DARING! It’s INCREDIBLE!!” It was in fact Raggle 0.4.0, a web and console based RSS aggregator.

Pimki 1.6

Assaph Mehr released Pimki 1.6, a PIM based on the Instiki Wiki.

RubyGems 0.8.7

RubyGems 0.8.8

Jim Weirich announced RubyGems 0.8.7, a popular tool for packaging and installing Ruby programs and libraries. This was quickly followed by RubyGems 0.8.8 to fix an important bug for developers who create .gem packages.

“First the numbers, 220 different gems available, over 25,000 downloads of RubyGems, and nearly 190,000 gems downloads.”

New features include a cleanup command to delete old versions of a gem and dependency to show dependencies. A library called gemconfigure has been written to allow a Ruby program to be version sensitive without depending on RubyGems where that capability is not needed. Another addition is gemwhich, a program to help users to locate RubyGems-managed files.

PageTemplate 1.2.0

Brian Wisti improved PageTemplate, a library for using text templates in web projects. Additions include comment syntax and unless.

Ruby/ZOOM 0.1.0

Laurent Sansonetti was “happy to announce the first release of Ruby/ZOOM!”

“Ruby/ZOOM provides a Ruby binding to the Z39.50 Object-Orientation Model (ZOOM), an abstract object-oriented programming interface to a subset of the services specified by the Z39.50 standard, also known as the international standard ISO 23950.” (Used mainly for book information retrieval.) It will be integrated into the next release of the Alexandria book collection manager.