Wednesday, October 29, 2008

Elements of Ruby Style

Next week marks the publication of the 50th Anniversary edition of the Strunk & White's The Elements of Style, a critically important work for anybody who puts words together on a regular basis.

In that spirit, here are some thoughts on good Ruby & Rails style -- I'm mostly focusing on Ruby-specific guidelines here. This is somewhat closer to a brain dump than a fully-baked style guide, so it's something I intend to come back to, especially after hearing everybody tell me exactly where I'm wrong, wrong, wrong.

UPDATE: There were some comments about the formatting being messed up. Apparently whatever tool we're using for code coloring doesn't work well with Safari. In Firefox, the formatting is as intended. We've cleaned this up -- thanks for your patience.

The goals of well-styled code are correctness and simplicity, in that order.

I don't want to pretend that it's not important for code to be correct. Still, I think that functionally correct code is not the last step. For me, the best order is: Make it Work, Make it Clean, Make it Fast (if necessary).

Ruby code should be indented two spaces.

This should be uncontroversial, right? Indenting Ruby code four spaces indicates that you are a very recent convert from Java.

Statements that extend past 80 characters or so should be broken up and indented on the following line.

This one may be a little idiosyncratic, since I tend to use a narrower edit window than a lot of people. That said, it's still a good idea to have a hard right margin to your code. Whether it's 80 or 100 characters is less relevant than that all of the code can fit on the screen without scrolling. If you have to scroll to see code, eventually, you'll make mistakes based on code that you can't all see at once. (I find this especially true in HTML/ERb, where you can easily mangle a closing tag in column 125 and lose your mind trying to find the problem).

In either case, you should never break up individual sub statements -- in the above examples, never split up a + b -- you should try to keep entire expression, hash or array arguments on the same line even if that means the line above is shorter.

Anyway, both choices have tradeoffs. The double-indent is the easiest to maintain as the code changes, but can make it tricky to follow the logical structure of the code. The longer indent makes it generally clear what goes together, but it's a little hard to keep up, and can look kind of ragged.

I tend to prefer the first form for Ruby, although I do use the second sometimes, especially for, say, hash options inside a larger statement.

Ruby allows you to leave out parenthesis, in general, resist this temptation.

Parenthesis make the code easier to follow. General Ruby style is to use them, except in the following cases:

  • Always leave out empty parentheses
  • The parentheses can be left out of a single command that is surrounded by ERb delimiters -- the ERb markers make sure the code is still readable
  • A line that is a single command and a single simple argument can be written without the parenthesis. Personally, I find that I do this less and less, but it's still perfectly readable. I tend not to like single lines in regular ruby code that have multiple arguments and no parentheses.
  • A lot of Ruby-based Domain Specific Languages (such as Rake) don't use parenthesis to preserve a more natural language feel to their statements.
http://www.pathf.com/blogs/2008/10/elements-of-ruby-style/

typeface.js

Instead of creating images or using flash just to show your site's graphic text in the font you want, you can use typeface.js and write in plain HTML and CSS, just as if your visitors had the font installed locally. This is a work in progress, but functional enough at least to render the the graphic text on this site.

http://typeface.neocracy.org/

Tuesday, October 28, 2008

Ruby for Symbian OS

Symbian is releasing Ruby for Symbian OS to the Open Source software developer community.

Ruby for Symbian OS brings the power of the Ruby programming language to the Symbian ecosystem under the terms of this Licence Agreement.

https://developer.symbian.com/main/community/open_source_projects/ruby/index.jsp

A strftime for Prototype

Object.extend(Date.prototype, {
strftime: function(format) {
var day = this.getUTCDay(), month = this.getUTCMonth();
var hours = this.getUTCHours(), minutes = this.getUTCMinutes();
function pad(num) { return num.toPaddedString(2); };

return format.gsub(/\%([aAbBcdDHiImMpSwyY])/, function(part) {
switch(part[1]) {
case 'a': return $w("Sun Mon Tue Wed Thu Fri Sat")[day]; break;
case 'A': return $w("Sunday Monday Tuesday Wednesday Thursday
Friday Saturday"
)[day]; break;
case 'b': return $w("Jan Feb Mar Apr May Jun Jul Aug Sep Oct
Nov Dec"
)[month]; break;
case 'B': return $w("January February March April May June July
August September October November December"
)
[month]; break;
case 'c': return this.toString(); break;
case 'd': return this.getUTCDate(); break;
case 'D': return pad(this.getUTCDate()); break;
case 'H': return pad(hours); break;
case 'i': return (hours === 12 || hours === 0) ? 12 :
(
hours + 12) % 12; break;
case 'I': return pad((hours === 12 || hours === 0) ? 12 :
(hours + 12) % 12); break;
case 'm': return pad(month + 1); break;
case 'M': return pad(minutes); break;
case 'p': return hours > 11 ? 'PM' : 'AM'; break;
case 'S': return pad(this.getUTCSeconds()); break;
case 'w': return day; break;
case 'y': return pad(this.getUTCFullYear() % 100); break;
case 'Y': return this.getUTCFullYear().toString(); break;
}
}.bind(this));
}
});

http://alternateidea.com/blog/articles/2008/2/8/a-strftime-for-prototype

Safary 3+ CSS

Add to head block:
link type="text/css" media="screen and (-webkit-min-device-pixel-ratio:0)" href="/css/safari.css"

Monday, October 27, 2008

Disabling the Image Toolbar in IE 6+

To disable the image toolbar for a particular page on your website, simply add the following META tag to the HEAD section of your HTML document:

< meta_equiv="imagetoolbar" content="no">

The "no" setting disallows the toolbar.

Disabling the Toolbar on an Image by Image Basis

If you only want to prevent the toolbar from appearing for certain graphics on your page, you can disable it on an image by image basis.

For example, if you have a picture called "proprietary.gif", you can add a GALLERYIMG attribute to the image tag that you used to display it:

< img_src="proprietary.gif" galleryimg="no">

The "no" prevents the toolbar from showing. Setting it to "yes" allows the toolbar, and is useful if you have set the entire page to default to not showing the toolbar, and only want to enable it on an image by image basis.

Limitations

Note that disabling the image toolbar does not actually prevent visitors from saving your images, sending them to others or printing them. It merely disables the toolbar. Period. It is not a solution to theft of your graphics. Visitors can still right click the mouse on your pictures and save them from the right click menu, or save the entire page with all the images to their disk, etc (the list of ways to do this is very long). However, it is still useful for people who prefer not to have the toolbar pop out on the pictures appearing on their website. In fact, judging by the response of one very irritated IE user, who called the toolbar "that stupid IE image popup", you may even be doing your visitors a service.

Humanize numbers with Ruby

Install
#config/initializers/numeric_humanize.rb

 1  class Numeric
2 def humanize(rounding=2,delimiter=',',separator='.')
3 value = respond_to?(:round_with_precision) ? round(rounding) : self
4
5 #see number with delimeter
6 parts = value.to_s.split('.')
7 parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}")
8 parts.join separator
9 end
10 end

Usage:
puts 1.humanize
#=> 1
puts 1000000.humanize
#=> 1,000,000
puts 1000.12345.humanize
#=> 1,000.12345

A DB admin interface written in Rails

The Rails Rumble 2008 took place last week end and we took this contest as an opportunity to bootstrap a project we had in mind for some time. I teamed up with Jessy Bernal, with whom I am developing at Massive Brain Games, and Sylvain Utard, the creator of Live On Bankiz. The said project is a DB interface written in Rails and meant as a replacement for the classic phpMyAdmin. Not an extremely original idea I must confess but we found nonetheless a few reasons that motivated this project.

http://dev.massivebraingames.com/past/2008/10/21/a_db_admin_interface_written

Easy Upload via URL with attachment_fu

Allowing file uploads with attachment_fu is super easy, but I've found that users sometimes want to be able to "upload" a file directly from a URL. This saves them the steps of downloading the file, finding it on their computer, uploading it into your app, etc.

I did a bit of digging around before I came across this handy trick that makes it pretty painless to add uploading via a URL to your app. I've wrapped up the code a bit and added in a few niceties that I found necessary to avoid raising exceptions unnecessarily.

The best part is that you don't need to change anything about your controller in order to get this to work. All you need is to add the uri attribute to your model and views, and you're good to go.

http://almosteffortless.com/2008/10/24/easy-upload-via-url-with-attachment_fu/

Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint 2007 File Formats

Open, edit, and save documents, workbooks, and presentations in the file formats new to Microsoft Office Word, Excel, and PowerPoint 2007.

By installing the Compatibility Pack in addition to Microsoft Office 2000, Office XP, or Office 2003, you will be able to open, edit, and save files using the file formats new to Word, Excel, and PowerPoint 2007. The Compatibility Pack can also be used in conjunction with the Microsoft Office Word Viewer 2003, Excel Viewer 2003, and PowerPoint Viewer 2003 to view files saved in these new formats. For more information about the Compatibility Pack, see Knowledge Base article 924074.

http://www.microsoft.com/downloads/details.aspx?FamilyId=941B3470-3AE9-4AEE-8F43-C6BB74CD1466&displaylang=en

Monday, October 20, 2008

Blackbird


Blackbird offers a dead-simple way to log messages in JavaScript and an attractive console to view and filter them. You might never use alert() again.

The code (blackbird.js, blackbird.css) and image assets (blackbird_panel.png, blackbird_icons.png) were created by G. Scott Olson.

The concept for Blackbird was sparked by JavaScript Logging, an article by David F. Miller. The first iteration of this project, named jsLogger, was developed for internal use at Orbitz. In the fall of 2007, jsLogger was rewritten from the ground up, given a facelift, and named project Blackbird.

http://www.gscottolson.com/blackbirdjs/

JavaScript's class-less objects

Java and JavaScript are very different languages, although the similarity in the names and the similar C-like syntax confuses people sometimes. Let's take a look at one pretty major difference and that is how objects are created. In Java, you have classes. Then objects, a.k.a. instances, are created based on those classes. In JavaScript, there are no classes and objects are more like hash tables of key-value pairs.

http://www.javaranch.com/journal/2008/10/Journal200810.jsp#a1

Sunday, October 19, 2008

Mootools 1.2.1 Released

Tom Occhino has released Mootools 1.2.1, a backwards compatible release that also features:

Element.Properties.html (element.set(’html’, html);) now works even with select and table element’s in Internet Explorer. Element:clone is also now faster than ever, and retains the values of form elements being cloned. A lot of work has also been done to fix some bugs in Class.js, and Safari 2 support is now back. With the help of Daniel Steigerwald, we’ve also cleaned up quite a few memory leaks in IE related to events and Element storage, and destroyed elements are now more effectively destroyed.

Tom also tells us what is new….

We are going to keep going through all the tickets, and try to start fixing the bugs that have cropped up with some of the plugins. 1.2.2 might also see a few new features as we start preparing for some exciting changes and additions we have planned for 1.3.

MooTools 1.2 will be the last version of MooTools to support Safari 2 and Opera 9.5. These browsers have been advancing at a tremendous pace, and have a user base which updates regularly, so we don’t think this will be much of an issue when the time comes. Note that you don’t need to worry about this for quite some time yet because 1.3 is a long way off, but we just thought this was a good place to let everyone know.

Working With Video From Ruby

With only the performance of a scripting language, Ruby isn't considered a particularly suitable choice for intense video work (direct transcoding, encoding, and the like.). Nonetheless, there are a handful of Ruby libraries and Ruby-based technologies you can use to work with video and movie files - primarily through interacting with faster tools or libraries.

RMov (Ruby Quicktime Library)
RMov
is an awesome new Ruby library by Ryan Bates that wraps around Apple's QuickTime API and allows you to open, edit, and export QuickTime movies from within Ruby. It is, unfortunately, OS X only.

RVideo (Ruby Video Processing)
RVideo (Github) is a Ruby library that interfaces with tools like ffmpeg to let you inspect and process video and audio files. For example, you can use RVideo to help you convert videos into FLVs.

Panda (Video Encoding and Streaming Platform)
Panda
is a Ruby-powered open source "video uploading, encoding and streaming" solution. While it uses Ruby as an interface (in the shape of a Merb application), it relies on tried and tested tools like FFMpeg to do the heavy lifting but may be perfect if you have an Amazon EC2 account and fancy offloading the CPU intense video work.

Hey!Spread (Video Promotion Web Service)
Hey!Spread makes it easy to upload videos to YouTube and Google Video - each operation essentially becoming a method.

Fliqz4R ("White-Label YouTube" API)
Fliqz is a provider of "plug and play video solutions." Effectively they provide the backend infrastructure for hosting and playing videos, a kind of white-label YouTube, if you will. Libin Pan has put together a tutorial that demonstrates how to use Fliqz from Ruby / Rails using the Fliqz4R Rails plugin.

http://www.rubyinside.com/ruby-video-library-1259.html

Wednesday, October 15, 2008

FullAjax

AJAX (Asynchronous JavaScript and
XML — ŠŃŠøŠ½Ń…Ń€Š¾Š½Š½Ń‹Š¹ JavaScript Šø XML) — этŠ¾ ŠæŠ¾Š“хŠ¾Š“ Šŗ ŠæŠ¾ŃŃ‚Ń€Š¾ŠµŠ½Šøю ŠøŠ½Ń‚ŠµŃ€Š°ŠŗтŠøŠ²Š½Ń‹Ń… ŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŠµŠ»ŃŒŃŠŗŠøх ŠøŠ½Ń‚ŠµŃ€Ń„ŠµŠ¹ŃŠ¾Š² Š²ŠµŠ±-ŠæрŠøŠ»Š¾Š¶ŠµŠ½ŠøŠ¹. ŠŸŃ€Šø ŠøсŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Š½ŠøŠø AJAX Š²ŠµŠ±-стрŠ°Š½ŠøцŠ° Š½Šµ ŠæŠµŃ€ŠµŠ·Š°Š³Ń€ŃƒŠ¶Š°ŠµŃ‚ся ŠæŠ¾Š»Š½Š¾ŃŃ‚ŃŒŃŽ Š² Š¾Ń‚Š²ŠµŃ‚ Š½Š° ŠŗŠ°Š¶Š“Š¾Šµ Š“ŠµŠ¹ŃŃ‚Š²ŠøŠµ ŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŠµŠ»Ń. Š’Š¼ŠµŃŃ‚Š¾ этŠ¾Š³Š¾ с Š²ŠµŠ±-сŠµŃ€Š²ŠµŃ€Š° Š“Š¾Š³Ń€ŃƒŠ¶Š°ŃŽŃ‚ся тŠ¾Š»ŃŒŠŗŠ¾ Š½ŃƒŠ¶Š½Ń‹Šµ ŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŠµŠ»ŃŽ Š“Š°Š½Š½Ń‹Šµ.

AHAH (Asynchronous HTML and HTTP — ŠŃŠøŠ½Ń…Ń€Š¾Š½Š½Ń‹Š¹ HTML Šø HTTP) — этŠ¾ ŠæŠ¾Š“хŠ¾Š“ Š“Š»Ń Š“ŠøŠ½Š°Š¼ŠøчŠµŃŠŗŠ¾Š³Š¾ Š¾Š±Š½Š¾Š²Š»ŠµŠ½Šøя Š²ŠµŠ±-стрŠ°Š½Šøц, ŠøсŠæŠ¾Š»ŃŒŠ·ŃƒŃ Javascript, ŠæŠ¾Š“Š¾Š±Š½Ń‹Š¹ AJAX, Š½Š¾ Š¾Ń‚Š»ŠøчŠ°ŃŽŃ‚ся тŠµŠ¼, чтŠ¾ Š¾Ń‚Š²ŠµŃ‚Ń‹ сŠµŃ€Š²ŠµŃ€Š° Š“Š¾Š»Š¶Š½Ń‹ Š±Ń‹Ń‚ŃŒ тŠµŠŗстŠ¾Š¼ ŠøŠ»Šø уŠ¶Šµ Š²ŠŗŠ»ŃŽŃ‡Š°Ń‚ŃŒ Š“ŠµŠ¹ŃŃ‚Š²ŠøтŠµŠ»ŃŒŠ½ŃƒŃŽ струŠŗтуру XHTML/HTML.

Fullajax = AJAX + AHAH — тŠµŃ…Š½Š¾Š»Š¾Š³Šøя, ŠæŠ¾Š“хŠ¾Š“ Šŗ ŠæŠ¾ŃŃ‚Ń€Š¾ŠµŠ½Šøю, ŠæŠµŃ€ŠµŠ²Š¾Š“у сŠ°Š¹Ń‚Š¾Š² Šø Š²ŠµŠ±-ŠæрŠøŠ»Š¾Š¶ŠµŠ½ŠøŠ¹ Š½Š° AJAX. ŠŠ°ŠæрŠ°Š²Š»ŠµŠ½ Š½Š° Š²Ń‹Ń€Š°Š±Š¾Ń‚Šŗу ŠæрŠ°Š²ŠøŠ» Šø Š¼ŠµŃ‚Š¾Š“Š¾Š² Š¼Š°ŠŗсŠøŠ¼Š°Š»ŃŒŠ½Š¾Š³Š¾ Š²Š½ŠµŠ“рŠµŠ½Šøя Š²ŃŠµŠ¹ Š¼Š¾Ń‰Š½Š¾ŃŃ‚Šø AJAX & AHAH. ŠŠ°ŃˆŠ° тŠµŃ…Š½Š¾Š»Š¾Š³Šøя уŠ¼ŠµŠ½ŃŒŃˆŠ°ŠµŃ‚ сŠ»Š¾Š¶Š½Š¾ŃŃ‚ŃŒ Šø рŠ°ŃŃˆŠøряŠµŃ‚ уŠ·ŠŗŠ¾Š½Š°ŠæрŠ°Š²Š»ŠµŠ½Š½Š¾ŃŃ‚ŃŒ Š¾Š±Š»Š°ŃŃ‚Šø ŠæрŠøŠ¼ŠµŠ½ŠµŠ½Šøя AJAX.

http://fullajax.ru/

Javascript Event onJSReady Fires When All JS Files Have Loaded

David Kees has written about Using Prototype to Load Javascript Files, which is an implementation of the general technique of loading functionality via scripts based on the availability of DOM elements.

http://ajaxian.com/archives/lazily-load-functionality-via-unobtrusive-scripts
http://www.stefanhayden.com/blog/2008/07/29/javascript-event-onjsready-fires-when-all-js-files-have-loaded/

curvyCorners

curvyCorners is a free JavaScript program that will create on-the-fly rounded corners for any HTML DIV element, that look as good as any graphically created corners.

http://www.curvycorners.net

Microsoft Silverlight 2.0

Microsoft Silverlight extends your existing development skills, empowering you to build new types of applications for the Web regardless of target platform or browser. Rapidly create compelling rich Web applications using all the familiar features, languages and tools of the .NET framework.

http://www.microsoft.com/silverlight/default.aspx

Sunday, October 12, 2008

Ruby In Steel. New Free Edition includes Visual Studio

SapphireSteel Software today released a free edition of Ruby In Steel, the Ruby and Rails IDE for Microsoft Visual Studio 2008.

Ruby In Steel Personal Edition (PE) 2008 provides all the tools needed to develop and maintain Ruby or Rails projects including syntax sensitive customizable code coloring and code folding, numerous coding tools such as auto-indenting, code reformatting, bracket and keyword matching and integrated consoles to allow users to interact with the Ruby interpreter in docked or floating windows. Ruby In Steel PE 2008 even includes a free copy of Visual Studio 2008 for Ruby!

Ruby In Steel PE 2008 is available for personal or commercial development. It does not require registration and it does not time out. It comes with an ‘All-in-One’ installer to allow users to install all the software required including: Visual Studio 2008 (‘Shell edition’), Ruby, Rails, MySQL and Ruby In Steel. Alternatively, users who already own a commercial edition of Visual Studio 2008 may install Ruby In Steel into that.


The ‘All-in-one’ installer

Ruby In Steel PE 2008 provides numerous features for Ruby and Rails developers such as:
- Code Coloring (Ruby)
- Code Coloring (Erb/RHTML)
- Code Folding (Ruby)
- Code Folding (Erb/RHTML)
- Color schemes/customization
- Bracket matching (move cursor)
- Bracket highlighting
- Keyword..end matching (move cursor)
- Block comment/uncomment
- Multi-level undo/redo
- Tabbed (multi-file) editing
- Split-window editing
- Auto Indent/outdent
- Smart Indenting
- Auto end-completion (e.g. auto add ‘end’ after ‘def’)
- Code Reformatting
- Project Management in the Solution Explorer
- Open command prompt in selected directory
- Dockable IRB Console
- Run Ruby in integrated interactive console
- Comprehensive PDF User Guide/Manual
- Integrated Help
- All-in-one Installer
- Supports Ruby 1.8.6 and 1.8.7, Rails 1, Rails 2.1

http://www.sapphiresteel.com/Ruby-In-Steel-New-Free-Edition
Download (175Mb)

Monday, October 6, 2008

How to install ruby gem locally (for current site only)

1. Install gem locally on your development machine:

$ cd /projects/my_webapp
$ gem install acts_as_versioned -i ./lib

Now in addition to your global gem path, you have "./lib" path for your personal gems.

2. How to tell Ruby about your path:
$ cd my_webapp/config/environment/

Edit development.rb:
Gem.use_paths(nil,["#{RAILS_ROOT}/lib"])

The same operation must be done on test.rb and production.rb.

glTail.rb - Realtime logfile visualization

View real-time data and statistics from any logfile on any server with SSH, in an intuitive and entertaining way.

Features:
  • Real-Time
  • Multiple logfiles on multiple servers
  • Configurable layout
  • Multiple logfile parsers (Apache Combined, Rails, IIS, Postfix/spamd/clamd, Nginx, Squid, PostgreSQL, PureFTPD, MySQL, TShark, qmail/vmpop3d)
  • Custom events
  • Show rate, total or average
  • If you can 'tail' it, you can visualize it
  • Written in Ruby using net-ssh & ruby-opengl
  • Free! (GPLv2)
http://www.fudgie.org/

Sunday, October 5, 2008

Logstalgia: Web server access log visualizer

Logstalgia (aka ApachePong) replays or streams a standard website access log (eg access.log) as a retro arcade game-like simulation.

Requirements
The display is rendered using OpenGL and requires a 3D accelerated video card to run.

An example access log is included.

Example Command Lines
logstalgia /var/log/apache/access.log

Watch a log file from in a window, using the default groups.

tail -f /var/log/apache/access.log | logstalgia -

Watch the log in real time as new requests come in (requires tail). Note that ’-’ at the end is required for logstalgia to know it needs to read from STDIN.

ssh user@yourserver.com tail -f /var/log/apache/access.log | logstalgia -g "Ad Clicks,/adclick.php,30" -

Watching the log in realtime again, but this time tailing a log from a remote location over ssh. -g groups together URLs requested containing the string ’/adclick.php’ under the heading ’Ad Clicks’.

Note: tailing remote logs is not currently recommended on the Windows version due to buffering issues.

http://code.google.com/p/logstalgia/

RaphaĆ«l—JavaScript Library

Raphaƫl is a small JavaScript library that should simplify your work with vector graphics on the web. In case you want to create your own specific chart or image crop-n-rotate widget, you can simply achieve it with this library.

RaphaĆ«l uses SVG and VML as a base for graphics creation. Because of that every created object is a DOM object so you can attach JavaScript event handlers or modify objects later. RaphaĆ«l’s goal is to provide an adapter that will make drawing cross-browser and easy. Currently library supports Firefox 3.0+, Safari 3.0+, Opera 9.5+ and Internet Explorer 6.0+.

http://raphaeljs.com/

PrototypeXtensions.js

PrototypeXtensions is a JavaScript library based on the frameworks Prototype.js and Script.aculo.us. The objective of this library is to provide an extension "low level" composed of useful methods and basic components, and components "high level", more dedicated to the user interface. Available components : Core, History, Ajax.History, Tabs

http://www.prototypextensions.com/

Prototype 1.6.0.3 out there

Just a short one, Prototype has a new point release that is a drop in replacement for your 1.6.* code:

Yesterday we released Prototype 1.6.0.3, the result of some much-needed bug fixes, and a stopgap release on the road to 1.6.1.

It’s a backwards-compatible, drop-in replacement recommended for all users of Prototype 1.6. We’ve fixed 30 bugs and made 25 other improvements to our already-rock-solid library.

Developers who follow along in Git might’ve noticed that the repository has seen a lot of disruptive activity in the last few days as we reassessed many of the commits that had gone into the library since April. Rather than try to fit too many fixes into one release, we decided to scale back and release 1.6.0.3 with the set of improvements we were in complete agreement on.

We also updated the Google CDN so you can use Google to host your file via: http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js. We have also aliased “1.6″, and “1.6.0″ to this latest release, so if you are using that version, you automatically have the latest.

http://ajaxian.com/archives/prototype-1603-out-there