<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MaisonBisson.com &#187; javascript</title>
	<atom:link href="http://maisonbisson.com/blog/post/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://maisonbisson.com</link>
	<description>A bunch of stuff I would have emailed you about.</description>
	<lastBuildDate>Sat, 14 Nov 2009 20:14:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JSNES: JavaScript Nintendo Emulator</title>
		<link>http://maisonbisson.com/blog/post/14085/jsnes-javascript-nintendo-emulator/</link>
		<comments>http://maisonbisson.com/blog/post/14085/jsnes-javascript-nintendo-emulator/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 16:21:51 +0000</pubDate>
		<dc:creator>Casey</dc:creator>
				<category><![CDATA[Dispatches]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[browser-based]]></category>
		<category><![CDATA[emulator]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[JSNES]]></category>
		<category><![CDATA[NES]]></category>
		<category><![CDATA[Nintendo]]></category>
		<category><![CDATA[Nintendo Entertainment System]]></category>

		<guid isPermaLink="false">http://maisonbisson.com/?p=14085</guid>
		<description><![CDATA[

Ben Fisherman&#8217;s JSNES runs entirely in the browser using nothing more intrusive than JavaScript. It apparently manages real-time performance within Chrome, but it works (if not playably) on an iPhone.
I wish the screen was resizable and that it supported iPhone compatible controls, but both of those assume that browser performance will improve enough to make [...]]]></description>
			<content:encoded><![CDATA[<abbr class="unapi-id" title="maisonbisson-14085"><!-- &nbsp; --></abbr>
<p><a href="http://www.flickr.com/photos/maisonbisson/3936876875/" title="JSNES on Safari 4/Mac OS 10.6 by misterbisson, on Flickr"><img src="http://farm3.static.flickr.com/2675/3936876875_67147e6273.jpg" width="464" height="454" alt="JSNES on Safari 4/Mac OS 10.6" /></a></p>
<p>Ben Fisherman&#8217;s <a title="JSNES: A Javascript NES emulator" href="http://benfirshman.com/projects/jsnes/">JSNES</a> runs entirely in the browser using nothing more intrusive than JavaScript. It apparently manages real-time performance within Chrome, but <a title="JSNES on iPhone on Flickr - Photo Sharing!" href="http://www.flickr.com/photos/maisonbisson/3937327632/">it works (if not playably) on an iPhone</a>.</p>
<p>I wish the screen was resizable and that it supported iPhone compatible controls, but both of those assume that browser performance will improve enough to make it playable. Interestingly, though not surprisingly, the Safari JS engine is limited to consuming a single CPU (which it quickly does while playing JSNES).</p>
]]></content:encoded>
			<wfw:commentRss>http://maisonbisson.com/blog/post/14085/jsnes-javascript-nintendo-emulator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress 2.8 Script Handling</title>
		<link>http://maisonbisson.com/blog/post/13929/wordpress-28-script-handling/</link>
		<comments>http://maisonbisson.com/blog/post/13929/wordpress-28-script-handling/#comments</comments>
		<pubDate>Sun, 31 May 2009 15:16:36 +0000</pubDate>
		<dc:creator>Casey</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[WordPress 2.8]]></category>

		<guid isPermaLink="false">http://maisonbisson.com/?p=13929</guid>
		<description><![CDATA[
jQuery 1.3.2 is in WordPress 2.8, but the most exciting changes are in the automatic concatenation and compression of scripts via the script loader.
Andrew Ozz says “This feature can easily be extended to include scripts added by plugins and to use server side caching, however that would require some changes to the server settings (.htaccess [...]]]></description>
			<content:encoded><![CDATA[<abbr class="unapi-id" title="maisonbisson-13929"><!-- &nbsp; --></abbr>
<p><a title="/trunk/wp-includes/js/jquery/jquery.js – WordPress Trac" href="http://core.trac.wordpress.org/browser/trunk/wp-includes/js/jquery/jquery.js">jQuery 1.3.2 is in</a> <a href="http://codex.wordpress.org/Version_2.8">WordPress 2.8</a>, but the most exciting changes are in the automatic concatenation and compression of scripts <a title="Script loader updates « WordPress Development Updates" href="http://wpdevel.wordpress.com/2009/02/06/script-loader-updates/">via the script loader</a>.</p>
<p>Andrew Ozz says “This feature can easily be extended to include scripts added by plugins and to use server side caching, however that would require some changes to the server settings (.htaccess on Apache).”</p>
<p>I have yet to figure out how to extend that feature to scripts in my plugins, but I&#8217;m working on it.</p>
]]></content:encoded>
			<wfw:commentRss>http://maisonbisson.com/blog/post/13929/wordpress-28-script-handling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSSHttpRequest: cross domain JavaScript solution</title>
		<link>http://maisonbisson.com/blog/post/12842/csshttprequest-cross-domain-javascript-solution/</link>
		<comments>http://maisonbisson.com/blog/post/12842/csshttprequest-cross-domain-javascript-solution/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 19:58:26 +0000</pubDate>
		<dc:creator>Casey</dc:creator>
				<category><![CDATA[Dispatches]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[CHR]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[CSSHttpRequest]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://maisonbisson.com/?p=12842</guid>
		<description><![CDATA[
Who&#8217;d a thunk it: CSSHttpRequest is a way of doing cross-domain AJAX by using CSS&#8217; @import method to fetch the data.
]]></description>
			<content:encoded><![CDATA[<abbr class="unapi-id" title="maisonbisson-12842"><!-- &nbsp; --></abbr>
<p>Who&#8217;d a thunk it: <a title="CSSHttpRequest - Hacks - nb.io" href="http://nb.io/hacks/csshttprequest/">CSSHttpRequest</a> is a way of doing cross-domain AJAX by using CSS&#8217; <code>@import</code> method to fetch the data.</p>
]]></content:encoded>
			<wfw:commentRss>http://maisonbisson.com/blog/post/12842/csshttprequest-cross-domain-javascript-solution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Browser-Based JSON Editors</title>
		<link>http://maisonbisson.com/blog/post/12488/browser-based-json-editors/</link>
		<comments>http://maisonbisson.com/blog/post/12488/browser-based-json-editors/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 11:49:22 +0000</pubDate>
		<dc:creator>Casey</dc:creator>
				<category><![CDATA[Dispatches]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[web applications]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://maisonbisson.com/?p=12488</guid>
		<description><![CDATA[
JSONLint, a JSON validator, was the tool I needed a while ago to be able to play with JSON as format for exchanging data in some APIs I was working on a while ago. And now I like JSON well enough that I&#8217;m thinking of using it as an internal data format in one of [...]]]></description>
			<content:encoded><![CDATA[<abbr class="unapi-id" title="maisonbisson-12488"><!-- &nbsp; --></abbr>
<p><a title="JSONLint - The JSON Validator." href="http://www.jsonlint.com/">JSONLint</a>, a JSON validator, was the tool I needed a while ago to be able to play with JSON as format for exchanging data in some APIs I was working on a while ago. And now I like JSON well enough that I&#8217;m thinking of using it as an internal data format in one of my applications, especially because it&#8217;s relatively easy to work with in JavaScript. Or, at least that&#8217;s the promise.</p>
<p>What I&#8217;ll need is an easy way to manipulate the contents of a simple array, and these JSON editors may give me a start.</p>
<p>The <a title="JSON Editor" href="http://braincast.nl/samples/jsoneditor/">Braincast JSON editor</a> was the first I found, but it doesn&#8217;t allow creation/expansion of the JSON. <a href="http://katamari.co.jp/">Katamari</a>&#8217;s <a title="JSON Editor by katamari" href="http://jsoneditor.net/#editor">JSON editor</a> seems to work and has a lot of features and a post 2005-looking interface, but that doesn&#8217;t make it simple. Worse, I don&#8217;t think it&#8217;s available for me to <a href="http://www.opensource.org/docs/definition.php">re-use, modify, or extend</a> in my projects. <a title="My JSON editor" href="http://www.thomasfrank.se/json_editor.html">Thomas Frank</a>&#8217;s <a title="http://www.thomasfrank.se/downloadableJS/JSONeditor_example.html" href="http://www.thomasfrank.se/downloadableJS/JSONeditor_example.html">JSON editor</a>, on the other hand, does have the features I need and a GPL license. That&#8217;s the place to start.</p>
<p>Extra: a <a href="http://tlrobinson.net/projects/js/jsondiff/">JSON diff</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://maisonbisson.com/blog/post/12488/browser-based-json-editors/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Steve Souders On Website Performance</title>
		<link>http://maisonbisson.com/blog/post/12238/steve-souders-on-website-performance/</link>
		<comments>http://maisonbisson.com/blog/post/12238/steve-souders-on-website-performance/#comments</comments>
		<pubDate>Sat, 16 Aug 2008 17:23:56 +0000</pubDate>
		<dc:creator>Casey Bisson</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[Steve Souders]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://maisonbisson.com/blog/?p=12238</guid>
		<description><![CDATA[
Steve Souders: 10% of the problem is server performance, 90% of problem is browser activity after the main html is downloaded. He wrote the book and developed YSlow, so he should know.
JavaScripts are downloaded serially and block other activity. Most JavaScript functions aren&#8217;t used at OnLoad. We could split the JS and only load essential [...]]]></description>
			<content:encoded><![CDATA[<abbr class="unapi-id" title="maisonbisson-12238"><!-- &nbsp; --></abbr>
<p><a href="http://stevesouders.com/">Steve Souders</a>: 10% of the problem is server performance, 90% of problem is browser activity after the main html is downloaded. He wrote <a href="http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309/?tag=maisonbisson-20">the book</a> and developed <a href="http://developer.yahoo.com/yslow/">YSlow</a>, so he should know.</p>
<p>JavaScripts are downloaded serially and block other activity. Most JavaScript functions aren&#8217;t used at OnLoad. We could split the JS and only load essential functions up front, and load all the rest later. How much might that help? He says 25% to 50%. This quickly gets complex, but he&#8217;s got a simple plan that considers three questions:</p>
<ul>
<li>Is the script URL on the same host as the main HTML?</li>
<li>Should the browser indicate it&#8217;s busy, or not?</li>
<li>Does script execution order mater?</li>
</ul>
<p>And at that point things started to get too interesting to take publishable notes. I clearly need to pay more attention to this guy.</p>
<p>Stats he mentioned without being specific about the source:</p>
<ul>
<li>Google: 200ms longer download time cut revenue by 20%</li>
<li>Yahoo: 100ms of latency costs &#8230; big.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://maisonbisson.com/blog/post/12238/steve-souders-on-website-performance/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Detecting Broken Images in JavaScript</title>
		<link>http://maisonbisson.com/blog/post/12150/detecting-broken-images-in-javascript/</link>
		<comments>http://maisonbisson.com/blog/post/12150/detecting-broken-images-in-javascript/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 14:45:49 +0000</pubDate>
		<dc:creator>Casey Bisson</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[broken images]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[link rot]]></category>
		<category><![CDATA[onerror]]></category>
		<category><![CDATA[web design]]></category>

		<guid isPermaLink="false">http://maisonbisson.com/blog/?p=12150</guid>
		<description><![CDATA[
We&#8217;ve become accustomed to link rot and broken images in nearly all corners of the web, but is there a way to keep things a bit cleaner?
K.T. Lam of Hong Kong University of Science and Technology came up with this sweet trick using jQuery and readyState to find and replace broken images:

jQuery&#40;'span#gbs_'+info.bib_key&#41;.parents&#40;'ul'&#41;.find&#40;'img.bookjacket[@readyState*=&#34;uninitialized&#34;]'&#41;.replaceWith&#40;'&#60;img src=&#34;'+info.thumbnail_url+'&#34; alt=&#34;'+strTitle+'&#34; height=&#34;140&#34; [...]]]></description>
			<content:encoded><![CDATA[<abbr class="unapi-id" title="maisonbisson-12150"><!-- &nbsp; --></abbr>
<p>We&#8217;ve become accustomed to link rot and broken images in nearly all corners of the web, but is there a way to keep things a bit cleaner?</p>
<p>K.T. Lam of Hong Kong University of Science and Technology came up with <a href="http://catalog.ust.hk/catalog/wp-content/plugins/scriblio/js/scrib.googlebook.js">this sweet trick</a> using jQuery and <code>readyState</code> to find and replace broken images:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript javascript" style="font-family:monospace;">jQuery<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'span#gbs_'</span><span style="color: #339933;">+</span>info.<span style="color: #660066;">bib_key</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">parents</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ul'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'img.bookjacket[@readyState*=&quot;uninitialized&quot;]'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">replaceWith</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;img src=&quot;'</span><span style="color: #339933;">+</span>info.<span style="color: #660066;">thumbnail_url</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'&quot; alt=&quot;'</span><span style="color: #339933;">+</span>strTitle<span style="color: #339933;">+</span><span style="color: #3366CC;">'&quot; height=&quot;140&quot; width=&quot;88&quot; /&gt;'</span><span style="color: #009900;">&#41;</span>;</pre></div></div>

<p>And it works really well, but only in IE. Testing for <code>img.complete</code> or <code>img.naturalWidth</code> <a href="http://talideon.com/weblog/2005/02/detecting-broken-images-js.cfm">might be possibilities</a>, but I&#8217;m much more interested in the <code>onerror</code> property of the img tag:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>img src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;picture1.gif&quot;</span> <span style="color: #000066;">onerror</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;this.onerror=null;this.src='missing.gif';&quot;</span><span style="color: #339933;">/&gt;</span></pre></div></div>

<p>Or in JS:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> imgsrc <span style="color: #339933;">=</span> <span style="color: #3366CC;">'picture1.gif'</span>;
<span style="color: #003366; font-weight: bold;">var</span> img <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Image<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
&nbsp;
img.<span style="color: #000066;">onerror</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>evt<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">src</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot; can't be loaded.&quot;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span>
img.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>evt<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">src</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot; is loaded.&quot;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
img.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> imgsrc;</pre></div></div>

<p>Or call a JS function when the browser detects a broken image:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>html<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>script language<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;JavaScript&quot;</span> type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #003366; font-weight: bold;">function</span> ImgError<span style="color: #009900;">&#40;</span>source<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	source.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;/images/noimage.gif&quot;</span>;
	source.<span style="color: #000066;">onerror</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&quot;</span>;
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">true</span>;
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;</span>
&nbsp;
<span style="color: #339933;">&lt;</span>body<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>div<span style="color: #339933;">&gt;&lt;</span>img src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;http://jquery.com/images/bibeault_cover150A.jpg&quot;</span>
border<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;1&quot;</span> height<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;100&quot;</span> alt<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;image&quot;</span> <span style="color: #000066;">onerror</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;ImgError(this)&quot;</span> <span style="color: #339933;">/&gt;&lt;/</span>div<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></pre></div></div>

<p>I haven&#8217;t tested any of this code, but it&#8217;s just a matter of time.</p>
]]></content:encoded>
			<wfw:commentRss>http://maisonbisson.com/blog/post/12150/detecting-broken-images-in-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sweet jQuery</title>
		<link>http://maisonbisson.com/blog/post/11506/sweet-jquery/</link>
		<comments>http://maisonbisson.com/blog/post/11506/sweet-jquery/#comments</comments>
		<pubDate>Tue, 16 Jan 2007 17:00:30 +0000</pubDate>
		<dc:creator>Casey Bisson</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[matt batchelder]]></category>

		<guid isPermaLink="false">http://maisonbisson.com/blog/post/11506/</guid>
		<description><![CDATA[
Matty discovered jQuery at The Ajax Experience, and his enthusiasm has rubbed off on me.
jQuery makes coding JavaScript fun again. Well, at least it makes it possible to write code and content separately. And that means that sweet AJAXy pages can be made more easily, and it sort of forces designers to make them accessible [...]]]></description>
			<content:encoded><![CDATA[<abbr class="unapi-id" title="maisonbisson-11506"><!-- &nbsp; --></abbr>
<p><img src="http://jquery.com/files/design/images/jquery_logo.gif" width="231" height="85" alt="jQuery Logo" style="float: right; margin: 0 0 6px 10px; border: 10px solid #333333;" />Matty <a href="http://borkweb.com/story/the-ajax-experience-leveraging-ajax-for-enterprise-application-development" title="BorkWeb » The Ajax Experience: Leveraging Ajax for Enterprise Application Development">discovered jQuery at The Ajax Experience</a>, and <a href="http://borkweb.com/story/the-ajax-experience-jquery-toolkit" title="BorkWeb » The Ajax Experience: jQuery Toolkit">his enthusiasm</a> has rubbed off on me.</p>
<p>jQuery makes coding JavaScript fun again. Well, at least it makes it possible to write code and content separately. And that means that sweet AJAXy pages can be made more easily, and it sort of forces designers to make them accessible from the start.</p>
<p>Resources:</p>
<ul>
<li><a href="http://jquery.com/" title="jQuery: JavaScript Library">jQuery: JavaScript Library</a></li>
<li><a href="http://jquery.bassistance.de/jquery-getting-started.html" title="Getting Started with jQuery">Getting Started with jQuery</a></li>
<li><a href="http://visualjquery.com/index.xml" title="Visual jQuery 1.0 (Automated)">Visual jQuery 1.0 (Automated)</a></li>
<li><a href="http://jquery.com/docs/Plugins/" title="jQuery: Plugins">jQuery: Plugins</a></li>
</ul>
<p><tags>ajax, javascript, jquery, matt batchelder</tags></p>
]]></content:encoded>
			<wfw:commentRss>http://maisonbisson.com/blog/post/11506/sweet-jquery/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ryan Eby&#8217;s Pursuit of Live-Search</title>
		<link>http://maisonbisson.com/blog/post/10963/three-links-from-ryan-eby/</link>
		<comments>http://maisonbisson.com/blog/post/10963/three-links-from-ryan-eby/#comments</comments>
		<pubDate>Sun, 18 Dec 2005 23:34:55 +0000</pubDate>
		<dc:creator>Casey Bisson</dc:creator>
				<category><![CDATA[Libraries & Networked Information]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[ahah]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[libraries]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[live]]></category>
		<category><![CDATA[live search]]></category>
		<category><![CDATA[livesearch]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web applications]]></category>

		<guid isPermaLink="false">http://maisonbisson.com/blog/?p=10963</guid>
		<description><![CDATA[
Ryan Eby gets excited over LiveSearch. And who can blame him? I mention the preceding because it explains the following: two links leading to some good examples of livesearch in the wild.
Inquisitor is a livesearch plugin for OS X&#8217;s Safari web browser. It gives the top few hits, spelling suggestions where appropriate, and links to [...]]]></description>
			<content:encoded><![CDATA[<abbr class="unapi-id" title="maisonbisson-10963"><!-- &nbsp; --></abbr>
<p>Ryan Eby <a href="http://blog.ryaneby.com/archives/more-dynamic-search-interfaces/" title="ebyblog » Blog Archive » More Dynamic Search Interfaces">gets excited</a> over <a href="http://libdev.plymouth.edu/post/29" title="libdev » LiveSearch and Clustered Displays">LiveSearch</a>. And who can blame him? I mention the preceding because it explains the following: two links leading to some good examples of livesearch in the wild.</p>
<p><a href="http://www.inquisitorx.com/beta/" title="inquisitor ~ instant search">Inquisitor</a> is a livesearch plugin for OS X&#8217;s Safari web browser. It gives the top few hits, spelling suggestions where appropriate, and links to jump to other search engines.</p>
<p>Garrett Murray&#8217;s <a href="http://maniacalrage.net/">ManiacalRage</a> is an interesting blog on its own, but he&#8217;s also doing some good AJAX on his search interfaces. Look first at the <a href="http://graveyard.maniacalrage.net/" title="Maniacal Rage. Senseless acts of writing.">archive search</a>. But also take some time to appreciate the <a href="http://maniacalrage.net/#nav">new content search</a>. Sure, you&#8217;ll have some complaints, but it&#8217;s his site and not yours and there are some ideas there that are pretty interesting and useful.</p>
<p><tags>live, search, live search, livesearch, ajax, ahah, javascript, web, web applications, library, libraries</tags></p>
]]></content:encoded>
			<wfw:commentRss>http://maisonbisson.com/blog/post/10963/three-links-from-ryan-eby/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>50+ Ways Good HTML Can Go Bad</title>
		<link>http://maisonbisson.com/blog/post/10930/50-ways-good-html-can-go-bad/</link>
		<comments>http://maisonbisson.com/blog/post/10930/50-ways-good-html-can-go-bad/#comments</comments>
		<pubDate>Tue, 01 Nov 2005 13:00:02 +0000</pubDate>
		<dc:creator>Casey Bisson</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[browser threats]]></category>
		<category><![CDATA[cheatsheet]]></category>
		<category><![CDATA[cross site javascript]]></category>
		<category><![CDATA[cross site scripting]]></category>
		<category><![CDATA[filter evasion]]></category>
		<category><![CDATA[internet threats]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[threat]]></category>
		<category><![CDATA[threats]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web browser]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://maisonbisson.com/blog/?p=10930</guid>
		<description><![CDATA[
Via Brad Neuberg: RSnake&#8217;s XSS (Cross Site Scripting) Cheatsheet: Esp: for filter evasion.
Limitations on cross site scripting (XSS hereafter) have been troubling me as I try to write enhancements to our library catalog, but the reasons for the prohibition are sound. Without them I could snort your browser cookies (RSnake lists: “cookie/credential stealing/replay/session riding” among [...]]]></description>
			<content:encoded><![CDATA[<abbr class="unapi-id" title="maisonbisson-10930"><!-- &nbsp; --></abbr>
<p>Via <a href="http://codinginparadise.org/weblog/2005/10/cross-site-scripting-cheat-sheet.html" title="Brad Neuberg: Coding In Paradise: Cross-Site Scripting Cheat Sheet">Brad Neuberg</a>: RSnake&#8217;s <a href="http://ha.ckers.org/xss.html" title="XSS (Cross Site Scripting) Cheatsheet: Esp: for filter evasion - by RSnake">XSS (Cross Site Scripting) Cheatsheet: Esp: for filter evasion</a>.</p>
<p><a href="http://maisonbisson.com/blog/post/10802/">Limitations on cross site scripting</a> (XSS hereafter) have been troubling me as I try to write enhancements to our library catalog, but the reasons for the prohibition are sound. Without them I could snort your browser cookies (RSnake lists: “cookie/credential stealing/replay/session riding” among the threats, but a well-planned attack could also fetch resources from internal webservers and deliver them to external data thieves).<br />
It turns out you can insert JavaScript in &lt;img&gt; tags (among many, many others) and obfuscate it with Unicode, hex, and other less-readable encodings or by inserting tab characters (“&#38;#x09;”) or newlines (“&#38;#x0A;”). It would be impossible for me to list every possible attack vector, but RSnake takes a good stab at it.</p>
<p>If you allow users to insert HTML in comments, you should be aware of this&#8230;.</p>
<p><!-- technorati tags start -->
<p style="text-align:right;font-size:10px;">tags: <a href="http://www.technorati.com/tag/browser threats" rel="tag">browser threats</a>, <a href="http://www.technorati.com/tag/cheatsheet" rel="tag">cheatsheet</a>, <a href="http://www.technorati.com/tag/cross site javascript" rel="tag">cross site javascript</a>, <a href="http://www.technorati.com/tag/cross site scripting" rel="tag">cross site scripting</a>, <a href="http://www.technorati.com/tag/filter evasion" rel="tag">filter evasion</a>, <a href="http://www.technorati.com/tag/internet threats" rel="tag">internet threats</a>, <a href="http://www.technorati.com/tag/javascript" rel="tag">javascript</a>, <a href="http://www.technorati.com/tag/scripting" rel="tag">scripting</a>, <a href="http://www.technorati.com/tag/threat" rel="tag">threat</a>, <a href="http://www.technorati.com/tag/threats" rel="tag">threats</a>, <a href="http://www.technorati.com/tag/web" rel="tag">web</a>, <a href="http://www.technorati.com/tag/web browser" rel="tag">web browser</a>, <a href="http://www.technorati.com/tag/xss" rel="tag">xss</a></p>
<p><!-- technorati tags end --></p>
]]></content:encoded>
			<wfw:commentRss>http://maisonbisson.com/blog/post/10930/50-ways-good-html-can-go-bad/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Plan C: Signed JavaScripts</title>
		<link>http://maisonbisson.com/blog/post/10828/signed-javascripts/</link>
		<comments>http://maisonbisson.com/blog/post/10828/signed-javascripts/#comments</comments>
		<pubDate>Tue, 20 Sep 2005 16:17:09 +0000</pubDate>
		<dc:creator>Casey Bisson</dc:creator>
				<category><![CDATA[Libraries & Networked Information]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[cross domain]]></category>
		<category><![CDATA[cross domain script exclusion]]></category>
		<category><![CDATA[cross domain scripting]]></category>
		<category><![CDATA[internet security]]></category>
		<category><![CDATA[intranet environment]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[javascript security]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[security components]]></category>
		<category><![CDATA[signed script]]></category>
		<category><![CDATA[signed scripts]]></category>
		<category><![CDATA[web scripting]]></category>
		<category><![CDATA[web security]]></category>
		<category><![CDATA[xdomain]]></category>
		<category><![CDATA[xmlhttprequest]]></category>

		<guid isPermaLink="false">http://maisonbisson.com/blog/?p=10828</guid>
		<description><![CDATA[
The Mozilla docs on JavaScript security give a hint of hope that signed scripts will work around the cross-domain script exclusions that all good browsers enforce. But an item at DevArticles.com throws water on the idea:
Signed scripts are primarily useful in an intranet environment; they’re not so useful on the Web in general. To see [...]]]></description>
			<content:encoded><![CDATA[<abbr class="unapi-id" title="maisonbisson-10828"><!-- &nbsp; --></abbr>
<p>The Mozilla docs on <a href="http://www.mozilla.org/projects/security/components/jssec.html">JavaScript security</a> give a hint of hope that <a href="http://www.mozilla.org/projects/security/components/signed-scripts.html">signed scripts</a> will work around the cross-domain script exclusions that all <a href="http://browsehappy.com/">good browsers</a> enforce. But an item at <a href="http://www.devarticles.com/c/a/JavaScript/JavaScript-Security/3/">DevArticles.com</a> throws water on the idea:</p>
<blockquote><p>Signed scripts are primarily useful in an intranet environment; they’re not so useful on the Web in general. To see why this is, consider that even though you can authenticate the origin of a signed script on the Web, there’s still no reason to trust the creator. If you encounter a script signed by your company’s IT department, you can probably trust it without much risk. However, you’d have no reason to think that a party you don’t know—for example, a random company on the Web—is at all trustworthy. So they signed their JavaScript—that doesn’t mean it doesn’t try to do something malicious! And if it did, most users would have no way of knowing.</p></blockquote>
<p>In short, most browsers will pop up a scary looking security window asking the user what he or she want to do, and the chances of the user hitting the button marked “no, I don&#8217;t dare allow cross-domain XMLHTTPRequest calls” are at least 50-50. And, even if they weren&#8217;t, who would tolerate that message appearing regularly?</p>
<p><!-- technorati tags start -->
<p style="text-align:right;font-size:10px;">tags: <a href="http://www.technorati.com/tag/cross domain" rel="tag">cross domain</a>, <a href="http://www.technorati.com/tag/cross domain script exclusion" rel="tag">cross domain script exclusion</a>, <a href="http://www.technorati.com/tag/cross domain scripting" rel="tag">cross domain scripting</a>, <a href="http://www.technorati.com/tag/internet security" rel="tag">internet security</a>, <a href="http://www.technorati.com/tag/intranet environment" rel="tag">intranet environment</a>, <a href="http://www.technorati.com/tag/javascript" rel="tag">javascript</a>, <a href="http://www.technorati.com/tag/javascript security" rel="tag">javascript security</a>, <a href="http://www.technorati.com/tag/mozilla" rel="tag">mozilla</a>, <a href="http://www.technorati.com/tag/security" rel="tag">security</a>, <a href="http://www.technorati.com/tag/security components" rel="tag">security components</a>, <a href="http://www.technorati.com/tag/signed script" rel="tag">signed script</a>, <a href="http://www.technorati.com/tag/signed scripts" rel="tag">signed scripts</a>, <a href="http://www.technorati.com/tag/web scripting" rel="tag">web scripting</a>, <a href="http://www.technorati.com/tag/web security" rel="tag">web security</a>, <a href="http://www.technorati.com/tag/xdomain" rel="tag">xdomain</a>, <a href="http://www.technorati.com/tag/xmlhttprequest" rel="tag">xmlhttprequest</a></p>
<p><!-- technorati tags end --></p>
]]></content:encoded>
			<wfw:commentRss>http://maisonbisson.com/blog/post/10828/signed-javascripts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Plan B: Remote Scripting With IFRAMEs</title>
		<link>http://maisonbisson.com/blog/post/10802/working-around-cross-domain-xmlhttprequest-limitations/</link>
		<comments>http://maisonbisson.com/blog/post/10802/working-around-cross-domain-xmlhttprequest-limitations/#comments</comments>
		<pubDate>Mon, 19 Sep 2005 16:13:46 +0000</pubDate>
		<dc:creator>Casey Bisson</dc:creator>
				<category><![CDATA[Libraries & Networked Information]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[browser security]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[cross domain]]></category>
		<category><![CDATA[cross domain script exclusion]]></category>
		<category><![CDATA[frustration]]></category>
		<category><![CDATA[iframe]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[remote scripting]]></category>
		<category><![CDATA[web application]]></category>
		<category><![CDATA[web applications]]></category>
		<category><![CDATA[xdomain]]></category>
		<category><![CDATA[xmlhttprequest]]></category>

		<guid isPermaLink="false">http://maisonbisson.com/blog/?p=10802</guid>
		<description><![CDATA[
I have plans to apply AJAX to our library catalog but I&#8217;m running into a problem where I can&#8217;t do XMLHttpRequest events to servers other than the one I loaded the main webpage from. Mozilla calls it the “same origin policy,” everyone else calls it a cross-domain script exclusion, or something like that.
Some Mozilla folks [...]]]></description>
			<content:encoded><![CDATA[<abbr class="unapi-id" title="maisonbisson-10802"><!-- &nbsp; --></abbr>
<p>I have plans to apply <a href="http://en.wikipedia.org/wiki/AJAX">AJAX</a> to our library catalog but I&#8217;m running into a problem where I can&#8217;t do <a href="http://kb.mozillazine.org/XMLHttpRequest" title="XMLHttpRequest - MozillaZine Knowledge Base">XMLHttpRequest</a> events to servers other than the one I loaded the main webpage from. Mozilla calls it the “<a href="http://www.mozilla.org/projects/security/components/jssec.html#sameorigin">same origin policy</a>,” everyone else calls it a <a href="https://lists.latech.edu/pipermail/javascript/2004-June/008110.html">cross-domain script exclusion</a>, or something like that.</p>
<p>Some Mozilla folks are working on a <a href="http://lxr.mozilla.org/seamonkey/source/extensions/webservices/docs/New_Security_Model.html" title="Securing Untrusted Scripts Behind Firewalls">standard to address the problem</a>, but it could be quite a while before browser support is common enough to build for it.</p>
<p>So Plan A was to use simple AJAX with XMLHTTPRequest. Plan B comes from this crazy suggestion at Apple&#8217;s developer site: <a href="http://developer.apple.com/internet/webcontent/iframe.html" title="Remote Scripting with IFRAME">Remote Scripting with IFRAME</a>. It looks like different functions are subject to different restrictions, so the theory is that a JavaSctript loaded in a page in a hidden IFRAME can call functions from the parent page and do pretty much everything we&#8217;ve come to expect of XMLHTTPRequest. Here&#8217;s <a href="http://developer.apple.com/internet/webcontent/client-complex.html" title="Remote Scripting with an IFrame - complex client page">an example</a> they offer. </p>
<p>Crazy as it is it works, and it gets around some cross-domain script exclusions for some browsers, but it still gets trapped by Mozilla.<br />
<!-- technorati tags start -->
<p style="text-align:right;font-size:10px;">tags: <a href="http://www.technorati.com/tag/ajax" rel="tag">ajax</a>, <a href="http://www.technorati.com/tag/apple" rel="tag">apple</a>, <a href="http://www.technorati.com/tag/browser security" rel="tag">browser security</a>, <a href="http://www.technorati.com/tag/browsers" rel="tag">browsers</a>, <a href="http://www.technorati.com/tag/cross domain" rel="tag">cross domain</a>, <a href="http://www.technorati.com/tag/cross domain script exclusion" rel="tag">cross domain script exclusion</a>, <a href="http://www.technorati.com/tag/frustration" rel="tag">frustration</a>, <a href="http://www.technorati.com/tag/iframe" rel="tag">iframe</a>, <a href="http://www.technorati.com/tag/javascript" rel="tag">javascript</a>, <a href="http://www.technorati.com/tag/mozilla" rel="tag">mozilla</a>, <a href="http://www.technorati.com/tag/remote scripting" rel="tag">remote scripting</a>, <a href="http://www.technorati.com/tag/web application" rel="tag">web application</a>, <a href="http://www.technorati.com/tag/web applications" rel="tag">web applications</a>, <a href="http://www.technorati.com/tag/xdomain" rel="tag">xdomain</a>, <a href="http://www.technorati.com/tag/xmlhttprequest" rel="tag">xmlhttprequest</a></p>
<p><!-- technorati tags end --></p>
]]></content:encoded>
			<wfw:commentRss>http://maisonbisson.com/blog/post/10802/working-around-cross-domain-xmlhttprequest-limitations/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Simple Bookmarklet Demo</title>
		<link>http://maisonbisson.com/blog/post/10795/simple-bookmarklet-demo/</link>
		<comments>http://maisonbisson.com/blog/post/10795/simple-bookmarklet-demo/#comments</comments>
		<pubDate>Wed, 07 Sep 2005 19:28:21 +0000</pubDate>
		<dc:creator>Casey Bisson</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[bookmark]]></category>
		<category><![CDATA[bookmarklet]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web browser]]></category>

		<guid isPermaLink="false">http://maisonbisson.com/blog/post/10795/</guid>
		<description><![CDATA[
Bookmarklets are interesting little bits of JavaScript stored as bookmarks. They&#8217;ve been around since about 1998 (earlier?), but I&#8217;ve never bothered to write one.
Here are a few examples:

This sort of creates a bookmark
Alexa Snapshot
Wayback


tags: bookmark, bookmarklet, browser, javascript, web, web browser

]]></description>
			<content:encoded><![CDATA[<abbr class="unapi-id" title="maisonbisson-10795"><!-- &nbsp; --></abbr>
<p><a href="http://en.wikipedia.org/wiki/Bookmarklet">Bookmarklets</a> are interesting little bits of JavaScript stored as bookmarks. They&#8217;ve been around since about 1998 (earlier?), but I&#8217;ve never bothered to write one.</p>
<p>Here are a few examples:</p>
<ul>
<li><a href="javascript:gSqRN4v='';if(document.selection){r4NSy8=document.selection.createRange();gSqRN4v=r4NSy8.text};if(gSqRN4v==''){void(gSqRN4v=prompt('Page%20name..',''))};if(gSqRN4v!=null){with(document){write(gSqRN4v.link(location.href));close()}}else{void(null)}">This sort of creates a bookmark</a></li>
<li><a href="javascript:location.href='http://cgi.alexa.com/client/cli18/cgi-bin/name_n_pop.cgi?url='+location.href">Alexa Snapshot</a></li>
<li><a href="javascript:location.href='http://web.archive.org/web/*/'+document.location.href;">Wayback</a></li>
</ul>
<p><!-- technorati tags start -->
<p style="text-align:right;font-size:10px;">tags: <a href="http://www.technorati.com/tag/bookmark" rel="tag">bookmark</a>, <a href="http://www.technorati.com/tag/bookmarklet" rel="tag">bookmarklet</a>, <a href="http://www.technorati.com/tag/browser" rel="tag">browser</a>, <a href="http://www.technorati.com/tag/javascript" rel="tag">javascript</a>, <a href="http://www.technorati.com/tag/web" rel="tag">web</a>, <a href="http://www.technorati.com/tag/web browser" rel="tag">web browser</a></p>
<p><!-- technorati tags end --></p>
]]></content:encoded>
			<wfw:commentRss>http://maisonbisson.com/blog/post/10795/simple-bookmarklet-demo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Sweet Cheat Sheets</title>
		<link>http://maisonbisson.com/blog/post/10715/sweet-cheat-sheets/</link>
		<comments>http://maisonbisson.com/blog/post/10715/sweet-cheat-sheets/#comments</comments>
		<pubDate>Tue, 02 Aug 2005 16:25:24 +0000</pubDate>
		<dc:creator>Casey Bisson</dc:creator>
				<category><![CDATA[Blink]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[cheat sheet]]></category>
		<category><![CDATA[cheat sheets]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://www.maisonbisson.com/blog/?p=10715</guid>
		<description><![CDATA[
Colin over at Command-Tab alerted me to some great cheat sheets, including this one for JavaScript at ILoveJackDaniels.com.

tags: cheat sheet, cheat sheets, javascript, programming, web, web development

&#160;
&#160;
&#160;
]]></description>
			<content:encoded><![CDATA[<abbr class="unapi-id" title="maisonbisson-10715"><!-- &nbsp; --></abbr>
<p><a href="http://www.ilovejackdaniels.com/cheat-sheets/"><img src="http://www.ilovejackdaniels.com/images/javascript_cheat_sheet_thmb_2.png" width="147" height="199" style="float: right; border: solid 2px #000000; margin: 0px 0px 8px 8px; padding: 4px 4px 4px 4px;" /></a><a href="http://www.command-tab.com/">Colin</a> over at <a href="http://www.command-tab.com/index.php/javascript-cheat-sheet/" title="Command-Tab » JavaScript Cheat Sheet">Command-Tab</a> alerted me to some great <a href="http://www.ilovejackdaniels.com/cheat-sheets/" title="Cheat Sheets - ILoveJackDaniels.com">cheat sheets</a>, including this one for <a href="http://www.ilovejackdaniels.com/javascript/javascript-cheat-sheet/" title="JavaScript Cheat Sheet - JavaScript - ILoveJackDaniels.com">JavaScript</a> at <a href="http://www.ilovejackdaniels.com/">ILoveJackDaniels.com</a>.</p>
<p><!-- technorati tags start -->
<p style="text-align:right;font-size:10px;">tags: <a href="http://technorati.com/tag/cheat sheet" rel="tag">cheat sheet</a>, <a href="http://technorati.com/tag/cheat sheets" rel="tag">cheat sheets</a>, <a href="http://technorati.com/tag/javascript" rel="tag">javascript</a>, <a href="http://technorati.com/tag/programming" rel="tag">programming</a>, <a href="http://technorati.com/tag/web" rel="tag">web</a>, <a href="http://technorati.com/tag/web development" rel="tag">web development</a></p>
<p><!-- technorati tags end --></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://maisonbisson.com/blog/post/10715/sweet-cheat-sheets/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>