<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <title>Prototype JavaScript framework - blog</title>
  <id>tag:prototypejs.org,2009:mephisto/blog</id>
  <generator uri="http://mephistoblog.com" version="0.7.3">Mephisto Noh-Varr</generator>
  <link href="http://prototypejs.org/feed/blog/atom.xml" rel="self" type="application/atom+xml" />
  <link href="http://prototypejs.org/blog" rel="alternate" type="text/html" />
  <updated>2009-06-16T22:23:13Z</updated>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>Andrew</name>
    </author>
    <id>tag:prototypejs.org,2009-06-16:25365</id>
    <published>2009-06-16T22:21:00Z</published>
    <updated>2009-06-16T22:23:13Z</updated>
    <category term="blog" />
    <category term="Featured" />
    <category term="Releases" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/yuOblz1fWLc/prototype-1-6-1-rc3-chrome-support-and-pdoc" rel="alternate" type="text/html" />
    <title>Prototype 1.6.1 RC3: Chrome support and PDoc</title>
<summary type="html">&lt;p&gt;Today we’re announcing Release Candidate 3 of Prototype 1.6.1. Among the highlights of this release are official Chrome support, improved IE8 compatibility, faster generation of API documentation with &lt;a href="http://pdoc.org/" title="PDoc"&gt;PDoc&lt;/a&gt;, and lots of bug fixes.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Today we’re announcing Release Candidate 3 of Prototype 1.6.1. Among the highlights of this release are official Chrome support, improved IE8 compatibility, faster generation of API documentation with &lt;a href="http://pdoc.org/" title="PDoc"&gt;PDoc&lt;/a&gt;, and lots of bug fixes.&lt;/p&gt;
&lt;h3&gt;Chrome support&lt;/h3&gt;

&lt;p&gt;Since &lt;a href="http://www.google.com/chrome" title="Google Chrome - Download a new browser"&gt;Google Chrome&lt;/a&gt; is a close sibling of Safari, Prototype has had excellent Chrome compatibility ever since the browser was first released. Now we’re making it official: Prototype supports Chrome 1.0 and greater.&lt;/p&gt;

&lt;p&gt;If you have Chrome installed on your system (Windows only for now, even though early alphas exist for Mac), invoking &lt;code&gt;rake test&lt;/code&gt; will run the unit tests in all locally-installed browsers, including Chrome. To run the unit tests in Chrome alone, try &lt;code&gt;rake test BROWSERS=chrome&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Generate your own docs with PDoc&lt;/h3&gt;

&lt;p&gt;It’s been a long, strange trip for &lt;a href="http://pdoc.org/" title="PDoc"&gt;PDoc&lt;/a&gt;, the inline-doc tool that will soon be for Prototype and &lt;a href="http://script.aculo.us/" title="script.aculo.us - web 2.0 javascript"&gt;script.aculo.us&lt;/a&gt; what &lt;a href="http://rdoc.sourceforge.net/" title="RDoc - Document Generator for Ruby Source"&gt;RDoc&lt;/a&gt; is for &lt;a href="http://rubyonrails.org/" title="Ruby on Rails"&gt;Rails&lt;/a&gt;. It started as Tobie’s brainchild over a year ago, but key contributions from &lt;a href="http://jcoglan.com/" title="James Coglan"&gt;James Coglan&lt;/a&gt; and &lt;a href="http://github.com/samleb" title="samleb's Profile - GitHub"&gt;Samuel Lebeau&lt;/a&gt; have helped to carry it across the finish line.&lt;/p&gt;

&lt;p&gt;PDoc was a part of RC2, but has since been updated to make doc generation &lt;em&gt;much, much&lt;/em&gt; faster. On my machine, a process that used to take 20 minutes now takes only &lt;em&gt;60 seconds&lt;/em&gt;. Furthermore, we’ve solved a couple of minor issues that made it hard to build the docs on Windows.&lt;/p&gt;

&lt;p&gt;Ever since Prototype 1.5, we’ve kept our documentation in &lt;a href="http://mephistoblog.com/" title="Mephisto—The best blogging system ever"&gt;Mephisto&lt;/a&gt;, the same engine that powers the rest of the site (and this blog). It’s served us well, but it meant that updating the docs became a chore that could only be started once we’d released a particular version. PDoc will make it far easier to maintain our documentation — and far easier to keep archival copies of the docs for older versions of Prototype.&lt;/p&gt;

&lt;p&gt;Upon final release of 1.6.1, we’ll put the generated docs on this site, just like Rails hosts &lt;a href="http://api.rubyonrails.org/" title="Rails Framework Documentation"&gt;its most recent stable documentation&lt;/a&gt;. Until then, you can generate your own local docs by checking out the full source and running &lt;code&gt;rake doc&lt;/code&gt; from the command line.&lt;/p&gt;

&lt;h3&gt;Other improvements&lt;/h3&gt;

&lt;p&gt;There have also been a number of bugs fixed since RC2 — including a heinous bug relating to &lt;code&gt;Event#observe&lt;/code&gt; — and a number of key optimizations. We’ve further improved IE8 compatibility, solving some edge-case issues that popped up since RC2. Credit goes to Juriy (kangax), our newest team member, for working tirelessly these last few months to make 1.6.1 faster and less reliant on browser sniffs.&lt;/p&gt;

&lt;h3&gt;Download, report bugs, and get help&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="/assets/2009/6/16/prototype.js"&gt;Download Prototype 1.6.1 RC3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://prototype.lighthouseapp.com"&gt;Submit bug reports&lt;/a&gt; to Lighthouse&lt;/li&gt;
&lt;li&gt;&lt;a href="/discuss"&gt;Get Prototype help&lt;/a&gt; on the mailing list or &lt;code&gt;#prototype&lt;/code&gt; IRC channel&lt;/li&gt;
&lt;li&gt;&lt;a href="http://groups.google.com/group/prototype-core"&gt;Interact with the Core Team&lt;/a&gt; on the protoype-core mailing list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to the many contributors who made this release possible!&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=yuOblz1fWLc:8DamXzxIfPs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=yuOblz1fWLc:8DamXzxIfPs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=yuOblz1fWLc:8DamXzxIfPs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2009/6/16/prototype-1-6-1-rc3-chrome-support-and-pdoc</feedburner:origLink></entry>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>Andrew</name>
    </author>
    <id>tag:prototypejs.org,2009-03-27:25040</id>
    <published>2009-03-27T23:33:00Z</published>
    <updated>2009-03-27T23:39:26Z</updated>
    <category term="blog" />
    <category term="Featured" />
    <category term="Releases" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/un2FVWWZ23I/prototype-1-6-1-rc2-ie8-compatibility-element-storage-and-bug-fixes" rel="alternate" type="text/html" />
    <title>Prototype 1.6.1 RC2: IE8 compatibility, Element storage, and bug fixes</title>
<summary type="html">&lt;p&gt;Today we tagged the first public release candidate of Prototype 1.6.1. (What happened to RC1? Long story.) While there are more minor fixes we’d like to get into this release, we decided an interim release was necessary because of the final release of &lt;a href="http://www.microsoft.com/windows/Internet-explorer/default.aspx"&gt;Internet Explorer 8&lt;/a&gt; last week.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Today we tagged the first public release candidate of Prototype 1.6.1. (What happened to RC1? Long story.) While there are more minor fixes we’d like to get into this release, we decided an interim release was necessary because of the final release of &lt;a href="http://www.microsoft.com/windows/Internet-explorer/default.aspx"&gt;Internet Explorer 8&lt;/a&gt; last week.&lt;/p&gt;
&lt;p&gt;This is the first public release of Prototype that is fully compatible — and fully &lt;em&gt;optimized for&lt;/em&gt; — Internet Explorer 8’s “super-standards” mode. In particular, Prototype now takes advantage of IE8’s support of the &lt;a href="http://www.w3.org/TR/selectors-api/" title="Selectors API"&gt;Selectors API&lt;/a&gt; and its ability to extend the prototypes of DOM elements.&lt;/p&gt;

&lt;h3&gt;What’s new?&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Full compatibility with Internet Explorer 8&lt;/strong&gt;. &lt;a href="http://thinkweb2.com/projects/prototype/" title="perfection kills"&gt;Juriy&lt;/a&gt; has spearheaded the effort to replace most of our IE “sniffs” into outright capability checks — making it far easier to support IE8 in both “super-standards” mode and compatibility mode.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Element storage&lt;/strong&gt;, a feature &lt;a href="http://prototypejs.org/2009/2/16/pimp-my-code-1-element-storage" title="Prototype JavaScript framework: Pimp My Code #1: Element.Storage"&gt;announced previously&lt;/a&gt;. Safely associate complex metadata with individual elements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;mouseenter&lt;/code&gt; and &lt;code&gt;mouseleave&lt;/code&gt;&lt;/strong&gt; events — simulating the IE-proprietary events that tend to be far more useful than &lt;code&gt;mouseover&lt;/code&gt; and &lt;code&gt;mouseout&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An &lt;code&gt;Element#clone&lt;/code&gt; method&lt;/strong&gt; for cloning DOM nodes in a way that lets you perform “cleanup” on the new copies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;What’s been improved?&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Better housekeeping on event handlers in order to prevent memory leaks.&lt;/li&gt;
&lt;li&gt;Better performance in &lt;code&gt;Function#bind&lt;/code&gt;, &lt;code&gt;Element#down&lt;/code&gt;, and a number of other often-used methods.&lt;/li&gt;
&lt;li&gt;A number of bug fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consult the &lt;a href="http://github.com/sstephenson/prototype/blob/6c38d842544159d2334f2252c9015c737d5046b0/CHANGELOG" title="CHANGELOG at 6c38d842544159d2334f2252c9015c737d5046b0 from sstephenson's prototype - GitHub"&gt;CHANGELOG&lt;/a&gt; for more details.&lt;/p&gt;

&lt;p&gt;In addition to the code itself, the 1.6.1 release features Prototype’s embrace of two other excellent projects we’ve been working on: &lt;a href="http://getsprockets.org/" title="JavaScript dependency management and concatenation: Sprockets"&gt;Sprockets&lt;/a&gt; (JavaScript concatenation) and &lt;a href="http://pdoc.org/" title="PDoc"&gt;PDoc&lt;/a&gt; (inline documentation). Sprockets is now used to “build” Prototype into a single file for distribution. PDoc will be the way we document the framework from now on. The official API docs aren’t quite ready yet, but they’ll be ready for the final release of 1.6.1.&lt;/p&gt;

&lt;h3&gt;Download, Report Bugs, and Get Help&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="/assets/2009/3/27/prototype.js"&gt;Download Prototype 1.6.1_rc2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://prototype.lighthouseapp.com/projects/8886-prototype/overview"&gt;Submit bug reports&lt;/a&gt; to Lighthouse&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://prototypejs.org/discuss"&gt;Get Prototype help&lt;/a&gt; on the rails-spinoffs mailing list or #prototype &lt;span class="caps"&gt;IRC&lt;/span&gt; channel&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://groups.google.com/group/prototype-core"&gt;Interact with the Core Team&lt;/a&gt; on the prototype-core mailing list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to the many contributors who made this release possible!&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=un2FVWWZ23I:UsTuwnCE3Iw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=un2FVWWZ23I:UsTuwnCE3Iw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=un2FVWWZ23I:UsTuwnCE3Iw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2009/3/27/prototype-1-6-1-rc2-ie8-compatibility-element-storage-and-bug-fixes</feedburner:origLink></entry>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>Andrew</name>
    </author>
    <id>tag:prototypejs.org,2009-02-20:24708</id>
    <published>2009-02-20T01:59:00Z</published>
    <updated>2009-02-20T02:01:06Z</updated>
    <category term="blog" />
    <category term="Featured" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/Fou0BVhTbe0/sprockets-beautiful-and-angular" rel="alternate" type="text/html" />
    <title>Sprockets: Beautiful and angular</title>
<summary type="html">&lt;p&gt;&lt;a href="http://www.37signals.com/svn/posts/1587-introducing-sprockets-javascript-dependency-management-and-concatenation" title="Introducing Sprockets: JavaScript dependency management and concatenation - (37signals)"&gt;Over at SvN&lt;/a&gt;, Sam announced the 1.0 release of &lt;a href="http://getsprockets.org/" title="JavaScript dependency management and concatenation: Sprockets"&gt;Sprockets&lt;/a&gt;, the new dependency management and concatenation tool that makes it easy to modularize your JavaScript. Sprockets is Prototype’s new build system, but it’s also been &lt;a href="http://github.com/sstephenson/sprockets/tree/master" title="sstephenson's sprockets at master - GitHub"&gt;extracted into a Ruby library&lt;/a&gt; so &lt;em&gt;you&lt;/em&gt; can use it anywhere you write JavaScript.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;&lt;a href="http://www.37signals.com/svn/posts/1587-introducing-sprockets-javascript-dependency-management-and-concatenation" title="Introducing Sprockets: JavaScript dependency management and concatenation - (37signals)"&gt;Over at SvN&lt;/a&gt;, Sam announced the 1.0 release of &lt;a href="http://getsprockets.org/" title="JavaScript dependency management and concatenation: Sprockets"&gt;Sprockets&lt;/a&gt;, the new dependency management and concatenation tool that makes it easy to modularize your JavaScript. Sprockets is Prototype’s new build system, but it’s also been &lt;a href="http://github.com/sstephenson/sprockets/tree/master" title="sstephenson's sprockets at master - GitHub"&gt;extracted into a Ruby library&lt;/a&gt; so &lt;em&gt;you&lt;/em&gt; can use it anywhere you write JavaScript.&lt;/p&gt;
&lt;p&gt;There are many great ways to use Sprockets in your own projects. You can use it the way Prototype does — split up your JavaScript into small, maintainable files, then &lt;a href="http://github.com/sstephenson/prototype/blob/ab1313ea202e0d0bfb7cd0f563b035040710da9b/src/dom.js" title="src/dom.js at ab1313ea202e0d0bfb7cd0f563b035040710da9b from sstephenson's prototype - GitHub"&gt;create “meta-files”&lt;/a&gt; that include the smaller files in a logical order. Prototype had previously been doing this with plain ERB; now we integrate Sprockets as a Git submodule and use it to build our distributable file.&lt;/p&gt;

&lt;p&gt;Sprockets can also be used to write JavaScript “plugins”: bundles of files that can easily be integrated into existing code. With Sprockets, &lt;a href="http://getsprockets.org/installation_and_usage#specifying_dependencies_with_the_require_directive" title="JavaScript dependency management and concatenation: Sprockets"&gt;you can formally declare&lt;/a&gt; that &lt;code&gt;foo.js&lt;/code&gt; depends on &lt;code&gt;thud.js&lt;/code&gt;; when your files are concatenated into one output file, &lt;code&gt;thud.js&lt;/code&gt; will be included first.&lt;/p&gt;

&lt;p&gt;In addition, &lt;a href="http://getsprockets.org/installation_and_usage#bundling_assets_with_the_provide_directive" title="JavaScript dependency management and concatenation: Sprockets"&gt;Sprockets lets JavaScript files &lt;em&gt;provide&lt;/em&gt; other assets&lt;/a&gt; — HTML, CSS, images, and the like. At build time, those assets will be copied into the document root of your server (in a way that preserves the sub-structure of directories within). This allows the plugin to refer to those assets via absolute URLs, instead of having to ask you where they’re located.&lt;/p&gt;

&lt;p&gt;A few facts are worth special mention.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sprockets does not require Prototype.&lt;/strong&gt; Sprockets directives can be inserted into any arbitrary JavaScript file. You can use Sprockets in your build system no matter which JavaScript framework you prefer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sprockets does not require Rails.&lt;/strong&gt; Sam has also written an excellent &lt;code&gt;sprockets-rails&lt;/code&gt; plugin, one which deftly applies the conventions of Rails plugins to JavaScript. But he has also written a &lt;a href="http://github.com/sstephenson/sprockets/blob/e0ddeaf4c2f1e9e175df6dc909afd78057326a42/ext/nph-sprockets.cgi" title="ext/nph-sprockets.cgi at e0ddeaf4c2f1e9e175df6dc909afd78057326a42 from sstephenson's sprockets - GitHub"&gt;generic CGI wrapper around Sprockets&lt;/a&gt; that is framework-agnostic. Or, instead, you can integrate Sprockets into your build cycle without bothering your server stack with the details. If you use Rake, you can do this with Ruby, as Prototype does; otherwise you can use the &lt;code&gt;sprocketize&lt;/code&gt; binary from the command line.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sprockets-enabled JavaScript files can work just fine without Sprockets.&lt;/strong&gt; If your plugin has its own “build stage,” then the distributable JavaScript will include no Sprockets directives. On the other hand, if your plugin is small enough not to require this overhead, your distributable can be a short JS file that declares its external dependencies at the top. Because &lt;code&gt;require&lt;/code&gt; directives are an extension of comment syntax, they won’t confuse a JS interpreter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, we’re excited about what Sprockets means for the Prototype ecosystem. If you maintain a Prototype add-on library, the &lt;a href="http://groups.google.com/group/prototype-core" title="Prototype: Core | Google Groups"&gt;prototype-core mailing list&lt;/a&gt; would love to help you make it Sprockets-aware.&lt;/p&gt;

&lt;p&gt;Now is the time on Sprockets when we dance.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=Fou0BVhTbe0:CA_XA968tkY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=Fou0BVhTbe0:CA_XA968tkY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=Fou0BVhTbe0:CA_XA968tkY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2009/2/20/sprockets-beautiful-and-angular</feedburner:origLink></entry>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>Andrew</name>
    </author>
    <id>tag:prototypejs.org,2009-02-16:24535</id>
    <published>2009-02-16T08:41:00Z</published>
    <updated>2009-04-08T14:48:20Z</updated>
    <category term="blog" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/9Y2giB4vZLc/pimp-my-code-1-element-storage" rel="alternate" type="text/html" />
    <title>Pimp My Code #1: Element.Storage</title>
<summary type="html">&lt;p&gt;Man, it's quiet around here. Interested in doing some pimpin'?&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Man, it's quiet around here. Interested in doing some pimpin'?&lt;/p&gt; 
&lt;p&gt;WAIT! COME BACK.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code&lt;/em&gt; pimping. You know? &lt;a href="http://prototypejs.org/2008/10/7/want-your-code-pimped" title="Prototype JavaScript framework: Want your code 'pimped'?"&gt;The thing I'd discussed before&lt;/a&gt;? Forgive my earlier informality. I see now how my words could have been confusing.&lt;/p&gt;

&lt;p&gt;The very first edition of &lt;cite&gt;Pimp My Code&lt;/cite&gt; is special because the code we’ll be looking at &lt;em&gt;will be included in Prototype 1.6.1&lt;/em&gt;. (It's a bit like if we were to Pimp [someone's] Ride™, then decide to keep the car for ourselves.) So this is more than just an academic exercise for us — the “pimped” result is now part of the Prototype source code.&lt;/p&gt;

&lt;h3&gt;The Original&lt;/h3&gt;

&lt;p&gt;The code in question, from Sébastien Grosjean (a.k.a. ZenCocoon), implements element “storage” — attaching of arbitrary data to DOM nodes in a safe and leak-free manner. Other frameworks have had this for a while; &lt;a href="http://jquery.com/" title="jQuery: The Write Less, Do More, JavaScript Library"&gt;jQuery&lt;/a&gt;’s &lt;code&gt;$.fn.data&lt;/code&gt;, for instance, is used heavily by jQuery plugin authors &lt;a href="http://docs.jquery.com/Internals/jQuery.data" title="Internals/jQuery.data - jQuery JavaScript Library"&gt;to great effect&lt;/a&gt;. But Seb’s is based on the similar Mootools API, which I’ve admired since &lt;a href="http://mootools.net/blog/2008/01/22/whats-new-in-12-element-storage/" title="MooTools - What’s New in 1.2: Element Storage"&gt;it debuted in Mootools 1.2&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here’s Seb’s code. It’s a long code block, since he’s been thoughtful enough to comment the hell out of it:&lt;/p&gt;

&lt;p&gt;The idea is this: instead of storing arbitrary objects as properties on DOM nodes, create &lt;em&gt;one&lt;/em&gt; custom property on the DOM node: an index to a global hashtable. The value of that key in the table will itself be a collection of custom key/value pairs. On top of avoiding nasty IE memory leaks (circular references between DOM objects and JS objects), this has the benefit of encapsulating all of an element’s custom metadata into one place.&lt;/p&gt;

&lt;p&gt;Let’s make a first pass at this, line-by-line.&lt;/p&gt;

&lt;h3&gt;The Critique&lt;/h3&gt;

&lt;pre&gt;&lt;code class=""&gt;Object.extend(Prototype, {UID: 1});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Already we’ve gotten to something I’d change. Seb is using the &lt;code&gt;Prototype&lt;/code&gt; namespace correctly here, in that he’s storing something that’s of concern only to the framework and should feel “private.” But my own preference is to move this property into the &lt;code&gt;Element.Storage&lt;/code&gt; namespace. I am fickle and my mind is hard to read.&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;Element.Storage = {
  get: function(uid) {
    return (this[uid] || (this[uid] = {}));
  },

  init: function(item) {
    return (item.uid || (item.uid = Prototype.UID++));
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;OK, another change jumps out at me. The &lt;code&gt;Element.Storage.init&lt;/code&gt; method gets called in both &lt;code&gt;Element#store&lt;/code&gt; and &lt;code&gt;Element#retrieve&lt;/code&gt;; it handles the case where an element doesn’t have any existing metadata. It creates our custom property on the node and increments the counter.&lt;/p&gt;

&lt;p&gt;In other words, &lt;code&gt;store&lt;/code&gt; and &lt;code&gt;retrieve&lt;/code&gt; are the only two places where this method is needed, so I balk at making it public. My first instinct was to make it a private method inside a closure:&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;(function() {
  function _init(item) {
    return (item.uid || (item.uid = Prototype.UID++));
  }

  // ... rest of storage code
})();&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I started down this path but quickly stopped. Instead, we’re going to refactor this part so that the &lt;code&gt;init&lt;/code&gt; case is handled without the need for a separate method. Let’s move on for now.&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;Element.Methods.retrieve = function(element, property, dflt) {
  if (!(element = $(element))) return;
  if (element.uid == undefined) Element.Storage.init(element);
  var storage = Element.Storage.get(element.uid);
  var prop = storage[property];
  if (dflt != undefined &amp;&amp; prop == undefined)
    prop = storage[property] = dflt;
  return prop;
};&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A few things to mention here.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Variable naming is important. The ideal name for the third parameter of this function would be &lt;code&gt;default&lt;/code&gt;, but that’s off-limits; &lt;code&gt;default&lt;/code&gt; is a reserved word in JavaScript. Seb’s opted for &lt;code&gt;dflt&lt;/code&gt; here, which is clear enough. I’d change it to &lt;code&gt;defaultValue&lt;/code&gt; because I like vowels.&lt;/p&gt;


&lt;p&gt;As an aside: my first instinct was to remove the &lt;code&gt;defaultValue&lt;/code&gt; thing altogether, because I was surprised by the way it behaved. I didn’t find it very intuitive to give &lt;code&gt;Element#retrieve&lt;/code&gt; the capability to &lt;em&gt;store&lt;/em&gt; properties as well. So I took it out.&lt;/p&gt;

&lt;p&gt;I changed my mind several minutes later, when I wrote some code that leveraged element metadata. I had assumed I wouldn’t need the “store a default value” feature often enough to warrant the surprising behavior, but I was &lt;em&gt;spectacularly wrong&lt;/em&gt;. I put it back in. Consider that a lesson on how your API design needs to be grounded in use cases.&lt;/p&gt;

  &lt;/li&gt;

  &lt;li&gt;
    &lt;p&gt;The idiom in the first line is used throughout Prototype and script.aculo.us (and, in fact, should be used more consistently). It runs the argument through &lt;code&gt;$&lt;/code&gt;, but also checks the return value to ensure we got back a DOM node and not &lt;code&gt;null&lt;/code&gt; (as would happen if you passed a non-existent ID). An empty &lt;code&gt;return&lt;/code&gt; is equivalent to &lt;code&gt;return undefined&lt;/code&gt;, which (IMO) is an acceptable failure case. Bonus points, Seb!&lt;/p&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;p&gt;&lt;p&gt;The custom property Seb’s been using is called &lt;code&gt;uid&lt;/code&gt;. I’m going to change this to something that’s both (a) clearly private; (b) less likely to cause a naming collision. In keeping with existing Prototype convention, we’re going to call it &lt;code&gt;_prototypeUID&lt;/code&gt;.&lt;/p&gt;
&lt;/p&gt;
  &lt;/li&gt;

  &lt;li&gt;
     &lt;p&gt;Here’s a nitpick: &lt;code&gt;if (element.uid == undefined)&lt;/code&gt;. The comparison operator (&lt;code&gt;==&lt;/code&gt;) isn’t very precise, so if you’re testing for &lt;code&gt;undefined&lt;/code&gt;, you should use the identity operator (&lt;code&gt;===&lt;/code&gt;). You could also use Prototype’s &lt;code&gt;Object.isUndefined&lt;/code&gt;. In fact, I will.&lt;/p&gt;


    &lt;p&gt;I have a prejudice against the &lt;code&gt;==&lt;/code&gt; operator. Most of the time the semantics of &lt;code&gt;===&lt;/code&gt; are closer to what you &lt;em&gt;mean&lt;/em&gt;. But this has special significance with &lt;code&gt;undefined&lt;/code&gt;, which one encounters often in JavaScript. As an example: when you’re trying to figure out if an optional parameter was passed into a function, you’re looking for &lt;code&gt;undefined&lt;/code&gt;. Any other value, no matter how “falsy” it is, means the parameter &lt;em&gt;was&lt;/em&gt; given; &lt;code&gt;undefined&lt;/code&gt; means it &lt;em&gt;was not&lt;/em&gt;.&lt;/p&gt;


    &lt;p&gt;(Oh, by the way: I am aware of the code screenshot on our homepage that violates the advice I just gave.)&lt;/p&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;p&gt;There are other checks against &lt;code&gt;undefined&lt;/code&gt; in this function. For consistency I’m going to change these to use &lt;code&gt;Object.isUndefined&lt;/code&gt; as well. Also, the check for &lt;code&gt;dflt != undefined&lt;/code&gt; is unnecessary: if that compound conditional passes, it means &lt;code&gt;retrieve&lt;/code&gt; is going to return &lt;code&gt;undefined&lt;/code&gt; anyway, so it doesn’t matter which of the two &lt;code&gt;undefined&lt;/code&gt; values we return.&lt;/p&gt;

  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Man, I’m a bastard, aren’t I? Luckily, &lt;code&gt;Element#store&lt;/code&gt; is similar enough that there’s no new feedback to be given here, so I’m done kvetching.&lt;/p&gt;

&lt;p&gt;Before we rewrite this code to reflect the changes I’ve suggested, we’re going to make a couple design decisions.&lt;/p&gt;

&lt;h3&gt;Feature Design&lt;/h3&gt;

&lt;p&gt;While I was deciding how to replace &lt;code&gt;Element.Storage.init&lt;/code&gt;, I had an idea: rather than use ordinary &lt;code&gt;Object&lt;/code&gt;s to store the data, we should be using Prototype’s &lt;code&gt;Hash&lt;/code&gt;. In other words, we’ll create a global table of &lt;code&gt;Hash&lt;/code&gt; objects, each one representing the custom key-value pairs for a specific element.&lt;/p&gt;

&lt;p&gt;This isn’t just a plumbing change; it’s quite useful to be able to deal with the custom properties in a group rather than just one-by-one. And since &lt;code&gt;Hash&lt;/code&gt; mixes in &lt;code&gt;Enumerable&lt;/code&gt;, interesting use cases emerge: e.g., looping through all properties and acting on those that begin with a certain “namespace.”&lt;/p&gt;

&lt;p&gt;So let’s envision a new method: &lt;code&gt;Element#getStorage&lt;/code&gt;. Given an element, it will return the &lt;code&gt;Hash&lt;/code&gt; object associated with that element. If there isn’t one, it can “initialize” the storage on that element, thus making &lt;code&gt;Element.Storage.init&lt;/code&gt; unnecessary.&lt;/p&gt;

&lt;p&gt;This new method also establishes some elegant parallels: the &lt;code&gt;store&lt;/code&gt; and &lt;code&gt;retrieve&lt;/code&gt; methods are really just aliases for &lt;code&gt;set&lt;/code&gt; and &lt;code&gt;get&lt;/code&gt; on the hash itself. Actually, &lt;code&gt;retrieve&lt;/code&gt; will be a bit more complicated because of the “default value” feature, but we’ll be able to condense &lt;code&gt;store&lt;/code&gt; down to two lines.&lt;/p&gt;

&lt;h3&gt;The Rewrite&lt;/h3&gt;

&lt;p&gt;Enough blathering. Here’s the rewrite:&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;Element.Storage = {
  UID: 1
};&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As promised, I’ve moved the &lt;code&gt;UID&lt;/code&gt; counter. The &lt;code&gt;Element.Storage&lt;/code&gt; object also acts as our global hashtable, but all its keys will be numeric, so the &lt;code&gt;UID&lt;/code&gt; property won’t get in anyone’s way.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Element#getStorage&lt;/code&gt; assumes the duties of &lt;code&gt;Element.Storage.get&lt;/code&gt; and &lt;code&gt;Element.Storage.init&lt;/code&gt;, thereby making them obsolete. We’ve removed them.&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;Element.addMethods({
  getStorage: function(element) {
    if (!(element = $(element))) return;

    if (Object.isUndefined(element._prototypeUID))
      element._prototypeUID = Element.Storage.UID++;

    var uid = element._prototypeUID;

    if (!Element.Storage[uid])
      Element.Storage[uid] = $H();

    return Element.Storage[uid];
  },&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The new &lt;code&gt;getStorage&lt;/code&gt; method checks for the presence of &lt;code&gt;_prototypeUID&lt;/code&gt;. If it’s not there, it gets defined on the node.&lt;/p&gt;

&lt;p&gt;It then looks for the corresponding &lt;code&gt;Hash&lt;/code&gt; object in &lt;code&gt;Element.Storage&lt;/code&gt;, creating an empty &lt;code&gt;Hash&lt;/code&gt; if there’s nothing there.&lt;/p&gt;

&lt;p&gt;As I said before, &lt;code&gt;Element#store&lt;/code&gt; is much simpler now:&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;  store: function(element, key, value) {
    if (!(element = $(element))) return;
    element.getStorage().set(key, value);
    return element;
  },&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I thought about returning the stored value, to make it behave exactly like &lt;code&gt;Hash#set&lt;/code&gt;, but some feedback from others suggested it was better to return the element itself for chaining purposes (as we do with many methods on &lt;code&gt;Element&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;And &lt;code&gt;Element#retrieve&lt;/code&gt; is nearly as simple:&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;  retrieve: function(element, key, defaultValue) {
    if (!(element = $(element))) return;

    var hash = element.getStorage(), value = hash.get(key);

    if (Object.isUndefined(value)) {
      hash.set(key, defaultValue);
      value = defaultValue;
    }

    return value;
  }
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And we’re done.&lt;/p&gt;

&lt;h3&gt;Further refinements&lt;/h3&gt;

&lt;p&gt;In fact, we’re &lt;em&gt;not&lt;/em&gt; done. This is roughly what the code looked like when I first checked in this feature, but some further improvements have been made.&lt;/p&gt;

&lt;p&gt;Since we’d been using a system similar to this to associate event handlers with nodes, we had to rewrite that code to use the new storage API. In doing so, we found that we needed to include &lt;code&gt;window&lt;/code&gt; in our storage system, since it has events of its own. Rather than define a &lt;code&gt;_prototypeUID&lt;/code&gt; property on the global object, we give &lt;code&gt;window&lt;/code&gt; a UID of &lt;code&gt;0&lt;/code&gt; and check for it specifically in &lt;code&gt;Element#getStorage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Also, based on an excellent suggestion, we changed &lt;code&gt;Element#store&lt;/code&gt; so that it could accept an object full of key/value pairs, much like &lt;code&gt;Hash#update&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;In Summation&lt;/h3&gt;

&lt;p&gt;I was happy to come across Sébastien's submission. It was the perfect length for a drive-by refactoring; it made sense as a standalone piece of code, without need for an accompanying screenshot or block of HTML; and it implemented a feature we'd already had on the 1.6.1 roadmap.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="http://github.com/sstephenson/prototype/tree/master" title="sstephenson's prototype at master - GitHub"&gt;get the bleeding-edge Prototype&lt;/a&gt; if you want to try out the code we wrote. Or you can &lt;a href="http://gist.github.com/53924" title="gist: 53924 - GitHub"&gt;grab this gist&lt;/a&gt; if you want to drop the new functionality in alongside 1.6.0.3.&lt;/p&gt;

&lt;p&gt;We're further grateful to Mootools for the API we're stealing. And to &lt;a href="http://www.wilshipley.com/blog/" title="Call Me Fishmeal."&gt;Wil Shipley&lt;/a&gt; for the recurring blog article series we're stealing.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=9Y2giB4vZLc:h0rhkVuUTFk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=9Y2giB4vZLc:h0rhkVuUTFk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=9Y2giB4vZLc:h0rhkVuUTFk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2009/2/16/pimp-my-code-1-element-storage</feedburner:origLink></entry>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>Tobie</name>
    </author>
    <id>tag:prototypejs.org,2008-10-17:22154</id>
    <published>2008-10-17T07:32:00Z</published>
    <updated>2008-10-17T07:33:12Z</updated>
    <category term="blog" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/cGBpHFk_-pw/prototype-linkedin-group" rel="alternate" type="text/html" />
    <title>Prototype Linkedin Group</title>
<summary type="html">&lt;p&gt;When we first &lt;a href="http://prototypejs.org/2008/5/6/prototype-linkedin-group"&gt;launched&lt;/a&gt; the &lt;a href="http://www.linkedin.com/e/gis/99273/13A82A188D9E"&gt;Linkedin Prototype Group&lt;/a&gt;, we weren’t necessarily expecting it to be such a success–it’s over 800 members strong and counting.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;When we first &lt;a href="http://prototypejs.org/2008/5/6/prototype-linkedin-group"&gt;launched&lt;/a&gt; the &lt;a href="http://www.linkedin.com/e/gis/99273/13A82A188D9E"&gt;Linkedin Prototype Group&lt;/a&gt;, we weren’t necessarily expecting it to be such a success–it’s over 800 members strong and counting.&lt;/p&gt;
&lt;p&gt;Also, at the time, there wasn’t much you could do after having joined the group. This has changed with the recent introduction of discussions.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.linkedin.com/groupAnswers?viewQuestionAndAnswers=&amp;amp;gid=99273&amp;amp;discussionID=196323"&gt;One of the first posts&lt;/a&gt; spurred some thoughts about the usefulness and goals of this Linkedin group especially given the high quality of our &lt;a href="http://groups.google.com/group/prototype-scriptaculous"&gt;new mailing list&lt;/a&gt;. (And let me take the opportunity to sincerely thank &lt;a href="http://crowdersoftware.com/"&gt;T.J. Crowder&lt;/a&gt; for all the effort he’s put into it.)&lt;/p&gt;

&lt;p&gt;My initial reaction, based on &lt;a href="http://groups.google.com/group/prototype-scriptaculous/browse_thread/thread/efc72972db79650e"&gt;an early August thread&lt;/a&gt; was to suggest keeping the development-orientated discussions in the mailing list, while expecting more career-orientated ones to take place in the Linkedin group.&lt;/p&gt;

&lt;p&gt;Of course, there’s no way we can nor should be controlling this, and in the end, you will be deciding what will happen where. So I suppose the only real &lt;em&gt;raison d’être&lt;/em&gt; of this post is to advise you of this new feature and open up the debate.&lt;/p&gt;

&lt;p&gt;Thoughts ?&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=cGBpHFk_-pw:g27KyVDtYFs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=cGBpHFk_-pw:g27KyVDtYFs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=cGBpHFk_-pw:g27KyVDtYFs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2008/10/17/prototype-linkedin-group</feedburner:origLink></entry>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>Andrew</name>
    </author>
    <id>tag:prototypejs.org,2008-10-07:22119</id>
    <published>2008-10-07T21:23:00Z</published>
    <updated>2008-10-07T21:24:52Z</updated>
    <category term="blog" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/5eWauAF1H94/want-your-code-pimped" rel="alternate" type="text/html" />
    <title>Want your code "pimped"?</title>
<summary type="html">&lt;p&gt;We decided it’s finally time to implement an idea we had long ago.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;We decided it’s finally time to implement an idea we had long ago.&lt;/p&gt;
&lt;p&gt;I’m an avid reader of the blog of Wil Shipley, a man in the business of writing great apps for OS X. His running code improvment series, &lt;a href="http://www.wilshipley.com/blog/2005/07/i-will-insult-your-code.html" title="Call Me Fishmeal.: I will insult your code!"&gt;Pimp My Code&lt;/a&gt;, takes submissions from readers who think their code needs refactoring. Then Shipley refactors them, explaining the whys and hows along the way. The submissions are small (never more than 75-100 lines), but in rewriting them Shipley always happens upon specific, useful programming tips. I don’t know the first thing about Objective-C, but I find the series fascinating and instructive.&lt;/p&gt;

&lt;p&gt;So we’re going to do something similar on this blog. Do you have a piece of JavaScript you want refactored? Does it use Prototype? Do this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign up for a &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; account if you don’t have one. It’s free and quick.&lt;/li&gt;
&lt;li&gt;Go to &lt;a href="http://gist.github.com/" title="Gist &amp;mdash; GitHub"&gt;Gist&lt;/a&gt;, GitHub’s pastebin app, and paste the code you want us to refactor. Mark it as “private” if you like.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/inbox/new/savetheclocktower"&gt;Message me on GitHub&lt;/a&gt; with the URL to your code snippet. If necessary, explain a bit about what the code does (or should do), but don’t write an epistle or anything.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’ll share the submissions with the rest of the team and we’ll pick a few that we like. Then we’ll dedicate a post to each one, refactoring out loud along the way. We won’t be mean or snarky; this is not a &lt;a href="http://thedailywtf.com/" title="The Daily WTF: Curious Perversions in Information Technology"&gt;DailyWTF&lt;/a&gt;-style exercise.&lt;/p&gt;

&lt;p&gt;To pre-empt the obvious rebuttal: we do not consider this to be an act of charity, or code manna from computer heaven, or a gift from the light-bearers to the huddled masses. Whether we actually “improve” your code is not for us to say. It will, however, illustrate our coding style.&lt;/p&gt;

&lt;p&gt;If that sounds useful to you, then step up! Give us code and ask that it be pimped!&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=5eWauAF1H94:G-WmhzEtjBM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=5eWauAF1H94:G-WmhzEtjBM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=5eWauAF1H94:G-WmhzEtjBM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2008/10/7/want-your-code-pimped</feedburner:origLink></entry>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>Andrew</name>
    </author>
    <id>tag:prototypejs.org,2008-10-07:22118</id>
    <published>2008-10-07T17:39:00Z</published>
    <updated>2008-10-07T19:37:06Z</updated>
    <category term="blog" />
    <category term="Featured" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/7ffph10QC2A/growing-the-community" rel="alternate" type="text/html" />
    <title>Growing the community</title>
<summary type="html">&lt;p&gt;Now that 1.6.0.3 is out, let’s talk about the Prototype community.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Now that 1.6.0.3 is out, let’s talk about the Prototype community.&lt;/p&gt;
&lt;p&gt;A lot of people have been commenting on how quiet it’s been around here over the last few months. There are several reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We were quite busy with behind-the-scenes stuff. Moving to &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt; and &lt;a href="http://lighthouseapp.com"&gt;Lighthouse&lt;/a&gt; was quite the task. As part of that migration we went through all the bugs on the old Rails Trac and were therefore left with a large backlog of bugs that we’d waited too long to address.&lt;/li&gt;
&lt;li&gt;We were quite busy with our day jobs. Only a couple of us are freelancers; the rest work full-time for software companies. And usually there are several people working on Prototype at any one time, but over the summer it’s rarely been more than one or two.&lt;/li&gt;
&lt;li&gt;In an effort to “catch up” with the accumulated tickets, we tried to stuff too much into a single bugfix release. We need to keep releases small and focused; trying to change too much at once tends to disorient us and our users. Once we realized we needed to scale back this release, it took a while to figure out which changes needed to stay and which needed to be reverted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren’t excuses; they’re just explanations. As a team, we agree that we’ve got to prevent such a long release gap from happening again, and to keep an eye out for warning signs like the ones listed above.&lt;/p&gt;

&lt;p&gt;This means, among other things, that we’re planning to move away from a “when it’s ready” release schedule. Instead, we’ll move toward one in which there are several releases per year; whatever &lt;em&gt;is&lt;/em&gt; ready in time for a given release will go in, and whatever &lt;em&gt;is not&lt;/em&gt; will have to wait. That applies to bug fixes and features alike. Eight months between releases just won’t work.&lt;/p&gt;

&lt;h3&gt;What you can do&lt;/h3&gt;

&lt;p&gt;Community outreach was one of the major goals of Prototype Developer Day. Many people are frustrated with the state of the Prototype community and would like to see some changes made. We’re in complete agreement.&lt;/p&gt;

&lt;p&gt;Ideally, as an open-source community grows, those who want to help out gravitate toward specific roles. Those who can grok the source code write patches; those who are good at diagnosing problems file bug reports; those who can write clearly contribute documentation; and so on. We’d love to grow that “halo” around Prototype Core so that things can get done more quickly.&lt;/p&gt;

&lt;p&gt;To be more specific, we would love help in any of these areas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Give support on the &lt;a href="http://groups.google.com/group/prototype-scriptaculous"&gt;Prototype &amp;amp; scrip.aculous mailing list&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://prototype.lighthouseapp.com/projects/8886/home"&gt;File bugs in Lighthouse&lt;/a&gt; when you encounter errors or surprising behavior in Prototype.&lt;/li&gt;
&lt;li&gt;Write test cases or patches for &lt;a href="http://prototype.lighthouseapp.com/projects/8886-prototype/tickets?q=tagged%3A%22needs_tests%22"&gt;existing bugs in Lighthouse&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Discuss the direction of the library and its future on the &lt;a href="http://groups.google.com/group/prototype-core"&gt;Prototype Core mailing list&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Propose new features and implement them.&lt;/li&gt;
&lt;li&gt;Write documentation wherever you feel we need more; &lt;a href="http://prototype.lighthouseapp.com/projects/8886/home"&gt;submit it to Lighthouse&lt;/a&gt; as an enhancement.&lt;/li&gt;
&lt;li&gt;Suggest blog posts. (Or even write them!) &lt;a href="http://groups.google.com/group/prototype-core"&gt;Post to the Prototype Core list&lt;/a&gt; if you’re interested in doing this.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are, of course, many other things one can do to help us out. But if you’re looking for a way to contribute and don’t have something specific in mind, we’d suggest doing one of these seven things.&lt;/p&gt;

&lt;h3&gt;What we can do&lt;/h3&gt;

&lt;p&gt;We know we need more help, but we also know we need to be better community curators. So here are some things we pledge to do better:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We’ll beef up the Prototype web site so that it’s easier to get started with the framework, easier to find great resources like &lt;a href="http://scripteka.com/" title="Scripteka :: Prototype extensions library"&gt;Scripteka&lt;/a&gt; and &lt;a href="http://prototype-ui.com/" title="Prototype UI"&gt;Prototype UI&lt;/a&gt;, and easier to find answers to common questions.&lt;/li&gt;
&lt;li&gt;We’ll give special attention to documentation tickets on Lighthouse so that our API docs don’t stay stale and thin.&lt;/li&gt;
&lt;li&gt;We’ll release on a more consistent schedule, as explained above.&lt;/li&gt;
&lt;li&gt;We’ll resume work on &lt;a href="http://github.com/tobie/pdoc/tree/master"&gt;PDoc&lt;/a&gt; (inline documentation) and &lt;a href="http://github.com/sstephenson/sprockets/tree/master"&gt;Sprockets&lt;/a&gt; (JS dependency management), spin-off projects that make Prototype more of a “platform.” They’ll be a boon to the Prototype ecosystem when they’re completed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Finally: if you consider yourself to be good at planning and organizing an open-source project, then we’d love your input on how to grow our community. Our highest priority, however, is not to launch a new initiative or process; it’s to get more people doing the seven things listed above.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=7ffph10QC2A:Y3NiAsSnz_c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=7ffph10QC2A:Y3NiAsSnz_c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=7ffph10QC2A:Y3NiAsSnz_c:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2008/10/7/growing-the-community</feedburner:origLink></entry>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>Andrew</name>
    </author>
    <id>tag:prototypejs.org,2008-09-30:22022</id>
    <published>2008-09-30T17:48:00Z</published>
    <updated>2008-09-30T17:49:27Z</updated>
    <category term="blog" />
    <category term="Featured" />
    <category term="Releases" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/cSJpNZRhZtk/prototype-1-6-0-3-one-more-bugfix-release-before-1-6-1" rel="alternate" type="text/html" />
    <title>Prototype 1.6.0.3: A long-awaited bugfix release</title>
<summary type="html">&lt;p&gt;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.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Developers who follow along in Git might’ve noticed that the repository has seen &lt;em&gt;a lot&lt;/em&gt; 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.&lt;/p&gt;

&lt;p&gt;Because of the way we handled this overhaul, those who try to update their Git working copies to the latest trunk will encounter conflicts, &lt;em&gt;even if they hadn’t made local changes&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Here’s how we recommend bringing your working copy up to date:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First, if you’ve made any local changes, please create a new branch so that those changes aren’t lost.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On your local master branch, run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git fetch origin master
git reset --hard 34ee207&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first line fetches the new commits without trying to apply them to your local copy. The second line resets your master branch to be in sync with the latest revision.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;From there, you can cherry-pick from your branch any local commits you made (though you may have to do some manual merging).&lt;/li&gt;
&lt;/ol&gt;



&lt;h3&gt;Download, report bugs, and get help&lt;/h3&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://prototypejs.org/assets/2008/9/29/prototype-1.6.0.3.js"&gt;Download Prototype 1.6.0.3&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://prototype.lighthouseapp.com/projects/8886-prototype"&gt;Submit bug reports&lt;/a&gt; to Lighthouse&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://prototypejs.org/discuss"&gt;Get Prototype help&lt;/a&gt; on the Prototype &amp; script.aculo.us mailing list or #prototype &lt;span class="caps"&gt;IRC&lt;/span&gt; channel&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://groups.google.com/group/prototype-core"&gt;Interact with the Core Team&lt;/a&gt; on the prototype-core mailing list&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;As always, thanks to the core team and the many users who contributed bug reports and well-tested patches for this release.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=cSJpNZRhZtk:hSdqutWZILs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=cSJpNZRhZtk:hSdqutWZILs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=cSJpNZRhZtk:hSdqutWZILs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2008/9/30/prototype-1-6-0-3-one-more-bugfix-release-before-1-6-1</feedburner:origLink></entry>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>Tobie</name>
    </author>
    <id>tag:prototypejs.org,2008-08-11:21243</id>
    <published>2008-08-11T13:48:00Z</published>
    <updated>2008-08-11T16:52:17Z</updated>
    <category term="blog" />
    <category term="books" />
    <category term="Featured" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/tvyhDrxgFbc/practical-prototype-and-scriptaculous" rel="alternate" type="text/html" />
    <title>Practical Prototype and script.aculo.us</title>
<summary type="html">&lt;p&gt;&lt;a href="http://www.apress.com/book/view/1590599195"&gt;&lt;img src="/assets/2008/8/11/9781590599198.gif" /&gt;&lt;/a&gt;
We’re very happy to announce a new addition to the Prototype bookshelf: core committer &lt;a href="http://andrewdupont.net/"&gt;Andrew Dupont&lt;/a&gt;’s &lt;a href="http://www.apress.com/book/view/1590599195"&gt;&lt;cite&gt;Practical Prototype and script.aculo.us&lt;/cite&gt;&lt;/a&gt; published by Apress.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;&lt;a href="http://www.apress.com/book/view/1590599195"&gt;&lt;img src="/assets/2008/8/11/9781590599198.gif" /&gt;&lt;/a&gt;
We’re very happy to announce a new addition to the Prototype bookshelf: core committer &lt;a href="http://andrewdupont.net/"&gt;Andrew Dupont&lt;/a&gt;’s &lt;a href="http://www.apress.com/book/view/1590599195"&gt;&lt;cite&gt;Practical Prototype and script.aculo.us&lt;/cite&gt;&lt;/a&gt; published by Apress.&lt;/p&gt;
&lt;p&gt;Obviously, &lt;a href="http://www.apress.com/book/view/1590599195"&gt;&lt;cite&gt;Practical Prototype and script.aculo.us&lt;/cite&gt;&lt;/a&gt; covers all you need to know about the latest versions of Prototype and script.aculo.us. But it goes well beyond that. Andrew does an awesome job at setting the context and giving appropriate background information, so much so that you’ll end up knowing not only the &lt;em&gt;how&lt;/em&gt; but also the &lt;em&gt;why&lt;/em&gt;. In the ruthless world of client-side development, that’s a serious asset!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.apress.com/book/view/1590599195"&gt;&lt;cite&gt;Practical Prototype and script.aculo.us&lt;/cite&gt;&lt;/a&gt; is a pleasure to read – the style is both straightforward &lt;em&gt;and&lt;/em&gt; witty – and should appeal to beginners and seasoned developers alike.&lt;/p&gt;

&lt;p&gt;If you want to try before you buy, you can always download a &lt;a href="http://www.apress.com/book/downloadfile/4037"&gt;sample chapter&lt;/a&gt; or the &lt;a href="http://www.apress.com/book/downloadfile/4038"&gt;table of contents&lt;/a&gt; from the Apress website. Or you can grab a hard copy and/or a pdf from the &lt;a href="http://www.apress.com/book/view/1590599195"&gt;Apress website&lt;/a&gt; or from &lt;a href="http://www.amazon.com/Practical-Prototype-script-aculo-us-Experts-Development/dp/1590599195/"&gt;Amazon&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As always, happy Prototyping!&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=tvyhDrxgFbc:MLABMfTrGRs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=tvyhDrxgFbc:MLABMfTrGRs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=tvyhDrxgFbc:MLABMfTrGRs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2008/8/11/practical-prototype-and-scriptaculous</feedburner:origLink></entry>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>Christophe</name>
    </author>
    <id>tag:prototypejs.org,2008-07-25:21197</id>
    <published>2008-07-25T16:29:00Z</published>
    <updated>2008-09-03T07:35:31Z</updated>
    <category term="blog" />
    <category term="Featured" />
    <category term="devday,tae,conference" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/LVlVaMItXs8/first-prototype-developer-day-monday-september-29-2008" rel="alternate" type="text/html" />
    <title>First Prototype Developer Day: Monday September 29, 2008!</title>
<summary type="html">&lt;p&gt;&lt;img src="/assets/2008/7/25/pdd75.gif" /&gt;&lt;/p&gt;


	&lt;p&gt;Prototype Core is happy to announce the first Prototype Developer Day!  The Prototype Developer Day is going to be a recurring event bringing together Prototype Core members and users from the Prototype community to share experiences, offer insight into what’s coming up, and discuss topics like contribution, support, and the Prototype ecosystem.  If you’re big on Prototype, you cannot miss this!&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;&lt;img src="/assets/2008/7/25/pdd75.gif" /&gt;&lt;/p&gt;


	&lt;p&gt;Prototype Core is happy to announce the first Prototype Developer Day!  The Prototype Developer Day is going to be a recurring event bringing together Prototype Core members and users from the Prototype community to share experiences, offer insight into what’s coming up, and discuss topics like contribution, support, and the Prototype ecosystem.  If you’re big on Prototype, you cannot miss this!&lt;/p&gt;
&lt;p&gt;This fall, the Prototype Developer Day is being held in conjunction with &lt;a href="http://ajaxexperience.techtarget.com"&gt;The Ajax Experience&lt;/a&gt;, held in Boston from Monday, September 29 to Wednesday, October 1 2008.  The Prototype Developer Day itself will happen on Monday.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Admission to the Developer Day is free&lt;/strong&gt;. If you’re interested in attending the full three days of The Ajax Experience, you can &lt;strong&gt;save $100 with the code &lt;code&gt;Prototype&lt;/code&gt;&lt;/strong&gt;. Register before August 22nd and &lt;strong&gt;save an additional $100&lt;/strong&gt;.&lt;/p&gt;


	&lt;p&gt;The provisional agenda for this Prototype Developer Day is as follows (more details coming up on the &lt;a href="http://ajaxexperience.techtarget.com/east/html/eventsataglance.html?Offer=AEprot717"&gt;full agenda&lt;/a&gt;):&lt;/p&gt;


&amp;lt;style type="text/css"&gt;#pddAgenda { border: 2px solid silver; border-collapse: collapse; margin: 1em auto; } #pddAgenda th, #pddAgenda td { border: 1px solid silver; text-align: center; padding: 0.2em 0.5em } #pddAgenda th { background: silver; }&amp;lt;/style&gt;

	&lt;table&gt;
		&lt;tr&gt;
			&lt;th&gt;Start time&lt;/th&gt;
			&lt;th&gt;End time&lt;/th&gt;
			&lt;th&gt;Session&lt;/th&gt;
			&lt;th&gt;Speaker&lt;/th&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;8:00am&lt;/td&gt;
			&lt;td&gt;8:30am&lt;/td&gt;
			&lt;td&gt;Intro/Welcome&lt;/td&gt;
			&lt;td&gt;Prototype Core&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;8:30am&lt;/td&gt;
			&lt;td&gt;9:30am&lt;/td&gt;
			&lt;td&gt;Contributing docs&lt;/td&gt;
			&lt;td&gt;Christophe Porteneuve&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;9:30am&lt;/td&gt;
			&lt;td&gt;9:45am&lt;/td&gt;
			&lt;td&gt;Break&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;9:45am&lt;/td&gt;
			&lt;td&gt;9:50am&lt;/td&gt;
			&lt;td&gt;Greeting&lt;/td&gt;
			&lt;td&gt;Framework Summit Sponsor&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;9:50am&lt;/td&gt;
			&lt;td&gt;10:30am&lt;/td&gt;
			&lt;td&gt;Contributing code&lt;/td&gt;
			&lt;td&gt;Andrew Dupont&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;10:30am&lt;/td&gt;
			&lt;td&gt;11:15am&lt;/td&gt;
			&lt;td&gt;The Prototype ecosystem&lt;/td&gt;
			&lt;td&gt;&lt;span class="caps"&gt;TBD&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;11:15am&lt;/td&gt;
			&lt;td&gt;11:30am&lt;/td&gt;
			&lt;td&gt;Break&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;11:30am&lt;/td&gt;
			&lt;td&gt;1:00pm&lt;/td&gt;
			&lt;td&gt;Extended Q&amp;A&lt;/td&gt;
			&lt;td&gt;Prototype Core&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;




	&lt;p&gt;You will get a chance to hook up with members of Prototype Core and “close core”, and we all look forward to meeting you guys.  Here’s the current rundown:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Sam Stephenson &lt;em&gt;(to be confirmed)&lt;/em&gt;&lt;/li&gt;
		&lt;li&gt;Andrew Dupont &lt;em&gt;(confirmed)&lt;/em&gt;&lt;/li&gt;
		&lt;li&gt;Juriy “kangax” Zaytsev &lt;em&gt;(confirmed)&lt;/em&gt;&lt;/li&gt;
		&lt;li&gt;Mislav Marohnić &lt;em&gt;(to be confirmed)&lt;/em&gt;&lt;/li&gt;
		&lt;li&gt;Tobie Langel &lt;em&gt;(to be confirmed)&lt;/em&gt;&lt;/li&gt;
		&lt;li&gt;Christophe Porteneuve &lt;em&gt;(confirmed)&lt;/em&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;For more information on coming with a group, contact &lt;a href="mailto:%22Tracey%20West%22%20%3Ctwest%40techtarget.com%3E?subject=Group%20pricing%20for%20TAE"&gt;Tracey West&lt;/a&gt;.  You can view the &lt;a href="http://ajaxexperience.techtarget.com/east/html/eventsataglance.html?Offer=AEprot717"&gt;agenda&lt;/a&gt; for The Ajax Experience, and then proceed to one or both of the following:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Want to register for &lt;span class="caps"&gt;PDD&lt;/span&gt;?  You &lt;strong&gt;must&lt;/strong&gt; use our special &lt;a href="http://devdays.prototypejs.org"&gt;quick form&lt;/a&gt;.  Registering for &lt;span class="caps"&gt;TAE&lt;/span&gt; &lt;strong&gt;doesn’t&lt;/strong&gt; automatically sign you up for &lt;span class="caps"&gt;PDD&lt;/span&gt;, and the number of seats is pretty limited. (But, hey, there’s a free lunch!)&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.regonline.com/ajaxexperience"&gt;Register for The Ajax Experience&lt;/a&gt;.&lt;/li&gt;
	&lt;/ul&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=LVlVaMItXs8:rzN4rEg064U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=LVlVaMItXs8:rzN4rEg064U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=LVlVaMItXs8:rzN4rEg064U:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2008/7/25/first-prototype-developer-day-monday-september-29-2008</feedburner:origLink></entry>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>Andrew</name>
    </author>
    <id>tag:prototypejs.org,2008-07-14:21171</id>
    <published>2008-07-14T15:51:00Z</published>
    <updated>2008-07-14T15:59:25Z</updated>
    <category term="blog" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/hYLuZeM-Vv4/announcing-new-prototype-support-mailing-list" rel="alternate" type="text/html" />
    <title>Announcing new Prototype support mailing list</title>
<summary type="html">&lt;p&gt;Subscribers to the Rails Spinoffs mailing list should switch to our new, better-named list: &lt;a href="http://groups.google.com/group/prototype-scriptaculous" title="Prototype &amp;amp; script.aculo.us | Google Groups"&gt;Prototype &amp;amp; script.aculo.us&lt;/a&gt;.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Subscribers to the Rails Spinoffs mailing list should switch to our new, better-named list: &lt;a href="http://groups.google.com/group/prototype-scriptaculous" title="Prototype &amp;amp; script.aculo.us | Google Groups"&gt;Prototype &amp;amp; script.aculo.us&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While these two venerable libraries are, in truth, spinoffs of the Rails project, we’ve come to realize it’s far more user-friendly to have the libraries’ names in the name of the mailing list. This should help guide users to the right spot and reduce the amount of support traffic on the &lt;a href="http://groups.google.com/group/prototype-core" title="Prototype: Core | Google Groups"&gt;Prototype Core mailing list&lt;/a&gt; — which is for discussion of Prototype’s development process, not support.&lt;/p&gt;

&lt;p&gt;Because list spam is a sad reality, your first post to the list will be held for moderation. Once it’s approved, though, you’ll be able to post with impunity.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=hYLuZeM-Vv4:3yAYfjUaQSQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=hYLuZeM-Vv4:3yAYfjUaQSQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=hYLuZeM-Vv4:3yAYfjUaQSQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2008/7/14/announcing-new-prototype-support-mailing-list</feedburner:origLink></entry>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>Tobie</name>
    </author>
    <id>tag:prototypejs.org,2008-06-11:20683</id>
    <published>2008-06-11T21:58:00Z</published>
    <updated>2008-11-10T07:53:35Z</updated>
    <category term="blog" />
    <category term="Interviews" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/GV4LXDpqVOA/an-interview-with-ryan-johnson" rel="alternate" type="text/html" />
    <title>An Interview with Ryan Johnson</title>
<summary type="html">&lt;p&gt;&lt;img src="http://prototypejs.org/assets/2008/6/11/ryanjohnson.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;Today’s interviewee is &lt;a href="http://livepipe.net/"&gt;Ryan Johnson&lt;/a&gt; of &lt;a href="http://livepipe.net/projects/control_suite/"&gt;Control Suite&lt;/a&gt; fame.&lt;/p&gt;

&lt;p&gt;Ryan just launched &lt;a href="http://personalgrid.com/"&gt;PersonalGrid&lt;/a&gt;, a new file sharing and publishing web application, along with a complete overhaul of Control Suite, now renamed &lt;a href="http://livepipe.net/"&gt;LivePipe UI&lt;/a&gt;.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;&lt;img src="http://prototypejs.org/assets/2008/6/11/ryanjohnson.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;Today’s interviewee is &lt;a href="http://livepipe.net/"&gt;Ryan Johnson&lt;/a&gt; of &lt;a href="http://livepipe.net/projects/control_suite/"&gt;Control Suite&lt;/a&gt; fame.&lt;/p&gt;

&lt;p&gt;Ryan just launched &lt;a href="http://personalgrid.com/"&gt;PersonalGrid&lt;/a&gt;, a new file sharing and publishing web application, along with a complete overhaul of Control Suite, now renamed &lt;a href="http://livepipe.net/"&gt;LivePipe UI&lt;/a&gt;.&lt;/p&gt;
&lt;p class="question"&gt;&lt;b&gt;Hi, Ryan. Could you please introduce yourself.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;Ryan Johnson:&lt;/span&gt; I’ve been writing web pages since 1993, but I’ve only felt comfortable calling myself a programmer for the last 5 years. I drank the Prototype kool-aid about 2 and a half years ago, and I’d say today nearly 75% of all the code I write is JavaScript. I enjoy writing Ruby just as much, but fewer and fewer people are asking me to do any work in Ruby at all.&lt;/p&gt;

&lt;p&gt;The language itself hasn’t evolved all that much, but watching our collective knowledge and understanding of it grow has been a surprise and delight.&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;You just released a new web application: PersonalGrid. Can you tell us about it?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/assets/2008/6/11/personalgrid.png" /&gt;
&lt;span class="interviewee"&gt;RJ:&lt;/span&gt; &lt;a href="http://personalgrid.com/"&gt;PersonalGrid&lt;/a&gt; is a file-sharing and publishing application that I’ve written. You can use it to upload files and publish single files or whole folders with one click. It’s also easy to share with friends or whole groups of users.&lt;/p&gt;

&lt;p&gt;We have a dev team of one (me), and this is our first beta release, so hopefully any bugs you encounter won’t be too catastrophic.&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;How are you using Prototype in PersonalGrid? And script.aculo.us?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;RJ:&lt;/span&gt; On the Rails side, 95% of the actions use a REST interface and spit back &lt;a href="http://json.org"&gt;JSON&lt;/a&gt;, so the app is very client-heavy. Almost all of the HTML is generated with the Prototype &lt;a href="http://prototypejs.org/api/template “Prototype JavaScript framework:  Template”"&gt;Template&lt;/a&gt; class, with a little usage of the &lt;a href="http://prototypejs.org/api/element"&gt;&lt;code&gt;new Element&lt;/code&gt;&lt;/a&gt; syntax thrown in where appropriate. I used the Draggables and Droppables from script.aculo.us, but little else. I also ended up making many modifications (which I will release on &lt;a href="http://github.com/saucytiger"&gt;GitHub&lt;/a&gt; sometime soon) to both of those classes to support some extra functionality.&lt;/p&gt;

&lt;p&gt;Both Object.Event and LivePipe UI are discussed below, but those libraries are integral to the application. So our JavaScript stack looks like Prototype &amp;rarr; LivePipe UI &amp;rarr; PersonalGrid Application. The actual PersonalGrid JavaScript code is a number of classes that represent the major UI components (File, Folder, Friend, Group, etc), and a number of controller classes that initiate Ajax requests and process the JSON responses.&lt;/p&gt;

&lt;p&gt;In the process of building the application layer I kept seeing inklings of a JavaScript MVC framework, but I just don’t see where the reusability would come from. Prototype is ever more awesome, and I’m releasing components that others will hopefully find useful.&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;What were the biggest challenges you faced when building it?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;RJ:&lt;/span&gt; Internet Explorer. The only debate about the IE debacle that should be going on is whether the product is a result of incompetence or was designed deliberately to sabotage the development of complex web applications. They got XHR and the mouseenter/mouseleave events right, but that is about it.&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;Any technical advice, tips, or tricks you’d like to share?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;RJ:&lt;/span&gt; Start using a broadcast/subscription based event model for everything in your app, not just Element objects! Of course I am going to plug my own solution &lt;a href="http://livepipe.net/projects/object_event/"&gt;Object.Event&lt;/a&gt; — but whether or not you use that, having a system where you can trigger your own events that do not relate to the DOM is critical for the maintainability of your code base. The new custom events in Prototype 1.6 are great (and I used a few in PersonalGrid), but it’s still geared towards the DOM.&lt;/p&gt;

&lt;p&gt;For example, we have a trash can feature in PersonalGrid. Each user’s root directory has a &lt;code&gt;.Trash&lt;/code&gt; folder, which mostly acts like any other folder, but we need to specialize its behavior. The two biggest differences are that we want to take the &lt;code&gt;.Trash&lt;/code&gt; folder out of the normal directory listing, and give it a special place in the UI. We also want &lt;code&gt;.Trash&lt;/code&gt; to behave differently when you are in it. We have a Location class that is responsible for changing folders, rending the directory listing, etc. Instead of putting these specializations for the Trash inside the Location class, we have the Location class fire an &lt;code&gt;onChangeLocation&lt;/code&gt; event, which the Trash class observes.&lt;/p&gt;

&lt;p&gt;It’s not only a conceptually elegant way to solve the problem, but you get the added benefit of having all of the code that relates to the Trash in one place. As I was developing the app, we ended up wanting all of these little specializations for friendship folders, group folders, etc, so the broadcast/subscription model has really ended up paying huge dividends as the project progresses.&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;You’re using a Java applet for file upload. Why did you choose to use that technology? What are the advantages over using flash?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;RJ:&lt;/span&gt; There are some problems with the delay in loading the JVM, and the whole certificate/trust issues that all applets have, so I don’t want to sound too triumphant about the choice just yet. The main reason I choose Java instead of Flash is that you can drag and drop files onto the applet, which Flash does not support. Leopard supports dragging files directly onto file inputs, but users do not universally expect that behavior yet.&lt;/p&gt;

&lt;p&gt;One of the areas I’d like to explore more is deep interaction between Java/Flash and JavaScript. The Java applet is one of the few parts of PersonalGrid that I didn’t write, but I worked closely with our Java coder to create a large series of JavaScript callbacks inside the applet so I could build a UI with Prototype.&lt;/p&gt;

&lt;p&gt;&lt;img src="/assets/2008/6/11/personalgrid_3_1.jpg" alt="Java applet uploader screenshot" /&gt;&lt;/p&gt;

&lt;p&gt;There are a lot of fairly hairy undocumented bugs with &lt;a href="http://en.wikipedia.org/wiki/LiveConnect"&gt;LiveConnect&lt;/a&gt; (the Java/JS bridge), but until we get richer native functionality this is the only way to get around some of the security constrains browsers place on accessing the local machine.&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;You’re well known within the Prototype community for Control Suite. Can you tell us a bit more about it? Are you using any of it in PersonalGrid?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;RJ:&lt;/span&gt; Well I’d like to apologize to the users of Control Suite for neglecting it for the past 8 months! PersonalGrid and some other obligations really destroyed my schedule. Control Suite has just received a major update, and is now called &lt;a href="http://livepipe.net/"&gt;LivePipe UI&lt;/a&gt; and is compatible with Prototype 1.6. Most of the complex UI elements you see in PersonalGrid (windows, context menus, selection, etc) are available in the new LivePipe UI release.&lt;/p&gt;

&lt;p&gt;LivePipe UI tries to provide a set of reusable core UI components that has a similar API design philosophy to Prototype. So far only components I have needed are part of the kit, but I am hoping that it grows with time. Now that it is on GitHub I’m hoping that it will be easier for users to contribute. The biggest news to existing users is that the Control.Modal class has been completely rewritten, and it is now a subclass of Control.Window. There are also proper Lightbox and Tooltip classes. The new class system in Prototype 1.6 made that far more elegant than it would have been before.&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;PersonalGrid has a distinct Mac feel. What made you aim for a desktop-like application?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;RJ:&lt;/span&gt; Since an application of this nature is all about finding and organizing files and folders, why not recreate an interface people are already completely familiar with? We have a ways to go to catch up feature wise to &lt;a href="http://box.net"&gt;Box.net&lt;/a&gt;, but when I first used their service I noticed they used some desktop metaphors (like drag and drop), but overall the application still felt too much like a website. Plenty of web services &lt;strong&gt;should&lt;/strong&gt; feel like websites, but I don’t think file management apps should (except for &lt;a href="http://drop.io"&gt;Drop.io&lt;/a&gt;, which is wonderfully simple).&lt;/p&gt;

&lt;p&gt;&lt;img src="/assets/2008/6/11/personalgrid_2_1.jpg" alt="PersonalGrid screenshot" /&gt;&lt;/p&gt;

&lt;p&gt;With regards to the Mac feel… besides borrowing some of the icons (still wondering if we will hear from Apple legal), there are a lot of very particular things that I like about the Finder. One of the hidden features of the PersonalGrid UI is that if you pick up an item and hover over any folder, breadcrumb, group or friendship, you will navigate to that location, and you will still be able to drop the item in any sub folder at the new location. The Finder does this, but I rarely use it because you can have multiple Finder windows open, or use the column view. In a two paned interface it’s the only way to elegantly get an item from A to C without moving it to B first.&lt;/p&gt;

&lt;p&gt;Rich web development is still in its infancy, but Apple (and others) have had many complex UI problems elegantly solved for years on the desktop, so when I would run into a brick wall like the A-to-C problem, I would see how it was solved in the Finder, or even read the documentation in the &lt;a href="http://developer.apple.com/documentation/UserExperience/Conceptual/OSXHIGuidelines/XHIGIntro/chapter_1_section_1.html"&gt;Human Interface Guidelines&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It was also an amazingly fun challenge to deconstruct and recreate something as basic as the selection for the new &lt;a href="http://livepipe.net/control/selection"&gt;Control.Selection&lt;/a&gt; library, which is also one of the core components of the PersonalGrid UI. When building something that complex yet fundamental one realizes all of the tweaks that coders and designers before you have thought obsessively about.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=GV4LXDpqVOA:m2Hg411YDgo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=GV4LXDpqVOA:m2Hg411YDgo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=GV4LXDpqVOA:m2Hg411YDgo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2008/6/11/an-interview-with-ryan-johnson</feedburner:origLink></entry>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>Tobie</name>
    </author>
    <id>tag:prototypejs.org,2008-05-28:20739</id>
    <published>2008-05-28T23:21:00Z</published>
    <updated>2008-05-29T00:14:19Z</updated>
    <category term="blog" />
    <category term="Featured" />
    <category term="Interviews" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/0avkA0g_YME/an-interview-with-piotr-dachtera" rel="alternate" type="text/html" />
    <title>An Interview with Piotr Dachtera</title>
<summary type="html">&lt;p&gt;&lt;img src="http://prototypejs.org/assets/2008/5/28/piotrdachtera.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;Piotr Dachtera is the lead developer behind the recently-launched &lt;a href="http://live.chess.com/"&gt;Live Chess&lt;/a&gt;, a Prototype-based, Comet-powered live chess game.&lt;/p&gt;

&lt;p&gt;We talked to him about the client-side challenges he faced along the way.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;&lt;img src="http://prototypejs.org/assets/2008/5/28/piotrdachtera.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;Piotr Dachtera is the lead developer behind the recently-launched &lt;a href="http://live.chess.com/"&gt;Live Chess&lt;/a&gt;, a Prototype-based, Comet-powered live chess game.&lt;/p&gt;

&lt;p&gt;We talked to him about the client-side challenges he faced along the way.&lt;/p&gt;
&lt;p class="question"&gt;&lt;b&gt;Hi, Piotr. Could you please introduce yourself?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;Piotr Dachtera:&lt;/span&gt; Sure. I’m currently the lead developer of the JavaScript/Ajax/Comet part of &lt;a href="http://chess.com"&gt;chess.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’ve been dedicated to Web + chess applications since 1999. I’ve also been working on business software since 2000 (mainly &lt;a href="http://java.sun.com/"&gt;Java&lt;/a&gt;). My interest in the game of chess was always pushing me forward and finally I think I can say I’m working on the number one web chess project.&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;You’ve built &lt;a href="http://live.chess.com/"&gt;Live Chess&lt;/a&gt; using Prototype and &lt;a href="http://script.aculo.us"&gt;script.aculo.us&lt;/a&gt;. Can you tell us more about the application?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;PD:&lt;/span&gt; Chess community website users need to share things using a specific “language” which needs something more than plain text. They need to share game positions, whole chess games with analysis, and chess puzzles. Also, they want to play against each other.&lt;/p&gt;

&lt;p&gt;&lt;img src="/assets/2008/5/28/chess.jpg" alt="Screenshot of Live Chess" /&gt;&lt;/p&gt;

&lt;p&gt;As we were starting to work on it all, I already had some experience with Prototype and script.aculo.us, and it was the natural choice.&lt;/p&gt;

&lt;p&gt;We started with the interactive boards with draggable pieces, chess game parsers and things like that. Naturally, I had in mind that we were going to build something much more complex (the scalable real-time play server), so enclosing everything in reusable classes was the only solution. As it was always tempting to see what’s inside Prototype, I was investigating its source all the time and I was trying to build my classes using the same style.&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;Live Chess uses Comet to keep the chessboard synchronized. What made you choose that technology over ordinary Ajax?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;PD:&lt;/span&gt; The most important word in “Live Chess” is “live.” We need things to happen instantly. We can’t use polling to check every 10 seconds if anything changed.&lt;/p&gt;

&lt;p&gt;If people want to play a game of chess in 2 minutes, they need some kind of &lt;em&gt;instant&lt;/em&gt; communication.&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;Can you give us more details on the Comet implementation?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;PD:&lt;/span&gt; Working on my own proof-of-concept chess server in 2005, I “(re)invented” the Comet idea to allow this kind of communication… only to find out that people were using the same idea in simple chat apps.&lt;/p&gt;

&lt;p&gt;The next step (which came with the new server built for the chess.com community and needed real scalability) was to use the idea of thread-less server solutions implemented in &lt;a href="http://www.mortbay.org/"&gt;Jetty&lt;/a&gt; server and &lt;a href="http://activemq.apache.org/"&gt;ActiveMQ&lt;/a&gt; to push messages between client and server. &lt;/p&gt;

&lt;p&gt;Finally, we switched to &lt;a href="http://cometd.com/"&gt;Cometd/Bayeux&lt;/a&gt; with our own solution for guaranteed messaging and message ordering.&lt;/p&gt;

&lt;p&gt;In all of these solutions, there was always Java on the server-side.&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;What are you using Prototype for?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;PD:&lt;/span&gt; I started with script.aculo.us effects investigation which guided me directly to Prototype.&lt;/p&gt;

&lt;p&gt;Currently, I’m not really a JavaScript developer. I’m a Prototype developer using the library everywhere.&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;On top of Prototype and &lt;a href="http://dojotoolkit.org"&gt;Dojo&lt;/a&gt;, I saw you were also using &lt;a href="http://extjs.com"&gt;ExtJS&lt;/a&gt; in Live Chess. Was the integration of these three libraries seamless or were there issues?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;PD:&lt;/span&gt; We are using ExtJS with the &lt;a href="http://extjs.com/products/extjs/build/"&gt;Prototype adapter&lt;/a&gt; so there was nothing really hard to do here.&lt;/p&gt;

&lt;p&gt;Dojo things are completely separated from the rest of the system, but we had to use the library for Cometd communication. As a Prototype fan, I would be really happy to have a Cometd implementation built on top of Prototype, but currently I had to use Dojo in this area (which is sandboxed in a separate communication frame).&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;What were the biggest challenges you faced with this application?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;PD:&lt;/span&gt; We still have lots of big challenges! But if I had to choose one, I would say: performance. Everybody wants to use Live Chess (and any other similar application) as if it was a desktop application.
As the system becomes heavier and more complex, we still have to work hard to keep it &lt;em&gt;smooth&lt;/em&gt;.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=0avkA0g_YME:aBOQB3_uHrA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=0avkA0g_YME:aBOQB3_uHrA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=0avkA0g_YME:aBOQB3_uHrA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2008/5/28/an-interview-with-piotr-dachtera</feedburner:origLink></entry>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>sam</name>
    </author>
    <id>tag:prototypejs.org,2008-05-27:20728</id>
    <published>2008-05-27T19:06:00Z</published>
    <updated>2008-05-27T20:10:17Z</updated>
    <category term="blog" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/Ut8sGQG9Vl4/prototype-hosted-on-google-s-servers" rel="alternate" type="text/html" />
    <title>Prototype hosted on Google's servers</title>
<summary type="html">&lt;p&gt;Good news!  Google now offers a cached, compressed copy of Prototype on its high-speed content distribution network via the &lt;a href="http://code.google.com/apis/ajaxlibs/"&gt;&lt;span class="caps"&gt;AJAX&lt;/span&gt; Libraries &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Good news!  Google now offers a cached, compressed copy of Prototype on its high-speed content distribution network via the &lt;a href="http://code.google.com/apis/ajaxlibs/"&gt;&lt;span class="caps"&gt;AJAX&lt;/span&gt; Libraries &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can either link to the source code directly:&lt;/p&gt;


&lt;pre&gt;
  &amp;lt;script type="text/javascript" 
    src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;

	&lt;p&gt;Or you can use Google’s &lt;span class="caps"&gt;API&lt;/span&gt;:&lt;/p&gt;


&lt;pre&gt;
  &amp;lt;script type="text/javascript" src="http://www.google.com/jsapi"&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script type="text/javascript"&amp;gt;google.load("prototype", "1.6.0.2");&amp;lt;/script&amp;gt;
&lt;/pre&gt;

	&lt;p&gt;More information is available from &lt;a href="http://code.google.com/apis/ajaxlibs/documentation/index.html#prototype"&gt;Google’s documentation&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;When a specific version of Prototype is delivered to your browser, it will be cached for one year and served with the proper compression headers.  That means that most users of sites which link to Google’s copy of Prototype will incur a ~30 KB download only once.&lt;/p&gt;


	&lt;p&gt;We typically encourage developers building applications with Prototype to concatenate all their JavaScript into a single file, and serve that file with the proper content expiration and compression settings.  In cases where this is unfeasible, Google’s hosted version is an excellent alternative.&lt;/p&gt;


	&lt;p&gt;Special thanks to Dion Almaer and the team at Google for making this possible.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=Ut8sGQG9Vl4:WZQPEw37BmU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=Ut8sGQG9Vl4:WZQPEw37BmU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=Ut8sGQG9Vl4:WZQPEw37BmU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2008/5/27/prototype-hosted-on-google-s-servers</feedburner:origLink></entry>
  <entry xml:base="http://prototypejs.org/">
    <author>
      <name>Tobie</name>
    </author>
    <id>tag:prototypejs.org,2008-05-21:20702</id>
    <published>2008-05-21T06:01:00Z</published>
    <updated>2008-05-22T02:13:20Z</updated>
    <category term="blog" />
    <category term="Featured" />
    <category term="Interviews" />
    <link href="http://feedproxy.google.com/~r/prototype-blog/~3/HKn-CyUlDYE/an-interview-with-amy-hoy" rel="alternate" type="text/html" />
    <title>An Interview with Amy Hoy</title>
<summary type="html">&lt;p&gt;&lt;img src="/assets/2008/5/21/amy.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;Hot on the heels of last week’s &lt;a href="http://prototypejs.org/2008/5/14/an-interview-with-sergio-pereira"&gt;interview with Sergio Pereira&lt;/a&gt;, we were lucky enough to catch up with &lt;a href="http://slash7.com"&gt;Amy Hoy&lt;/a&gt;. Amy defines herself as a &lt;em&gt;informally educated designer-turned-interface-developer who also programs (and writes, and speaks, and takes pretty pictures)&lt;/em&gt;. She’s also the co-creator of &lt;a href="http://twistori.com/"&gt;Twistori&lt;/a&gt;.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;&lt;img src="/assets/2008/5/21/amy.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;Hot on the heels of last week’s &lt;a href="http://prototypejs.org/2008/5/14/an-interview-with-sergio-pereira"&gt;interview with Sergio Pereira&lt;/a&gt;, we were lucky enough to catch up with &lt;a href="http://slash7.com"&gt;Amy Hoy&lt;/a&gt;. Amy defines herself as a &lt;em&gt;informally educated designer-turned-interface-developer who also programs (and writes, and speaks, and takes pretty pictures)&lt;/em&gt;. She’s also the co-creator of &lt;a href="http://twistori.com/"&gt;Twistori&lt;/a&gt;.&lt;/p&gt;
&lt;p class="question"&gt;&lt;b&gt;Amy, you’ve been involved in both the Prototype/&lt;a href="http://script.aculo.us"&gt;script.aculo.us&lt;/a&gt; and &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; communities since their inception. What was your background? What brought you there?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;Amy Hoy:&lt;/span&gt; I admit it — I was a professional &lt;a href="http://www.php.net/" title="PHP: Hypertext Preprocessor"&gt;PHP&lt;/a&gt; developer. I started out doing freelance design as a teenager but got tired of relying on other people to do the implementation (and quickly realized the lack of respect towards design in general). I’d dabbled in programming since a kid, but PHP was the first language I’d learned fully. I think it was a good start because it required so little to begin and see immediate results.&lt;/p&gt;

&lt;p&gt;I had found out about &lt;a href="http://basecamphq.com/"&gt;Basecamp&lt;/a&gt; from a designer’s community I was part of, waaay back when it was in beta testing. It really stood out in my mind. Later, somebody else posted about this thing they used to build Basecamp, so of course I was intrigued.&lt;/p&gt;

&lt;p&gt;I went to the old Ruby on Rails site (back around version 0.7), saw the code samples and fell head over heels. The sparse code really appealed to my designer’s nature and I was sure it would be a big hit with other people too. I’d been doing PHP long enough by that time that I was feeling the pain, and Ruby looked like an amazing solution to that pain.&lt;/p&gt;

&lt;p&gt;Somebody felt my pain! And it was awesome. I feel like this could be a meaty episode of Dr. Phil.&lt;/p&gt;

&lt;p&gt;Script.aculo.us I learned about through Rails, and naturally it appealed to me because of all the visual possibilities.&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;Although you’re not teaching JavaScript &lt;i&gt;per se&lt;/i&gt;, you’ve always been inclined in facilitating the learning process, whether it be through your &lt;a href="http://slash7.com/"&gt;blog&lt;/a&gt;, &lt;a href="http://slash7.com/articles/2006/7/26/javascript-boot-camp-tutorial"&gt;presentations&lt;/a&gt; or &lt;a href="http://slash7.com/cheats/scriptaculous_fx1.pdf"&gt;cheat-sheets&lt;/a&gt;. What’s with that?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;AH:&lt;/span&gt; I like to teach in general. I’d say the percentage of “educational” content on my blog hovers around the 80-85% mark. I’ve had a number of teachers who changed my life, but none of them were what you’d traditionally call teachers — they were authors, mentors, speakers, and so on. I really enjoy being able to do that for other people, and I definitely get off on the intellectual challenge of figuring out the best methods to get my readers/attendees to that “aha!” moment. &lt;/p&gt;

&lt;p&gt;And Javascript, well. JavaScript is a really painful subject to learn from scratch. &lt;/p&gt;

&lt;p&gt;Most of the online articles and books either focus on a poor choice of topics (or simply embody bad practices), or leave you hanging by not explaining the whole language, the DOM, events, etc. Or they’re purely references and leave it to you to piece together the whole picture. Or the window they give you into the subject is so narrow as to be useless.&lt;/p&gt;

&lt;p&gt;Me, I got dropped suddenly into the JavaScript world in order to build something I’d designed at a former employer. I started knowing almost nothing (and all of it bad). This was back before Prototype had any documentation. I learned a lot reading the tests but it was slow going.&lt;/p&gt;

&lt;p&gt;While the whole experience was ultimately exhilarating, the lack of good learning sources meant it was also hair-tearingly frustrating. So I set out to make some.&lt;/p&gt;

&lt;p&gt;I can say from experience that it takes a lot of hard work and analysis to create a truly great tech education resource. And traditional book publishers don’t pay well for the effort, either. It’s not at all surprising that there’s no One True Source. &lt;/p&gt;

&lt;p&gt;But… my script.aculo.us cheat sheet has been downloaded over 500,000 times. Clearly I’m not the only one who sees a problem. &lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;In the same vein, you’ve teamed-up with &lt;a href="http://script.aculo.us/thomas/"&gt;Thomas Fuchs&lt;/a&gt; (creator of script.aculo.us and Prototype Core committer) to write an ebook on JavaScript “basics”.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;AH:&lt;/span&gt; Yeah. I wouldn’t call it “basics,” but we are writing about JavaScript: The Language not just JavaScript: Here’s How You Use This Framework. Real, pure JS language skills are very hard to come by these days and that is one of the areas where existing books, etc., really fall down. A lot of people find themselves hamstrung because they’ve started using some framework or toolkit, and when they need to work around it, they realize they don’t know enough JavaScript to do so. (Sound familiar, Ruby/Rails people?)&lt;/p&gt;

&lt;p&gt;We’re working on the mini-book now. It should be out sometime in August, and weigh in at around 50-70 pages. It’s well-designed with every page laid out by hand… we want it to be something you really enjoy reading, not just another tech book. &lt;/p&gt;

&lt;p&gt;If people do like it, we’ll continue the series: the DOM, effects, compatibility, the works. &lt;/p&gt;

&lt;p&gt;&lt;img title="Amy Hoy and Thomas Fuchs" src="/assets/2008/5/22/amy_thomas_3_1.jpg" alt="Amy and Thomas" /&gt;&lt;/p&gt;

&lt;p&gt;There’s a real hunger for this kind of content, I think. My JavaScript Boot Camp tutorial (3 hours) at OSCON a couple summers ago was completely packed. The premise was basically “you’re using the frameworks and the libraries, don’t you think you should understand the language?”. Only Dave Thomas’ Ruby tutorial had more people. I was definitely not “a name” at that point and I was just a little bit surprised. &lt;/p&gt;

&lt;p&gt;And last year, I did a shorter talk on Object#prototype and Prototype, and that was very well-attended too.&lt;/p&gt;

&lt;p&gt;So the need was there two years ago and I’m convinced that it’s still here. &lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;You &lt;a href="http://www.slash7.com/articles/2007/11/30/speaking-of-doing-things-differently"&gt;recently mentioned&lt;/a&gt; finding API docs “almost universally frustrating”, and looking into new, somewhat self-reflexive solutions for documentation. Can you elaborate?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;AH:&lt;/span&gt; Without turning this into a whinefest? Certainly!&lt;/p&gt;

&lt;p&gt;Having great API docs is one of the best ways that people can promote the usage of their open source projects. I, for one, use the prototypejs.org site constantly when working in JavaScript. &lt;/p&gt;

&lt;p&gt;But API docs are best for people who are in a final-ish stage of the learning cycle. They’re most useful when you already know what you’re looking for. They’re not for getting started, even if they have a couple pages about getting started. And they lack immediacy. They are, by nature, reference documents.&lt;/p&gt;

&lt;p&gt;So, given those arguments… how could we make something better? I’d been thinking about this a lot and one night over a couple of beers in Vienna, Thomas and I came up with explain(). &lt;/p&gt;

&lt;p&gt;It’s still under development, but the basic idea is that you’ll be able to call the &lt;code&gt;explain()&lt;/code&gt; function on any Script.aculo.us effect and it will pop up a floating DIV right there with information on how to use the method, its options, etc., even examples. This way you can get your information fix immediately while programming, without having to lose your focus navigating the API docs or the wiki. And, as far as I know, it’s something that hasn’t been done before.&lt;/p&gt;

&lt;p&gt;This of course will be an add-on for development, not something that would be deployed in the standard package. &lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;You also seem to practice thinking outside the box in your own work. &lt;a href="http://twistori.com"&gt;Twistori&lt;/a&gt;, which you’ve just released in collaboration with Thomas Fuchs, is a great example of that. Other than being immediately distinguishable by its stunning looks, it’s not your average mash-up.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;AH:&lt;/span&gt; Thanks.&lt;/p&gt;

&lt;p&gt;We’ve both been doing a lot of intranet and corporate software and the morning I decided I had to ship something, I think we were both about to pop with creative frustration.&lt;/p&gt;

&lt;p&gt;Twistori is different from most mashups because it takes the Twitter data and extracts meaning from it. Not technical meaning, not data, but human, emotional meaning that we can connect to. When you’re reading this stream of hopes, loves, hates, thoughts, etc., it’s kind of hypnotizing because it’s a bit like voyeurism, and a bit like &lt;a href="http://postsecret.blogspot.com/" title="PostSecret"&gt;PostSecret&lt;/a&gt;, and a lot like the normal, everyday cacophony of life. &lt;/p&gt;

&lt;p&gt;&lt;img title="Twistori screenshot" src="/assets/2008/5/21/twistori_1.png" alt="screenshot of Twistori" /&gt;&lt;/p&gt;

&lt;p&gt;Every choice in the design is intentional—the flow, the colors, the way the messages are formatted, the anonymity, and the lack of ability to “scroll back” when a message has gone by. This all contributes to the effect of what one person called “the river of humanity.” &lt;/p&gt;

&lt;p&gt;Since I woke up one morning with the intense desire to build it that day, it is necessarily very sparse. I made it a challenge to have no graphics. I did the design, he breathed life into it; it was a perfect collaboration. Thomas and I put maybe a total of 8 hours into it before we launched it — with a single tweet each. Then it exploded! &lt;/p&gt;

&lt;p&gt;I knew people would love it, but I wasn’t expecting it to explode the way it has with just two tweets. I expected to have to do a little more work promoting it than that! And we were planning to do revisions before the “big debut,” too. But that’s how it goes.&lt;/p&gt;

&lt;p&gt;I think the biggest lesson there is that humans don’t really change with technology. We still seek connections, and we are still voyeuristic and interested in other people, and if you can make design decisions with that in mind, people will be affected by your work.&lt;/p&gt;

&lt;p class="question"&gt;&lt;b&gt;Anything else you’d like to add?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="interviewee"&gt;AH:&lt;/span&gt; I like to dabble. A lot. In everything! I like to figure out where the pain’s coming from and try to fix it, and surprisingly, it tends to work out.&lt;/p&gt;

&lt;p&gt;Also: JavaScript is really going places. Even though the Ajax buzz has worn off and the business magazine writers are now bored, JavaScript web dev is far from static. It’s still very much the wild west, even if it doesn’t seem like it to those of us who’ve been in this thing for the past few years (or longer).&lt;/p&gt;

&lt;p&gt;Lots of really unbelievable things are coming out now (like John Resig’s &lt;a href="http://ejohn.org/blog/processingjs/"&gt;processing.js&lt;/a&gt; and &lt;a href="http://github.com/madrobby/scripty2/tree/master"&gt;script.aculo.us 2.0&lt;/a&gt;) and it’s not likely to stop any time soon. Things are going to get even better. I’m really excited to be a part of it.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=HKn-CyUlDYE:nIpfb4HG1Jk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?i=HKn-CyUlDYE:nIpfb4HG1Jk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/prototype-blog?a=HKn-CyUlDYE:nIpfb4HG1Jk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/prototype-blog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://prototypejs.org/2008/5/21/an-interview-with-amy-hoy</feedburner:origLink></entry>
</feed>
