7th - 13th 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.
Special thanks this week goes to Paul van Tilburg, who converted several weeks of newsletters from RubyGarden format to Hobix. This provided nice syndication with RSS and Atom. I liked his work so much that I decided to save him the trouble of doing the conversion every week and just use Hobix myself! I intend to translate the old newsletters into this format as well.
I’m interested in feedback on the new layout and functionality.
Articles and Announcements
- Ruby Developers in Tokyo, Japan
- SIGHTING: Ruby article in Dr. Dobb's
- Ruby Central 2005 Codefest Grant recipients
- Ruby Displaytag (Dave Tiu)
- Ruby/AGG and Ruby/View (Andrey Melnik)
- Gambit (James Edward Gray II)
- Ruby Bindings to Lucene Search Engine (Brian McCallister)
- RubyGems cleanup and enhancement (Ryan Davis)
- Who wants to learn Ruby with me?
Zev Blut posted a job announcement in the form of a Ruby program. Several people posted patches and comments. Zev followed up with “Thanks for all the comments and improvements to the coded request for Ruby developers! It was certainly more fun than writing a formal job posting. Hopefully, I will get a few resumes in my mailbox…”
Kaspar Schiess spotted an article in the February 2005 issue of Dr. Dobbs called “Amazon.com – Web Services & Ruby”. It was written by Ian Macdonald. Kaspar reports “The article is well written and makes you want to try out the library.” (Registration required to view article.)
David A. Black announced that there were five recipients of the first Ruby Central Codefest Grant program.
They each receive up to US$500, to be used for hosting “codefests”, where groups of developers meet up at the same physical location to hack.
Andreas Sprotte is looking for a partner to write a RubyCocoa application for the Mac.
“I want to learn about the model view controller pattern, object-orientation, basic networking and accessing a database. We’d email us back and forth and would collaborate via SubEthaEdit once a week.
The project should be something that could be completed in about 40 hours, maybe spread about 4 to 6 weeks.”
Quote of the Week
We’re breaking the rules here – but this is Ruby-land, so that’s okay. The quote this week isn’t from the ruby-talk mailing list, it’s from RedHanded, a blog run by why the lucky stiff. (With some other contributors from time to time.)
_why had just observed the “haha” count between the Python and Ruby lists.
In response, Wonko the semi-successful magician saw fit to declare“It’s an established scientific fact that Ruby programmers laugh five times more per day than Python programmers, and thirty times more than Java programmers. And unlike the mad half-a-laugh-per-week C++ crowd, it’s not all evil cackling laughs, either.”
Threads
[Possible ruby job in SF Bay Area]
Joel VanderWerf posted a possible job position for a Ruby programmer. The requirements included “Ruby: 2 years, responsible for at least one project of >10K lines.”
why the lucky stiff noted “I’ve always held to the old adage: If you’ve written 10K lines of Ruby code, then you’re using it wrong.”
Dave Burt calculated the number of lines in some of the major Ruby libraries and applications. Rails is 2K lines, rdoc is 16K and rexml 9K. “So the successful applicant will have written one of the (top 5?) largest Ruby projects in existence.”
David Heinemeier Hansson (the main author of Rails) agreed with these sentiments, saying “I, for one, wouldn’t fit the description above. Number of years is a utter lackluster indicator for job performance. Rewarding the use of 10K lines in Ruby is also fairly questionable.”
Joel defended the requirement, explaining “The app needs to interact with 3rd party software that has its own highly complex (and often poorly designed) input/output system. It needs to do a large variety of geometrical calculations (not difficult ones). The programmer for this job needs to be comfortable with managing a large number of ugly details. That skill is distinct (though of course not exclusive) from writing a lovely little ruby library.”
[YAML obj merging]
gga wanted to merge twoHash objects in a ‘recursive’ way, e.g.
irb> a = { 'A' => { 'A1' => 'a' } }
irb> b = { 'A' => { 'B1' => 'b' } }
irb> b.mix(a) # ficticious method
{"A"=>{"A1"=>"a", "B1" => 'b' }}
Trans said that Ruby Facets provides a weave method which
“does what you wish and a little more”.
[Redesign 2005 Blog]
why the lucky stiff linked to the Redesign 2005 Blog. It presents two mockups of a new ruby-lang.org website. These were prepared by the vit-core team.
Feedback should be posted to the blog.
[Watir needs a Win32GUI library]
Bret Pettichord: “We’ve seen growing enthusiasm for Watir, a web-testing library that is good enough that it is convincing people to learn Ruby just so that they can use it.” He gave a number of quotes from satisfied users.
Watir controls Internet Explorer via the COM interface, but is running into some limits with that interface. “I’m writing to ask for help. The biggest problem with Watir is its support for various dialogs. These dialogs appear when you use a browser; for example, a login dialog or a security dialog or a javascript dialog. Watir mostly works by accessing the DOM via IE’s COM interface. But there is no COM/DOM interface to these dialogs.”
Some work has been done using Win32 calls, but Bret thinks it would be better to use a general Win32 GUI testing library that already exists. Any suggestions?
[Is iterating in lock-step possible?]
This thread considered external vs internal iteration.
# External
while g.next?; foo(g.next); end
# Internal
g.each { |x| foo(x) }
The Generator class can be used to convert internal iterators into external ones,
but it is slow. (1000 times slower according to William Morgan’s benchmarks.)
Roshan James wanted to iterate over two Enumerable in parallel, without first converting
each into an Array. Enumerable#zip can be used for parallel iteration, but it
converts its arguments into Arrays.
%w(eins zwei drei).zip([1,2,3]) {|a, b| puts "#{a} #{b}" }
It was felt that Generator was indeed the right way to go. If it was too slow then the
objects being iterated over could be changed to have an external iterator interface.
[ODBC OG/ActiveRecords]
Luke Galea wanted to use Microsoft Access and Sybase Anywhere databases from Ruby. There aren’t any Ruby drivers for these at the moment, so he’s using Ruby-ODBC. “BUT: I would like to use a nice object-relational library like ActiveRecord or OG.. Has anyone ever had any success using either over ODBC?”
David Heinemeier Hansson warned that “Generic ODBC adapters are problematic because the databases underneath might use different strategies for stuff like auto-incremented columns. A Access or Sybase adapter that goes through ODBC is certainly possible. I know that shashank and a few others were looking into that for Active Record at some point.”
Kirk Haines said that the Kansas ORM (Object Relational Mapper) should be able to use ODBC connectios. “Kansas, as an ORM, has been feature-incomplete, but stable for many months, and I use it on probably 20 different production applications. It used DBI for simplicity and coverage, making it lightweight.”
[what about a rails-based gforge like?]
Lionel Thiry asked “isn’t there a need for a rails-based gforge like framework?”. GForge is a PHP application that provides support for collaborative software development, with forums, mailing lists, CVS, bug tracking etc. It is used by Rubyforge.
gabriele renzi thought that it was quite a complex project, and rewriting it in Rails wouldn’t gain you much. Lionel countered this by quoting the claim from Rails enthusiasts that web applications can be developed up to ten times faster with Rails. (Although this claim was actually originally made in comparison to Java frameworks, not PHP ones.)
Martin DeMello felt that GForge was not primarily a web application - “There are a lot of complex details on the server side that would have to be redone for very little gain.”
[DRb for dummies !]
Svend-Erik Kjær Madsen had a problem using the ACL (access-control list) class with drb
(distributed Ruby). The solution was as simple as require 'drb/acl', but the thread gives
us a good excuse to demonstrate ACL.
Quoting part of Svend-Erik’s code, with the extra require,
require 'drb'
require 'drb/acl'
acl = ACL.new( %w[deny all
allow 192.168.1.*
allow localhost ] )
DRb.install_acl(acl)
[Quoted Printable (#23)]
James Edward Gray II set out this week’s Ruby Quiz. The task is to write a filter that handles the “quoted printable” encoding. (This encoding is primarily used in email.)
For example, the character “<” becomes ”=3C”.
[need for a class_attr methods collection]
Lionel Thiry suggested class_attr methods, similar to attr_reader, attr_writer,
attr_accessor but for class instance variables.
class MyClass
@a = "value"
class_attr_reader :a
end
puts Test.a # it doesn't work
ts gave the following:
class MyClass
@a = "value"
class << self
attr_reader :a
end
end
ts also reminded Lionel not to confuse
“class instance variable (i.e. @a in your example) and class variables (i.e. @@a)”.
[Simple extension question]
Mark Probert asked what the simplest way of clearing an Array from C was, i.e. the C
equivalent of foo.clear.
Daniel Berger replied: rb_ary_clear(foo).
“Tricky, eh? :-P For a complete list of methods, take a look at intern.h.”
[Roman Numerals (#22)]
James also summarised last week’s quiz, to write a convertor between Roman and Arabic numerals.
One interesting technique was used by Dave Burt. He defined Object.const_missing so that
constants like IX would automatically be converted into RomanNumeral objects.
“My thanks go out to friends and Romans alike.”
[Great Computer Language Shootout]
Isaac noted that Ruby is currently missing about a dozen programs from the Great Computer Language Shootout (a set of benchmarks for many programming language implementations).
“If you have a few moments please contribute stylish Ruby programs.”
[Encoding a multipart/form-data for posting via HTTP]
Dema announced “After googling around (with no luck) for a while for a function that would encode a hash into a multipart/form-data to be sent to a HTTP server via POST, I decided to read the RFC and write my own.” It does not yet handle complex cases.
Dave Burt thought this should be in Net::HTTP::Post.
[Codefest Grant - RubyGems cleanup and enhancement]
Eric Hodel announced that the Seattle.rb users’ group will host the RubyGems codefest. “We would like to solicit your ideas on what you want to see cleaned up or enhanced in RubyGems.” “For our Codefest we do not plan on making large changes to the way RubyGems works. One thing we would like to focus on is making the gem command more friendly when you hit ^C, for example.”
gabriele renzi suggested “One little thing I’d appreciate is some kind of feedback for the user like a progress bar both in downloading and upgrading cache.”
Curt Hibbs thought a GUI front-end is needed, but that it was probably too much work for a codefest. “What I want is something like a news reader, or windows file explorer. A desktop GUI with a tree control on the left and a detail panel of sorts on the right. With the ability to mount and browse multiple repositories as well as your installed gems.”
Richard Lyman had created a mockup GUI front-end at one stage, but nothing happened after that. He will have more time at the end of April, so may do work on it then.
Jim Freeze made a different request in another thread. “I like the versioning of libraries, but I particularly like the versioning of applications.”
$ rake --version
rake, version 0.4.15
$ rake _0.4.13_ --version
rake, version 0.4.13
Jim has a script which launches the application, and would like the user to be able to specify which version was run. Perhaps “setenv RUBYGEMS_USE_APP_VERSION_xyz_app 1”.
[Malformed UTF-8?]
Ian Macdonald had recently been getting ArgumentError exceptions from a calendar library. The error
messages states that the calendar event contains malforned UTF-8.
Ian gave an example of text that gets rejected by String#unpack("U*").
Simon Strandgaard pointed out the error in the text – it was indeed invalid UTF-8.
Nikolai Weibull posted a program that checks whether text is properly
formed UTF-8. Unlike String#unpack, this program gives the actual position
of the first invalid character.
[nonblock extension for win32?]
Bill Kelly recalled reading about an issue with blocking IO on Windows, and thought that someone had announced a library for Windows that provided non-blocking support. Where could he find this library?
“One of my applications has an unusable feature on windows at present, because I need a nonblocking way to read from a pipe returned from popen(). Is there any nonblocking way to accomplish this in win32 ruby?”
Daniel Berger explained that the discussion had been about a patch to the Ruby interpreter to fix problems
with blocking sockets, not a separate library. The patch has been included in CVS. As far as popen() goes, the win32-pipe library provides a
replacement that will work asynchronously (although the API is different).
Bill said that he’d probably switch to using sockets so his code was portable.
New Releases
Imlib2-Ruby 0.5.0
Paul Duncan also released his latest bindings to the Imlib2 image processing library. Packaging and documentation were improved and an issue that came up when using Imlib2-Ruby with Rails was resolved.
Kwartz-ruby 2.0.0-beta3 - a template system for Ruby, PHP, and Java
kwatch enhanced his multi-language templating system. It now includes include support.
Amrita2-1.9.3
Taku Nakajima issued forth a new version of Amrita2, an XHTML/XML templating library. Support for rich client-side Javascript interfaces has been added – Amrita2 now generates both Ruby and Javascript code from the template.
Nitro + Og 0.12.0
George Moschovitis delivered “A careful blend of new features and subtle improvements to the existing infrastructure.” Nitro is a web application framework, while Og is an object-relational mapper.
Nitro now allows action meta-data. This is used for example to provide routing (rewrite) rules. The templating engine can also now be used standalone from the rest of the system.
A new Og feature is automatic generation of finders for all properties.
Irb enhancements
Cs. Henk made some enhancements to irb, including bash-style multi-line editing and context-sensitive history completion. These features were met with great enthusiasm.
Fast Change Set Tool (Ruby's Revenge)
Zed A. Shaw announced the first release of a revision control tool he’s been working on. FastCST allows you to create full changesets between two directories and apply them.
Rails 0.10.1: FCGI stability, WS generator, tons of fixes
David Heinemeier Hansson announced the latest version of the Rails web application framework. “Action Web Service has seen the most interesting improvements feature-wise with a new generator and tie-ins with the testing setup.” XML-RPC support has been improved.
priority queue using RBTree
Joel VanderWerf “patched” together a PriorityQueue implementation using Queue and
RBTree (a Ruby red-black tree implementation). He also thought that RBTree should be
part of the standard Ruby distribution, and a couple of people concurred.
GeoIP.rb
Clifford Heath translated some of the GeoIP C library into Ruby. GeoIP is “Geographic database by IP address” and tells you which country the user of an IP address is probably in.
TkRTTimer class
This is not exactly a “new release”, since Ruby/Tk is part of the standard distribution,
however: Hidetoshi NAGAI announced the addition of the TkRTTimer class to Ruby/Tk.
It can be used in place of TkTimer and provides something that is closer to a realtime
timer.
Rubilicious 0.1.4
Paul Duncan improved Rubilicious,
a Ruby interface to the social bookmarking site
del.icio.us. #delete and #update are now
supported, and #all is much more efficient.
new eric3 snapshot
Detlev Offenbach announced a new snapshot of eric3, an IDE that supports Ruby. A Ruby debugger was added.