Ruby Weekly News 4th - 10th April 2005

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

   Ruby Weekly News 4th - 10th April 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
--------------------------

     * RubyForge at 600 projects and counting...

       Richard Kilmer announced that Tom Copeland had just activated the
       600th project on RubyForge, after only a year and a half of service.

       "We also want to thank our mirrors for handling the true brunt of the
       load."

       Tom also separately posted a "big thank you" to those providing file
       mirrors, including a new one from Evan Webb.

     * Slashdot: Ruby On Rails Showdown with Java Spring/Hibernate

       Joao Pedrosa saw an article on slashdot comparing the Ruby on Rails
       web application framework with Java's Spring/Hibernate.

       It was written by Justin Gehtland, the author of
       "Better, Faster, Lighter Java" as well as
       "Spring: A Developer's Notebook".

       He ported a Spring/Hibernate application he'd written to Rails, and
       concluded that the Rails solution used less code, much less
       configuration, and ran faster. (Justin felt that the better
       performance was due to Rails doing good caching.)

       Justin: "To me, the eye-opening revelation isn't "Rails is faster than
       Java/Spring/Hibernate". It's "Rails can be very fast.""

Ruby Users Groups
-----------------

     * Chicago Area Ruby Group Meetup with DHH

       John W. Long declared that the "Chicago Area Ruby Group would like to
       extend a warm invitation to Ruby developers everywhere to a meetup
       with David Heinemeier Hansson on Saturday, April 23rd." Please RSVP.

     * seattle.rb hackfest 2005 planning list now online

       Ryan Davis announced a mailing list for the seattle.rb group to plan
       their upcoming "hackfest".

     * Utah Ruby User Group

       Jamis Buck announced the Utah Ruby User Group.

     * Montreal.rb ?

       Mathieu Bouchard asked if anyone else is interested in setting up a
       Ruby User Group in Montréal, Canada.

     * Boston Ruby Meetup

       This thread invited interest in Boston and Houston groups.

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

   Marco Campelo asked "How Ruby is positioned regarding Enterprise
   Solutions?"

   Jay Levitt responded,

     "If you're looking for global enterprise solutions to integrate
     distributed systems, at the end of the day, Ruby has the momentum to
     leverage the dynamic potential of synergies between your skillsets and
     its core competencies on Internet time. Achieving best-of-breed,
     mission-critical componentization utilizing standards-compliant
     scalability, it provides an adaptable, standards-based framework to add
     value via a fast-track, result-driven development process.

     I hope that helps answer your question."

Threads
-------

   Interesting threads this week included:

  Is there any library that can easily manipulate Bitmap (bmp) file?
  ------------------------------------------------------------------

   sin kanti wanted to turn a bmp image into a 60×40 pixel black-and-white
   picture, whose bits would then be stored in an array for processing.

   Timothy Hunter pointed out RMagick, a Ruby library that wraps ImageMagick.

  Knight's Travails (#27)
  -----------------------

   Jason Bailey rode out this week's Ruby Quiz.

   Given an 8×8 chessboard, write a program that takes a starting position of
   a knight, and desired ending position. Additional arguments can be passed
   to specify positions the knight is forbidden to land on.

   Determine a shortest path from the start to end (if there is one).

  method search rule in 2.0?
  --------------------------

   This topic was mentioned last week, but there has been much discussion
   since. Matz has suggested that the way method search works could be
   changed in Ruby 2.0.

   In imaginary future Ruby, the following code would work as described in
   the comments

class C
   def process
     util # will always call C#util, even if overridden
     self.util # will call subclass's #util, if present
   end

   def util
   end
end

   Currently, both util and self.util would call the subclass' util if self
   corresponded to a subclass.

   A problem with the existing behaviour is that accidental overlap of method
   names can easily occur.

   (The "brittle base class problem" is a phrase used by some developers to
   describe one such problem. It happens when a new version of a library is
   released which adds a method. If a user of the library had earlier created
   a subclass that happened to define a method of the same name, their code
   may stop working when they upgrade the library.)

   The wiki page Ruby2.0MethodSearchRuleEnglish gives the following example
   of two classes that define util methods which are meant to be unrelated.

class C
   def process
     # ...
     util
   end

   def util
     # ...
   end
end

class CC < C
   def util
     # ...
   end
end

CC.new.process

   Currently process calls CC#util when it was intended to use C#util.

   David Garamond began a thread saying he was "feeling disturbed about this
   new Ruby2 behaviour". Isn't the current behaviour "what people expect in
   OO?"

   Peter C. Verhage thought that an alternative change would be to make
   private methods only exist in the class in which they were defined. It
   would then be possible for C and CC to have different util methods
   co-existing peacefully so long as they were private.

   David A. Black argued that the default behaviour should not change - "the
   case where you don't want overriding should be the one that requires
   something extra". He suggested requiring the programmer to write C#util to
   force C's version of util to be called. ("Yes, everybody, I do know that
   this is comment syntax and would require a parser change".)

   Csaba Henk said that C#util could be done in today's Ruby with
   C.instance_method(:util).bind(self).call.

   "It's sooo long that you can't help remembering the occasion if you use
   it.

   And I don't remember doing it more that one or two times. That is, my
   experience suggests that it's not a particularly frequent pattern."

   Trans thought this topic was related to some work he had been doing in the
   AOP (Aspect-Oriented Programming) world. "My solution was to have another
   scoping mechinism akin to public, private, protected, called "local". It
   differs in that methods defined in the local scope are always called
   locally in the context of that module, but not in the context of any
   other."

  Seven new VMs, all in a row
  ---------------------------

   Peter Suk announced a project to write a Ruby implementation using a
   Smalltalk Virtual Machine (VM).

   "Ruby and Smalltalk are very similar under the covers, so Smalltalk VMs
   are a very good match for the language."

   Not only would this provide fast execution of Ruby, but also features like
   a powerful debugger and a meta-level that would allow you to easily change
   Ruby semantics.

   R. Mark Volkmann said it would be "really cool" if Peter would do this
   using the Sqeak VM (a Free / Open Source Smalltalk VM). Peter Suk agreed
   that it would be good, except that he needs the Namespaces Smallktalk
   feature in order to implement Ruby features like modules. Squeak does not
   (yet) support Namespaces. "The VMs I am targeting first are commercial
   ones, but they have free versions/licenses."

   Avi Bryant thought that the Squeak VM would have no problem supporting
   Namespaces - it's an "image-level thing, not a VM-level thing".

   Later on, Peter pointed out that Smalltalk VMs typically have very little
   that is Smalltalk specific. The language-specific portions are handled by
   a different layer, which would be replaced with a layer for Ruby.

   He also wrote, "A way I can help Pure-OO development is to vastly increase
   the power of the Ruby community by giving it access to the great
   technology developed for Smalltalk."

  why aren't declarations just syntactic sugar?
  ---------------------------------------------

   Lionel Thiry asked why

class MyClass
   ...
end

   didn't just get translated into

MyClass = Class.new do
   ...
end

   Bill Kelly said that one problem was that the block form doesn't fit
   nicely with "re-opening" the class. (For example, when you add a method to
   an existing class.)

   nobu added that the class Foo definition hides the outer scope, for
   example

x = 1
class MyClass
   p x # => Name Error
end

   The above code would work if the class is created using the block form,
   but that may not be desirable.

  Accessing SVN through Ruby
  --------------------------

   Bob Aman wanted to write a kind of CMS (Content Management System) that
   uses the Subversion version-control tool as a backend.

   "However, the only simple interface to Subversion I seem to have available
   to me is to call out to the Subversion command line client, which is
   rather less than optimal."

   He found Ruby bindings that were created using SWIG, but couldn't figure
   out how to get them going. (SWIG is a tool that makes it easy to wrap C
   and C++ libraries from a number of languages, including Ruby.)

   Kouhei Sutou noted that the INSTALL file for the bindings includes
   instructions on building them on Windows, the platform Bob was using.

  Forcing FCGI headers
  --------------------

   Tony Targonski had written a Rails application. One of the pages did a lot
   of work and took several minutes to complete. FastCGI timed out after 30
   seconds and didn't return anything to the client. What to do?

   David Heinemeier Hansson said that one solution was to increase the
   FastCGI timeout. "The default is a meager 30 seconds. Way too low for a
   bunch of applications, including Basecamp. We use 600 seconds (to allow
   for file uploads which are shuttled on to the users on FTP server)."

   "Alternatively, you can have your action trigger an external service of
   some sorts that complete the computation asynchronously. Then you could
   have some other way of alerting the users, like using Ajax".

  Quick start to acessing Oracle
  ------------------------------

   Ross Parker was looking at moving from Perl to Ruby and wanted to quickly
   get Ruby talking to his Oracle database. "Can anyone direct me to a quick
   start resource for accessing Oracle with Ruby?"

   Jason Sweat suggested the OCI8 library, and Ross was able to successfully
   use this with DBI. (DBI is an abstraction layer which provides a uniform
   interface for accessing different database systems.)

   There is also a library called Ruby9i for use with newer versions of
   Oracle.

  My threading concern.
  ---------------------

   Aaron Rustad asked "When two theads enter a method that can change a value
   of an instance variable, does the possiblity exist that one thread's
   changes will clobber the other's?"

   Kirk Haines explained that yes, this possibility does exist, just like in
   other languages that use threads.

   "If there is a section of code that should only be accessed in a serial
   fashion, control that access with a Mutex", e.g.

m = Mutex.new
m.synchronize do
   @foo.update
   @bar.count += 1
end

   "Ruby provides a rich set of support beyond mutexes for dealing with
   threading issues, should you need them."

   Aaron's question came up because he was developing a Rails web application
   and noticed that Rails was handling requests with a method that has access
   to instance variables of ApplicationController ("session, request,
   params").

   Nicholas Seckar said that there was no problem in this case, since Rails
   uses a new ApplicationController instance for each request.

  Detecting thread exit immediately
  ---------------------------------

   Martin DeMello was busy developing his fxirb application (a GUI wrapper
   around IRB), and had some code that started a Thread whenever it needed to
   launch an IRB session. How could he tell as soon as the Thread had ended?

   "Is there any way I can have FXIrb pass in `self' to the thread so that it
   can call methods on it?"

   He later reported that the helpful people in the #ruby-lang IRC channel
   had provided him with the solution,

@irb = Thread.new(self) {
   ....
   self.quit_method
}

  Ruby/DL - assigning to global variables?
  ----------------------------------------

   Andrew had code like

module Foo
   extend DL::Importable
   dlload 'libquux.so'
   @@bar = symbol 'bar'
end

   ... "where `bar' is a variable in libquux. How do I assign a value to
   bar?"

   Takaaki Tateishi explained that "@@bar is considered as a pointer to a
   value. If its type is int, you can assign an integer value as follows."

IntValue = struct ["int value"]
obj = IntValue.new(@@bar)
obj.value = 1

  Interfacing with C executable
  -----------------------------

   Joe Van Dyk had a C program that was part of a complex system which uses
   shared memory for communication.

   Currently he was using message queues for communication between the C
   program and Ruby, but this was cumbersome because he had to do too much
   work every time he added a new data type.

   Aredridel suggested using his ruby-packstruct library, which "lets you
   define binary-accurate structures in Ruby, similar to but independent of
   ruby/dl", "and see if you can't do the shared memory interface yourself".

   (Note: There are Ruby libraries that let you access both mmap and System V
   shared memory.

   See the shared memory example thread for an example using SystemVIPC.)

New Releases
------------

     * Fico 0.1.0

       Urban Hafner announced the first version of Fico, a Ruby
       implementation of the board game Havannah. The aim of Fico is to
       develop a good AI.

       Edgardo Hames mentioned that the game's inventor has offered 1000
       Euros to anyone who can write a program that beats him at least 10% of
       the time.

       The thread discussed the idea of Havannah being the topic of a future
       Ruby Quiz.

     * cmd 0.7.0: Library for Line-Oriented Command Interpreters

       Marcel Molina Jr. was "very pleased to announce" the initial release
       of Cmd. Cmd is a library for building line-oriented command
       interpreters, inspired by the Python library of the same name.

     * fxirb 0.2.0 - Multiline Edit (and request for help) Martin DeMello
       added proper multi-line editing to fxirb, a GUI wrapper around IRB.

       He also requested some help in implementing gets support - he doesn't
       know enough of either IRB or FOX to know what needs to be done.

     * Bayesian Classification for Ruby

       Lucas Carlson announced a new library called Classifier. You train it
       on input text (`this text is interesting', `this text is
       uninteresting'), and then ask it to classify new text as interesting
       or uninteresting.

     * RForum 0.1

       Andreas Schwarz introduced the first beta of RForum, a web forum built
       with Ruby on Rails. It is developed by Andreas and Alexey Verkhovsky.

       It will be used for Ruby Forum when it's ready.

     * Rake 0.5.3

       Jim Weirich released a new version of the Rake build tool. FileLists
       have had many improvements. "In particular, operations on FileLists
       that return a new collection (e.g. collect, reject) will now return a
       FileList rather than an array."

       There were a number of other changes.

     * Shallow Parser for t-SQL

       Shashank Date let out an alpha version of a library that parses the
       t-SQL procedural language (used in Microsoft SQL server).

     * Nitro + Og 0.15.0, Localization, Parametrized mixins, Morphing,
       SQLServer

       George Moschovitis announced new versions of Nitro and Og. Nitro is a
       web application framework and Og is an object-relational mapper.

       "A great release. Many cool new features and tons of subtle
       improvements. We also welcome a new core developer, Anastastios
       Koutoumanos, who's first contribution is the new SqlServer adapter."

       Localisation has been enhanced. "Parameterised mixins" are another
       interesting new feature. Scaffolding was also improved.

     * Wee 0.8.0

       Michael Neumann updated the Wee web application framework. Highlights
       include Ajax support (live updates) and a FastCGI adaptor.

     * r43

       Pat Eyler uploaded a pre-alpha release of r43 - a library that
       implements the 43things API.

     * Syck 0.54-typing compatibility, improved output

       why the lucky stiff improved the development branch of Syck, Ruby's
       YAML parser, by making it more compatible with the stable version.

     * Simple scene graph engine in OpenGL

       Ilmari Heikkinen put together a scene graph engine using ruby-opengl,
       glut and ruby-imlib2.

     * Iotaz 0.1.0

       Peter Wood gave out the initial release of Iotaz, an object-relational
       mapper that initially only works with the Firebird relational database
       management system. (Using the FireRuby client library.)

My bad - I mixed the two methods up when posting:

@irb = Thread.new {
  ...
  self.quit_method # using the fact that the block is a closure with
                   # self in scope
}

and

@irb = Thread.new(self) {|obj|
  ...
  obj.quit_method # explicitly passing in self as a parameter
}

martin

···

Tim Sutherland <timsuth@ihug.co.nz> wrote:

  Detecting thread exit immediately
  ---------------------------------

   Martin DeMello was busy developing his fxirb application (a GUI wrapper
   around IRB), and had some code that started a Thread whenever it needed to
   launch an IRB session. How could he tell as soon as the Thread had ended?

   "Is there any way I can have FXIrb pass in `self' to the thread so that it
   can call methods on it?"

   He later reported that the helpful people in the #ruby-lang IRC channel
   had provided him with the solution,

@irb = Thread.new(self) {
   ....
   self.quit_method
}

RWN rocks :slight_smile:

···

On Mon, 2005-04-11 at 20:29 +0900, Tim Sutherland wrote:

   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.

--
David Moreno Garza <damog@damog.net> | http://www.damog.net/
111,111,111 x 111,111,111 = 12,345,678,987,654,321
GPG: C671257D - 6EF6 C284 C95D 78F6 0B78 FFD3 981C 5FD7 C671 257D

In article <KUt6e.962314$6l.177609@pd7tw2no>, Martin DeMello wrote:

···

Tim Sutherland <timsuth@ihug.co.nz> wrote:

  Detecting thread exit immediately
  ---------------------------------

   Martin DeMello was busy developing his fxirb application (a GUI wrapper
   around IRB), and had some code that started a Thread whenever it needed to
   launch an IRB session. How could he tell as soon as the Thread had ended?

   "Is there any way I can have FXIrb pass in `self' to the thread so that it
   can call methods on it?"

   He later reported that the helpful people in the #ruby-lang IRC channel
   had provided him with the solution,

@irb = Thread.new(self) {
   ....
   self.quit_method
}

My bad - I mixed the two methods up when posting:

@irb = Thread.new {
...
self.quit_method # using the fact that the block is a closure with
                  # self in scope
}

and

@irb = Thread.new(self) {|obj|
...
obj.quit_method # explicitly passing in self as a parameter
}

Thanks, I've updated the website with the the first version.