grink's Journal
http://use.perl.org/~grink/journal/
grink's use Perl Journalen-ususe Perl; is Copyright 1998-2006, Chris Nandor. Stories, comments, journals, and other submissions posted on use Perl; are Copyright their respective owners.2012-02-08T21:33:03+00:00pudgepudge@perl.orgTechnologyhourly11970-01-01T00:00+00:00grink's Journalhttp://use.perl.org/images/topics/useperl.gif
http://use.perl.org/~grink/journal/
Config::JFDI 0.04 released
http://use.perl.org/~grink/journal/37634?from=rss
<div><p> <a href="http://search.cpan.org/perldoc?Config::JFDI">Config-JFDI</a> 0.04 should be on CPAN shortly</p><p>Config::JFDI mimics Catalyst::Plugin::ConfigLoader (without the need to load Catalyst). The new features in this release are:</p><ul>
<li>Value substitution, just like C::P::CL (__HOME__, __path_to(...)__, __literal(...)__, etc.)</li><li>Ability to accept a default hash for a baseline configuration</li></ul></div><p> <a href="http://bravo9.com/journal/config-jfdi-0-04-released-e3ef15d7-73b0-464c-93dc-13f4125f212f">Config::JFDI 0.04 released</a></p>grink2008-10-09T23:38:52+00:00journalPOD-like documentation for JavaScript: Doc::Simply
http://use.perl.org/~grink/journal/37626?from=rss
<div><p>I've just released <a href="http://search.cpan.org/perldoc?Doc::Simply">Doc::Simply</a>, a tool for generating documentation from JavaScript (or C, C++, etc.) comments.</p><p>I use it to for my <a href="http://appengine.bravo9.com/b9j">b9j documentation</a> </p><p>The idea came to me while developing some JavaScript: I was craving a way to drop in free-form documentation in a<nobr> <wbr></nobr>.js file as easily as I could in a<nobr> <wbr></nobr>.pm with perlpod.</p><p>The Doc::Simply format is modeled after Plain-Old-Documentation, but it is not an exact mimic. Body formatting, for example, is in <a href="http://daringfireball.net/projects/markdown/syntax">Markdown</a> (no C<>, L<>,<nobr> <wbr></nobr>...)</p><p>However, if you <strong>are</strong> craving pure POD, then it shouldn't be too difficult to bolt a proper parser/generator on top of Doc::Simply</p><p>You can run it from the command-line as <code>doc-simply</code> <code> <br>
<br>
doc-simply < source.js > documentation.html<br>
<br>
doc-simply --help<br> </code></p><p>An example:<br>
/*<br>
* @head1 NAME<br>
*<br>
* Calculator - Add 2 + 2 and return the result<br>
*<br>
*/<br>
<br>
// @head1 DESCRIPTION<br>
// @body Add 2 + 2 and return the result (which should be 4)<br>
<br>
/*<br>
* @head1 FUNCTIONS<br>
*<br>
* @head2 twoPlusTwo<br>
*<br>
* Add 2 and 2 **and** return 4<br>
*<br>
*/<br>
<br>
function twoPlusTwo() {<br>
return 2 + 2; // Should return 4<br>
}<br>
<br><nobr> <wbr></nobr>/*<br>
* @head1 AUTHOR<br>
*<br>
* Alice <alice@example.com><br>
*<br>
* [http://example.com](http://example.com)<br>
*<br>
*/</p><p>... which will generate this <a href="http://bravo9.com/journal/962f9cf2-ed93-4e27-b447-db1146b6741c/assets/example.html">document</a> </p><p>You can download it from <a href="http://search.cpan.org/CPAN/authors/id/R/RK/RKRIMEN/Doc-Simply-0.02.tar.gz">http://search.cpan.org/CPAN/authors/id/R/RK/RKRIMEN/Doc-Simply-0.02.tar.gz</a> </p><p>... or install it via <code>cpan</code>:<code> <br>
<br>
cpan -i Doc::Simply<br> </code></p></div><p> <a href="http://bravo9.com/journal/pod-like-documentation-for-javascript-doc-simply-962f9cf2-ed93-4e27-b447-db1146b6741c">POD-like documentation for JavaScript: Doc::Simply</a></p>grink2008-10-09T05:06:09+00:00journalJavaScript URI/URL object
http://use.perl.org/~grink/journal/37415?from=rss
<div><p>I've put together an interactive example of <a href="http://appengine.bravo9.com/b9j/documentation/uri.html">my JavaScript URI object</a>:</p><p> <a href="http://appengine.bravo9.com/b9j/example/uri/">b9j.uri.URI example</a> </p><p>The example will also show the code necessary to perform the given operation (next to the result)</p><p>b9j.uri.URI overview:</p><ul>
<li>Parses using Steven Levithan's <a href="http://blog.stevenlevithan.com/archives/parseuri">parseUri 1.2</a> </li><li>Easy path traversal (ascend to parent, descend to a child)</li><li>Set or add to the URI query (with proper encoding), get/interrogate the query (with proper decoding)</li><li>Add arbitrary data (unencoded) to the end of the query string, for extra flexibility</li><li>Manipulate/interrogate the scheme, user information (username & password), host, port, fragment, and more in a piecewise fashion</li><li>Add, change or strip the extension (html, js, css,<nobr> <wbr></nobr>...) from a given URI</li></ul><p>The code is available at <a href="http://appengine.bravo9.com/b9j/b9j.uri.js">http://appengine.bravo9.com/b9j/b9j.uri.js</a> (19kb compressed / 5kb gzipped)</p><p>See also the <a href="http://appengine.bravo9.com/b9j/documentation/uri.html">documentation for b9j.uri</a> </p><p> <a href="http://appengine.bravo9.com/b9j/example/uri/"> </a> </p></div><p> <a href="http://bravo9.com/journal/javascript-uri-object-615ae9fd-9fdd-4041-a662-98db08d8e55f">JavaScript URI object</a></p>grink2008-09-11T23:21:11+00:00journalLarge Hadron Collider (LHC) webcam
http://use.perl.org/~grink/journal/37401?from=rss
<p>Large Hadron Collider webcam, pretty interesting:</p><p><a href="http://www.cyriak.co.uk/lhc/lhc-webcams.html">http://www.cyriak.co.uk/lhc/lhc-webcams.html</a></p><p>(thanks gcohen!)</p>grink2008-09-10T22:36:51+00:00journalURI handling in JavaScript with b9j.uri
http://use.perl.org/~grink/journal/37355?from=rss
<div><p>Following my b9j.path release, I just finished up work on URI object-class for javascript.</p><p>It uses Steven Levithan's <a href="http://blog.stevenlevithan.com/archives/parseuri">parseUri 1.2</a> to do the parsing.</p><p>Some example usage:<code> <br>
<br>
var uri = new b9j.uri.URI( "http://example.com/a/b?a=1&b=2&c=3&c=4&c=5" )<br>
var host = uri.host()<br>
<br>
var child = uri.child("c.html") // http://example.com/a/b/c.html?a=1<nobr>&<wbr></nobr> b=2& ...<br>
child.query().add({ c: [ 6, 7 ], d: 8 }) // ... ?a=1&b=2&c=3&c=4&c=5&c=6&c=7&<nobr>d<wbr></nobr> =8<br>
child.query().set("b", 9) // ... ?a=1&b=9&c ...<br>
<br>
return child.toString()<br> </code></p><p>Again, while CPAN has URI.pm for URI-handling, JavaScript didn't really have an equivalent (parsing yes -- modifying/generating no).</p><p> <a href="http://appengine.bravo9.com/b9j/documentation/uri.html">b9j.uri - URI parsing, manipulation, and generation</a> </p></div><p> <a href="http://bravo9.com/journal/uri-handling-in-javascript-with-b9j-uri-a-uri-uri-query-parser-manipulator-and-generator-f86cab7d-e960-49cd-b748-b9de14bbd9c3">URI handling in JavaScript with b9j.uri: a URI/URI-query parser, manipulator, and generator</a></p>grink2008-09-04T18:47:50+00:00journalPath handling in JavaScript with b9j.path
http://use.perl.org/~grink/journal/37287?from=rss
<div><p> <a href="http://appengine.bravo9.com/b9j/documentation/path.html">b9j.path</a> provides a way to parse, manipulate, and generate URI/UNIX-style paths.</p><p>CPAN provides lots of different options for path-handling and path-manipulation, but there didn't seem to be anything really available in JavaScript-land.</p><p>To fill the gap, I've released <a href="http://appengine.bravo9.com/b9j/documentation/path.html">b9j.path</a>:<code> <br>
<br>
var path = new b9j.path.Path("/a/b/c")<br>
<br>
// /a/b/c/xyzzy<br>
var child = path.child("xyzzy")<br>
<br>
// /a/b<br>
var parent = path.parent()<br>
<br>
// ... and much, much, more...<br> </code></p><p>It's part of my <a href="http://appengine.bravo9.com/b9j">b9j javascript pack</a> available at: <a href="http://appengine.bravo9.com/b9j/b9j-latest.zip">http://appengine.bravo9.com/b9j/b9j-latest.zip</a> </p><p> <a href="http://appengine.bravo9.com/b9j/b9j-latest.zip">» Download</a> </p><p> <a href="http://appengine.bravo9.com/b9j/documentation/path.html">» Documentation</a> </p><p> <a href="http://appengine.bravo9.com/b9j/test/path.html">» Test</a> </p></div><p> <a href="http://bravo9.com/journal/path-handling-in-javascript-with-b9j-path-a-unix-style-path-parser-manipulator-and-generator-d79dd385-587a-4c7e-a2d3-7675b49ab004">Path handling in JavaScript with b9j.path: a UNIX-style path parser, manipulator, and generator</a></p>grink2008-08-28T02:10:34+00:00journalb9jTest: Simplifying and enhancing YUI Test
http://use.perl.org/~grink/journal/37279?from=rss
<div><p> <a href="http://developer.yahoo.com/yui/yuitest/">YUI Test</a> is a great tool for javascript testing, but it has a couple of small issues:</p><ul>
<li>Setting up the HTML document requires many different<nobr> <wbr></nobr>.js and<nobr> <wbr></nobr>.css assets</li><li>The actual javascript code to set up the test environment is not trivial (setting up the TestRunner, setting up the TestLogger, etc.)</li><li>A failed assertion will abort the test function immediately, preventing later tests from running</li></ul><p>b9jTest addresses the problems above by:</p><ul>
<li>Bundling all the required<nobr> <wbr></nobr>.js and<nobr> <wbr></nobr>.css assets into just two separate files</li><li>Providing some boilerplate javascript so you can jump right into testing without a lot of setup</li></ul><p> <a href="http://appengine.bravo9.com/b9j/documentation/b9jTest-example.html">An example b9jTest document</a>:<code> <br>
<br>
<html><br>
<head><br>
<meta http-equiv="content-type" content="text/html; charset=utf-8"><br>
<title>b9jTest example</title><br>
<link rel="stylesheet" type="text/css"<br>
href="http://appengine.bravo9.com/b9j/b9jTest.css"><br>
<script type="text/javascript"<br>
src="http://appengine.bravo9.com/b9j/b9jTest.js"></script><br>
</head><br>
<body class="yui-skin-sam"><br>
<div id="testLogger"></div><br>
<script type="text/javascript"><br>
<br>
b9jTest(function(test) {<br>
test.areEqual("xyzzy", "xyzzy");<br>
test.areEqual("apple", "apple");<br>
test.areEqual("banana", "banana");<br>
}); <br>
<br>
</script><br>
</body><br> </code></p><p> <code>b9jTest()</code> is a global function that accepts a function that is called with a testing object. The testing object provides access to the <a href="http://developer.yahoo.com/yui/yuitest/#assertions">standard YUI assertions</a> and <a href="http://appengine.bravo9.com/b9j/documentation/b9jTest.html">more</a>.</p><p>Documentation:</p><blockquote><div><p> <a href="http://appengine.bravo9.com/b9j/documentation/b9jTest.html">http://appengine.bravo9.com/b9j/documentation/b9jTest.html</a></p></div>
</blockquote><p>Download:</p><blockquote><div><p> <a href="http://appengine.bravo9.com/b9j/b9jTest.js">b9jTest.js</a> <br>
<a href="http://appengine.bravo9.com/b9j/b9jTest.css">b9jTest.css</a></p></div>
</blockquote></div><p> <a href="http://bravo9.com/journal/b9jtest-simplifying-and-enhancing-yui-test-f994bb05-86da-4200-944b-98b2f1b2947e">b9jTest: Simplifying and enhancing YUI Test</a></p>grink2008-08-26T23:22:55+00:00journalCopying text into the clipboard with javascript
http://use.perl.org/~grink/journal/37262?from=rss
<div><p> <a href="http://bravo9.com/journal/292559a2-cc6c-4ebf-9724-d23e8bc5ad8a/assets/example.html">Example of copying text into the clipboard</a> </p><p>Firefox won't allow copying text into the clipboard via javascript for a <a href="http://support.mozilla.com/en-US/kb/Granting+JavaScript+access+to+the+clipboard">variety of reasons</a>.</p><p>For better or worse, you can get around this problem with a little<nobr> <wbr></nobr>.swf (Flash):<code> <br>
<br>
function copyIntoClipboard(text) {<br>
<br>
var flashId = 'flashId-HKxmj5';<br>
<br>
/* Replace this with your clipboard.swf location */<br>
var clipboardSWF = 'http://appengine.bravo9.com/copy-into-clipboard/cli<nobr>p<wbr></nobr> board.swf';<br>
<br>
if(!document.getElementById(flashId)) {<br>
var div = document.createElement('div');<br>
div.id = flashId;<br>
document.body.appendChild(div);<br>
}<br>
document.getElementById(flashId).innerHTML = '';<br>
var content = '<embed src="' + <br>
clipboardSWF +<br>
'" FlashVars="clipboard=' + encodeURIComponent(text) +<br>
'" width="0" height="0" type="application/x-shockwave-flash"></embe<nobr>d<wbr></nobr> >';<br>
document.getElementById(flashId).innerHTML = content;<br>
}<br> </code></p><p>The above trick will also work in Safari, IE, and Opera.</p><p>Download <a href="http://appengine.bravo9.com/copy-into-clipboard/clipboard.swf">clipboard.swf</a> </p><p>Alternatively, you can use the Google App Engine hosted version at<br>
<a href="http://appengine.bravo9.com/copy-into-clipboard/clipboard.swf">http://appengine.bravo9.com/copy-into-clipboard/clipboard.swf</a> </p><p>(Originally adapted from <a href="http://www.jeffothy.com/weblog/clipboard-copy/">http://www.jeffothy.com/weblog/clipboard-copy/</a>)</p></div><p> <a href="http://bravo9.com/journal/copying-text-into-the-clipboard-with-javascript-in-firefox-safari-ie-opera-292559a2-cc6c-4ebf-9724-d23e8bc5ad8a">Copying text into the clipboard with javascript in Firefox, Safari, IE, Opera,<nobr> <wbr></nobr>...</a></p>grink2008-08-24T01:30:25+00:00journalGetopt::Chain released: git(1) style command-line processing
http://use.perl.org/~grink/journal/37220?from=rss
<div><p> <a href="http://search.cpan.org/dist/Getopt-Chain/">Getopt::Chain</a> </p><p>
Option and subcommand processing in the style svn(1) and git(1)
</p><p>Getopt::Chain will help you make your command-line scripts work like this:<code> <br>
<br>
./script --opt --opt=<value> cmd --opt ...<br>
./script cmd ...<br> </code></p><p>NOTE: Any option specification covered by Getopt::Long is fair game.</p><p>Here is some example usage:<code> <br>
<br>
#!/usr/bin/perl -w<br>
<br>
use strict;<br>
use Getopt::Chain;<br>
<br>
# A partial, pseudo-reimplementation of git(1):<br>
<br>
Getopt::Chain->process(<br>
<br>
options => [qw/ version bare git-dir=s /]<br>
<br>
run => sub {<br>
my $context = shift;<br>
my @arguments = @_; # Remaining, unparsed arguments<br>
<br>
# ... do stuff before any subcommand ...<br>
<br>
}<br>
<br>
commands => {<br>
<br>
init => {<br>
options => [qw/ quiet|q --template=s /]<br>
run => sub {<br>
my $context = shift;<br>
my @arguments = @_; # Again, remaining unparsed arguments <br><nobr> <wbr></nobr>
<br>
# ... do init stuff ...<br>
}<br>
}<br>
<br>
commit => {<br>
options => [qw/ all|a message|m=s /]<br>
run => sub {<br>
my $context = shift;<br>
<br>
# ... do commit stuff ..<br>
}<br>
}<br>
<br>
add => ...<br>
<br>
help => ...<br>
<br>
...<br>
}<br>
)<br>
<br>
# The above will allow the following (example) usage:<br>
#<br>
# ./script --version<br>
# ./script --git-dir path/to/repository init<br>
# ./script --git-dir path/to/repository commit -a --message '...'<br>
# ./script commit -m '~'<br> </code></p><p>The source repository is on GitHub: <a href="http://github.com/robertkrimen/getopt-chain/tree/master">http://github.com/robertkrimen/getopt-chain/tree/master</a> </p></div><p> <a href="http://bravo9.com/journal/getopt-chain-released-git-1-and-svn-1-style-command-line-processing-6e36d6a5-0570-4ab6-b276-2cb61ec9a6b3">Getopt::Chain released: git(1) and svn(1) style command-line processing</a></p>grink2008-08-17T20:30:48+00:00journalHash::Param released
http://use.perl.org/~grink/journal/37205?from=rss
<div><p> <a href="http://search.cpan.org/dist/Hash-Param/">Hash::Param</a> </p><p>
A CGI/Catalyst::Request-like parameter-hash accessor/mutator<code> <br>
<br>
my $params = Hash::Param->new(parameters => {<br>
qw/a 1 b 2 c 3/,<br>
d => [qw/4 5 6 7/],<br>
})<br>
<br>
$result = $params->param( a ) # Returns 1<br>
$result = $params->param( d ) # Returns 4<br>
@result = $params->param( d ) # Returns 4, 5, 6, 7<br>
@result = $params->params # Returns a, b, c, d<br>
$result = $params->params # Returns { a => , b => 2,<br>
c => 3, d => [ 4, 5, 6,<nobr> <wbr></nobr> 7 ] }<br>
@result = $params->params( a, b, d ) # Returns 1, 2, [ 4, 5, 6, 7 ]<br>
%result = $params->slice( a, b ) # Returns a => 1, b => 2<br>
<br>
$params->param( a => 8 ) # Sets a to 8<br>
$params->param( a => 8, 9 ) # Sets a to [ 8, 9 ]<br> </code></p><p>The source repository is on GitHub: <a href="http://github.com/robertkrimen/hash-param/tree/master">http://github.com/robertkrimen/hash-param/tree/master</a> </p></div><p> <a href="http://bravo9.com/journal/hash-param-released-262b82a4-e074-4ff0-85ec-d6b076ed7961">Hash::Param released</a></p>grink2008-08-16T16:20:04+00:00journalString::Comments::Extract released
http://use.perl.org/~grink/journal/37177?from=rss
<div><p> <a href="http://search.cpan.org/dist/String-Comments-Extract/">String::Comments::Extract</a> <code> <br>
<br>
my $comments = String::Comments::Extract::C->extract($source)<br> </code></p><p>String::Comments::Extract is a tool for extracting comments from C/C++/JavaScript/Java. The extractor is implemented using an actual tokenizer (written in C via XS [adapted from JavaScript::Minifier::XS]). By using a tokenizer, it can correctly deal with notoriously problematic cases, such as comment-like structures embedded in strings:<code> <br>
<br>
std::cout << "This is not a // real C++ comment " << std::endl<br>
printf("/* This is not a real C comment */\n");<br>
# The extractor will ignore both of the above<br> </code></p><p>The source repository is on GitHub: <a href="http://github.com/robertkrimen/string-comments-extract/tree/master">http://github.com/robertkrimen/string-comments-extract/tree/master</a> </p></div><p> <a href="http://bravo9.com/journal/string-comments-extract-released-1b3c8b8a-ea39-4f3f-b209-aa098b63e77b">String::Comments::Extract released</a></p>grink2008-08-14T06:14:32+00:00journalA simple lightbox (modal) dialog with YUI
http://use.perl.org/~grink/journal/37166?from=rss
<div><p> <a href="http://bravo9.com/journal/c5b048f5-b278-46d1-9a7e-0d3035094f52/assets/example.html">Example of a simple lightbox (modal) dialog with YUI</a> </p><p>A lightbox (modal) dialog is an effective way to bring attention to an input form or important message.</p><p>You'll need the following YUI assets:<code> <br>
<br>
<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.2<nobr>/<wbr></nobr> build/reset-fonts-grids/reset-fonts-grids.css"><br>
<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.2<nobr>/<wbr></nobr> build/container/assets/skins/sam/container.css"><br>
<script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/ya<nobr>h<wbr></nobr> oo-dom-event/yahoo-dom-event.js"></script> <br>
<script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/co<nobr>n<wbr></nobr> tainer/container-min.js"></script> <br> </code></p><p>The easiest way to make a lightbox in YUI is to construct a <code>YAHOO.widget.Panel</code> and use<nobr> <wbr></nobr><code>.setBody</code> to put in content:<code> <br>
<br>
var panel = new YAHOO.widget.Panel(<br>
"panel", // The element id<br>
{<br>
width: "480px", <br>
fixedcenter: true, <br>
close: false, <br>
draggable: false, <br>
zindex: 4,<br>
modal: true,<br>
visible: false<br>
}<br>
);<br>
panel.setBody("<p>Aliquam ultrices. Nulla dictum, augue et condimentum comm<nobr>o<wbr></nobr> do.</p>");<br>
panel.render(document.body);<br>
panel.show();<br> </code></p><p>One gotcha to keep in mind is that the class attribute of the page <code><body></code> <em>must</em> include <code>yui-skin-sam</code>. The <code>yui-skin-sam</code> class is necessary to provide:</p><ol>
<li>Basic styling for the panel (such as border and drop shadow)</li><li>Darkening of the contents behind the panel</li></ol><p>Another gotcha with the example is that you cannot change the content after rendering (doing so will cause the close link to stop working). This has to do with associating an event handler with a DOM node and then destroying that node when you change the content. Event delegation is a good solution to this problem.</p></div><p> <a href="http://bravo9.com/journal/a-simple-lightbox-modal-dialog-with-yui-c5b048f5-b278-46d1-9a7e-0d3035094f52">A simple lightbox (modal) dialog with YUI</a></p>grink2008-08-12T20:12:54+00:00journalCPAN: Where is the source repository for $DIST?
http://use.perl.org/~grink/journal/37141?from=rss
<p>Something that would be nice to have:</p><p>The ability to embed a link to the project's source repository so that <a href="http://search.cpan.org/">search.cpan.org</a> could display it.</p><p>You can do this by sticking something in the POD, but having it in a standard place (like Links:) would be much, much better:<br><code><br>
* You could find the project's repository without hunting through the POD<br>
* You could tell, at a glance, if a project has a repository that the author would like to share<br>
* It would encourage users to contribute documentation and bug fixes<br></code></p>grink2008-08-10T00:19:11+00:00journalURI::PathAbstract released
http://use.perl.org/~grink/journal/37090?from=rss
<p>I've just released <a href="http://search.cpan.org/perldoc?URI::PathAbstract">URI::PathAbstract</a> into the wild, which is a melding of URI and Path::Abstract</p><p>You can use it to do things like:<br><code><br>
my $uri = URI::PathAbstract->new("http://example.com?a=b")</code></p><p><code>
$uri->down("apple")<br>
# http://example.com/apple?a=b</code></p><p><code>
$uri->query("c=d&e=f")<br>
# http://example.com/apple?c=d&e=f</code></p><p><code>
$uri->path("grape/blueberry/pineapple")<br>
# http://example.com/grape/blueberry/pineapple?c=d&e=f</code></p><p><code>
$uri = $uri->parent<br>
# http://example.com/grape/blueberry?c=d&e=f<br></code></p>grink2008-08-04T08:38:59+00:00journalGoogle::AJAX::Library released
http://use.perl.org/~grink/journal/36606?from=rss
<div><p>Just released <a href="http://search.cpan.org/dist/Google-AJAX-Library/">Google::AJAX::Library</a> for accessing the Google <a href="http://code.google.com/apis/ajaxlibs/">AJAX Libraries API</a> in Perl.</p><p>Here is some example usage:<code> <br>
<br>
use Google::AJAX::Library;<br>
<br>
my $library = Google::AJAX::Library->jquery;<br>
<br>
$library->uri<br>
# http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js<br>
<br>
$library->html<br>
# <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"<nobr> <wbr></nobr> type="text/javascript"></script><br> </code></p></div><p> <a href="http://bravo9.com/journal/google-ajax-library-released-c7847452-d568-4c78-a343-52b48c5ee74d">Google::AJAX::Library released</a></p>grink2008-06-07T02:20:57+00:00journal