<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Weston Ruter</title>
	
	<link>http://weston.ruter.net</link>
	<description>Web application developer in Portland, Oregon</description>
	<lastBuildDate>Thu, 08 Oct 2009 04:48:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/westonruter" type="application/rss+xml" /><feedburner:browserFriendly></feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>CSS Gradients via Canvas</title>
		<link>http://weston.ruter.net/projects/css-gradients-via-canvas/</link>
		<comments>http://weston.ruter.net/projects/css-gradients-via-canvas/#comments</comments>
		<pubDate>Sat, 25 Jul 2009 20:48:16 +0000</pubDate>
		<dc:creator>Weston Ruter</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://weston.ruter.net/?page_id=190</guid>
		<description><![CDATA[
	<p>In a current project at <a href="http://shepherd-interactive.com/">Shepherd Interactive</a>, certain page elements were designed with
	background <a href="http://en.wikipedia.org/wiki/Image_gradient" title="Image gradient @ Wikipedia">gradients</a>.
	Given the desire to <a href="http://developer.yahoo.com/performance/rules.html#num_http" title="Minimize HTTP Requests @ Best Practices for Speeding Up Your Web Site">minimize</a>
	the need for externally-loaded background images wherever possible, I thought this would be a great opportunity to play around with WebKit's
	proposed <a href="http://webkit.org/blog/175/introducing-css-gradients/" title="Introducing CSS Gradients">CSS Gradients</a>, which are natively supported
	by Safari, Chrome, and other WebKit-based browsers. In being a WebKit proposal, however, CSS Gradients are not (yet) natively supported in
	other rendering engines as used by Firefox, Opera, and Internet Explorer.</p>
	
	<p><dfn>CSS Gradients via Canvas</dfn> provides a subset of WebKit's CSS Gradients proposal
	for browsers that implement the HTML5 <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html" title="The canvas element @ HTML5"><code>canvas</code></a> element.
	To use, just include <a href="http://shepherd-interactive.googlecode.com/svn/trunk/css-gradients-via-canvas/css-gradients-via-canvas.js">css-gradients-via-canvas.js</a> (12KB) anywhere on the page (see <a href="#examples">examples</a> below).
	Unlike WebKit, this implementation does not currently allow gradients to be used for border images, list bullets, or generated content.
	The script employs <a href="https://developer.mozilla.org/En/DOM/Document.querySelectorAll"><code>document.querySelectorAll()</code></a>—it has no external dependencies
	if this function is implemented; otherwise, it looks for the presence of jQuery, Prototype, or Sizzle to provide selector-querying functionality.</p>
	
	<p id="browser-support">The implementation works in Firefox 2/3+ and Opera 9.64 (at least). Safari and Chrome have native support for CSS Gradients since they use WebKit, as already mentioned.
	Beginning with version 3.6, CSS Gradients are also <a href="https://developer.mozilla.org/en/CSS/Gradients" title="CSS Gradients @ Mozilla Developer Center">natively supported</a> by Firefox and this implementation
	will defer in such case; note that you will need to specify two separate <code>background</code> CSS properties, one with <code>-webkit-gradient</code> and another with <code>-moz-linear/radial-gradient</code> which has a <em>different syntax</em>).
	This implementation does <em>not</em> work in Internet Explorer since IE does not support Canvas, although IE8 does support the <code>data:</code> URI scheme, which is a prerequisite
	(see <a href="http://weston.ruter.net/2009/05/07/detecting-support-for-data-uris/" title="Detecting Support for data: URIs">support detection method</a>).
	When/if Gears's <a href="http://code.google.com/apis/gears/api_canvas.html">Canvas API</a> fully implements the HTML5 canvas specification, then this implementation
	should be tweakable to work in IE8. In the mean time, rudimentary gradients may be achieved in IE by means of its non-standard
	<a href="http://msdn.microsoft.com/en-us/library/ms532997%28VS.85%29.aspx">gradient filter</a>.</p>
	
	<p>CSS Gradients via Canvas works by parsing all stylesheets upon page load (<code>DOMContentLoaded</code>), and searches for all instances of CSS gradients being
	used as <em>background images</em>. The source code for the external stylesheets is loaded via <code>XMLHttpRequest</code>—ensure that they are
	cached by serving them with a <a href="http://developer.yahoo.com/performance/rules.html#expires">far-future Expires</a> header to avoid extra HTTP traffic.
	The CSS selector associated with the gradient background image property is used to query all elements on the page; for each of the selected elements,
	a canvas is created of the same size as the element's dimensions, and the specified gradients are drawn onto that canvas. Thereafter, the gradient image is
	retrieved via <code>canvas.toDataURL()</code> and this data is supplied as the <code>background-image</code> for the element.</p>
	
	<p id="notes">A few notes regarding interactivity with this implementation: CSS gradients will not be applied to elements dynamically added after <code>DOMContentLoaded</code>.
	Additionally, each element that has a CSS gradient applied to it gets assigned
	a method called <code>refreshCSSGradient()</code>; at any time, this method may be invoked to redraw the gradient on a given element.
	This is especially useful (and necessary) when an element's size dynamically changes, for example as the result of some user interaction. Likewise, it is important
	to note that it will not work to rely on event handlers to invoke <code>refreshCSSGradient()</code> on elements whose style is changed by CSS rules with pseudo-selectors like
	<code>:hover</code> and <code>:active</code>; this is because event handlers are fired before the rule's style changes are applied to the element.
	Toggling an element's class name by scripting is how you can assure that its style will be changed before calling <code>refreshCSSGradient()</code>. The
	<a href="#linear2">last example</a> below demonstrates this.</p>
	
	<h3 id="changelog">Changelog</h3>
	<dl>
	   <dt>1.2 (<time>2009-09-30</time>): </dt>
	   <dd>Phong Nguyen raised an <a href="http://weston.ruter.net/projects/css-gradients-via-canvas/#comment-9539"
	   title="This is pretty nice – except for one major issue I’ve seen. I’m
	   using the jQuery UI library and it includes a fairly large CSS file
	   (nearly 1700 lines!) that causes the forEach(document.styleSheets … )
	   loop to take a good long while to finish. This blocks the user from doing
	   anything to the page – in my case, for 2-3 seconds. That’s pretty
	   annoying for any user to have to deal with. Is there some way to speed up
	   that core loop? (Failing that, I could try and detect if I’m loading
	   certain large files and ignore them).">excellent point</a>
	   in that stylesheets which don't contain any CSS Gradients should be ignored in order
	   to improve performance (in his case, for example, the jQuery UI
	   stylesheets are large and don't need to be parsed).
	   Now you can add <code>class="no-css-gradients"</code> to any
	   <code>style</code> or <code>link</code> element and that will prevent
	   this script from looking for CSS Gradients to apply with canvas.</dd>
	   
	   <dt>1.1 (<time>2009-08-12</time>): </dt>
	   <dd>Now if <code>cssGradientsViaCanvas.useCache</code> is set to
	   <code>true</code>, the CSS rules containing gradients are cached in
	   <code>sessionStorage</code> instead of having to be re-parsed out of
	   the stylesheets each time a page loads. For this to work, there
	   must be implementations of <code>JSON.stringify()</code> and
	   <code>JSON.parse()</code> available (e.g. <a
	   href="http://www.json.org/json2.js">json2.js</a>).</dd>
	   
	   <dd>Ability to use
	   <code>data:</code> URIs for images is not explicitly detected since
	   testing for the presence of <code>canvas.toDataURI()</code> is
	   sufficient.</dd>
	   
	   
	   <dt>1.0.3 (<time>2009-08-10</time>): </dt>
	   <dd>Detecting support for native support for CSS Gradients in Firefox 3.6</dd>
	   
	   <dt>1.0.2 (<time>2009-08-05</time>): </dt>
	   <dd>Now requiring that <code>gradient(…)</code> only be used with the
	   <code>background-image</code> property instead of with the
	   <code>background</code> shorthand properties since the
	   additional <code>background-*</code> properties are not parsed out.</dd>
	</dl>
	
	<div id="examples">
	<h3>Examples</h3>
	<style scoped="scoped">
	#linear1 { width:150px; height:150px; border:2px solid black; /*padding: 10px; */
		   background-image:-webkit-gradient(linear, left top, left bottom, from(#00abeb), to(#fff), color-stop(0.5, #fff), color-stop(0.5, #66cc00)) !important;
		   background-image:-moz-linear-gradient(left top, left bottom, from(#00abeb), to(#fff), color-stop(0.5, #fff), color-stop(0.5, #66cc00)) !important;
		   /*-webkit-background-origin: padding-box; -webkit-background-clip: content-box;*/ }
	
	#linear2 {
			border:2px solid black;
			width:150px; height:150px;
			/*Note: Only use gradients background-image, not background shortcut property. */
			background-image: -webkit-gradient(linear, 0% 25%, 75% 100%,
									 from(red),
									 to(purple),
									 color-stop(.2, orange),
									 color-stop(.4, yellow),
									 color-stop(.6, green),
									 color-stop(.8, blue));
			background-image: -moz-linear-gradient(0% 25%, 75% 100%,
									 from(red),
									 to(purple),
									 color-stop(.2, orange),
									 color-stop(.4, yellow),
									 color-stop(.6, green),
									 color-stop(.8, blue));
			background-repeat:no-repeat;
	
	}
	
	#radial1 { width:150px; height:150px; border:2px solid black;
	       /*Note: Only use gradients background-image, not background shortcut property. */
		   background-image: -webkit-gradient(radial, 45 45, 10, 52 50, 30, from(#A7D30C), to(rgba(1,159,98,0)), color-stop(90%, #019F62)),
					   -webkit-gradient(radial, 105 105, 20, 112 120, 50, from(#ff5f98), to(rgba(255,1,136,0)), color-stop(75%, #ff0188)),
					   -webkit-gradient(radial, 95 15, 15, 102 20, 40, from(#00c9ff), to(rgba(0,201,255,0)), color-stop(80%, #00b5e2)),
					   -webkit-gradient(radial, 0 150, 50, 0 140, 90, from(#f4f201), to(rgba(228, 199,0,0)), color-stop(80%, #e4c700));
		
		   background-image: -moz-radial-gradient(45px 45px, 10px, 52px 50px, 30px, from(#A7D30C), to(rgba(1,159,98,0)), color-stop(90%, #019F62)),
					   -moz-radial-gradient(105px 105px, 20px, 112px 120px, 50px, from(#ff5f98), to(rgba(255,1,136,0)), color-stop(75%, #ff0188)),
					   -moz-radial-gradient(95px 15px, 15px, 102px 20px, 40px, from(#00c9ff), to(rgba(0,201,255,0)), color-stop(80%, #00b5e2)),
					   -moz-radial-gradient(0px 150px, 50px, 0px 140px, 90px, from(#f4f201), to(rgba(228, 199,0,0)), color-stop(80%, #e4c700));
			
			/*background-image:-moz-radial-gradient(45px 45px, 10px, 45px 45px, 30px, from(#ff0000), to(#0000ff));*/
			background-repeat:no-repeat;
	}
	
	/* Play around with some interactivity; requires manual mouseover/mouseout
	handlers to be attached with Javascript to refresh CSS Gradients when box
	is resized, see script and comments in footer. */
	#linear2 {
		border-color:#CCC;
		border-style:outset;
		cursor:pointer;
		padding:0;
	}
	#linear2:hover {
		border-color:#888;
	}
	html:not(.css-gradients-via-canvas) #linear2:active,
	#linear2.mousedown {
		width:400px;
		border-style:inset;
	}
	
	p:target {
		background-color:#FFFFCC;
		padding:0.2em;
	}
	
	html.no-css-gradients img.fallback,
	html.no-css-gradients #fallback-notice,
	html.no-css-gradients .fallback-notice{
		display:block !important;
		color:red;
	}
	</style>
	
	<p>The following two boxes are from WebKit's <a href="http://trac.webkit.org/browser/trunk/LayoutTests//fast/gradients/simple-gradients.html?format=raw">Background
	Gradients Example</a> <small>(a couple browser-specific <code>background</code> properties are disabled in the first one)</small>:</p>
	
	<p id='fallback-notice' hidden="hidden" style="display:none"><em>It appears that your browser doesn't support CSS Gradients, neither natively nor via Canvas.
	The gradients you see below are regular externally-loaded PNG images that demonstrate the CSS gradient effects; the gradients were generated from
	this Canvas implementation of CSS Gradients (see <a href="#browser-support">browser support</a> above).</em></p>
	
	<p id="linear1" class='gradient'><img src="http://shepherd-interactive.googlecode.com/svn/trunk/css-gradients-via-canvas/linear1.png" class='fallback' style="display:none" title="Fallback image; this is not a CSS Gradient!" /></p>
	<p id="radial1" class='gradient'><img src="http://shepherd-interactive.googlecode.com/svn/trunk/css-gradients-via-canvas/radial1.png" class='fallback' style="display:none" title="Fallback image; this is not a CSS Gradient!" /></p>
	
	<p>Here is a bonus diagonal rainbow…but wait, there's more! Clicking on the element causes its width to increase and when it does, its gradient is adjusted (see <a href="#notes">notes</a> above).
	<em hidden="hidden" class='fallback-notice' style="display:none;">(Clicking will not have the desired effect because, again, it appears your browser is not supported.)</em></p>
	
	<p id="linear2" class='gradient'><img src="http://shepherd-interactive.googlecode.com/svn/trunk/css-gradients-via-canvas/linear2.png" class='fallback' style="display:none" title="Fallback image; this is not a CSS Gradient!" /></p>
	
	<!-- jQuery, Prototype, and Sizzle looked for in the case that document.querySelectorAll is not available;
	if using another library, please make sure that document.querySelectorAll is implemented -->
	<!--<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"></script>-->
	
	<script src="http://shepherd-interactive.googlecode.com/svn-history/r191/trunk/css-gradients-via-canvas/css-gradients-via-canvas.js"></script>
	<script>
	//Add mousedown/mouseup event handlers to correspond with the :active rule that changes the element's width
	// because the CSS Gradient needs to be refreshed because the box size changes; note that we add the class manually
	// because CSS rules aren't applied before the corresponding events are triggered (thus the box would not
	// be resized when the event handler inspects it).
	
	if(document.addEventListener){
		document.addEventListener('DOMContentLoaded', function(){
			var linear2 = document.getElementById('linear2');
			linear2.addEventListener('mouseup', function(){
				if(this.refreshCSSGradient){
					this.className = this.className.replace(/\s*mousedown/, '');
					this.refreshCSSGradient();
				}
			}, false);
			linear2.addEventListener('mousedown', function(){
				if(this.refreshCSSGradient){
					this.className += " mousedown";
					this.refreshCSSGradient();
				}
			}, false);
		}, false);
	}
	</script>
	</div><!-- end examples -->

]]></description>
			<content:encoded><![CDATA[
	<p>In a current project at <a href="http://shepherd-interactive.com/">Shepherd Interactive</a>, certain page elements were designed with
	background <a href="http://en.wikipedia.org/wiki/Image_gradient" title="Image gradient @ Wikipedia">gradients</a>.
	Given the desire to <a href="http://developer.yahoo.com/performance/rules.html#num_http" title="Minimize HTTP Requests @ Best Practices for Speeding Up Your Web Site">minimize</a>
	the need for externally-loaded background images wherever possible, I thought this would be a great opportunity to play around with WebKit's
	proposed <a href="http://webkit.org/blog/175/introducing-css-gradients/" title="Introducing CSS Gradients">CSS Gradients</a>, which are natively supported
	by Safari, Chrome, and other WebKit-based browsers. In being a WebKit proposal, however, CSS Gradients are not (yet) natively supported in
	other rendering engines as used by Firefox, Opera, and Internet Explorer.</p>
	
	<p><dfn>CSS Gradients via Canvas</dfn> provides a subset of WebKit's CSS Gradients proposal
	for browsers that implement the HTML5 <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html" title="The canvas element @ HTML5"><code>canvas</code></a> element.
	To use, just include <a href="http://shepherd-interactive.googlecode.com/svn/trunk/css-gradients-via-canvas/css-gradients-via-canvas.js">css-gradients-via-canvas.js</a> (12KB) anywhere on the page (see <a href="#examples">examples</a> below).
	Unlike WebKit, this implementation does not currently allow gradients to be used for border images, list bullets, or generated content.
	The script employs <a href="https://developer.mozilla.org/En/DOM/Document.querySelectorAll"><code>document.querySelectorAll()</code></a>—it has no external dependencies
	if this function is implemented; otherwise, it looks for the presence of jQuery, Prototype, or Sizzle to provide selector-querying functionality.</p>
	
	<p id="browser-support">The implementation works in Firefox 2/3+ and Opera 9.64 (at least). Safari and Chrome have native support for CSS Gradients since they use WebKit, as already mentioned.
	Beginning with version 3.6, CSS Gradients are also <a href="https://developer.mozilla.org/en/CSS/Gradients" title="CSS Gradients @ Mozilla Developer Center">natively supported</a> by Firefox and this implementation
	will defer in such case; note that you will need to specify two separate <code>background</code> CSS properties, one with <code>-webkit-gradient</code> and another with <code>-moz-linear/radial-gradient</code> which has a <em>different syntax</em>).
	This implementation does <em>not</em> work in Internet Explorer since IE does not support Canvas, although IE8 does support the <code>data:</code> URI scheme, which is a prerequisite
	(see <a href="http://weston.ruter.net/2009/05/07/detecting-support-for-data-uris/" title="Detecting Support for data: URIs">support detection method</a>).
	When/if Gears's <a href="http://code.google.com/apis/gears/api_canvas.html">Canvas API</a> fully implements the HTML5 canvas specification, then this implementation
	should be tweakable to work in IE8. In the mean time, rudimentary gradients may be achieved in IE by means of its non-standard
	<a href="http://msdn.microsoft.com/en-us/library/ms532997%28VS.85%29.aspx">gradient filter</a>.</p>
	
	<p>CSS Gradients via Canvas works by parsing all stylesheets upon page load (<code>DOMContentLoaded</code>), and searches for all instances of CSS gradients being
	used as <em>background images</em>. The source code for the external stylesheets is loaded via <code>XMLHttpRequest</code>—ensure that they are
	cached by serving them with a <a href="http://developer.yahoo.com/performance/rules.html#expires">far-future Expires</a> header to avoid extra HTTP traffic.
	The CSS selector associated with the gradient background image property is used to query all elements on the page; for each of the selected elements,
	a canvas is created of the same size as the element's dimensions, and the specified gradients are drawn onto that canvas. Thereafter, the gradient image is
	retrieved via <code>canvas.toDataURL()</code> and this data is supplied as the <code>background-image</code> for the element.</p>
	
	<p id="notes">A few notes regarding interactivity with this implementation: CSS gradients will not be applied to elements dynamically added after <code>DOMContentLoaded</code>.
	Additionally, each element that has a CSS gradient applied to it gets assigned
	a method called <code>refreshCSSGradient()</code>; at any time, this method may be invoked to redraw the gradient on a given element.
	This is especially useful (and necessary) when an element's size dynamically changes, for example as the result of some user interaction. Likewise, it is important
	to note that it will not work to rely on event handlers to invoke <code>refreshCSSGradient()</code> on elements whose style is changed by CSS rules with pseudo-selectors like
	<code>:hover</code> and <code>:active</code>; this is because event handlers are fired before the rule's style changes are applied to the element.
	Toggling an element's class name by scripting is how you can assure that its style will be changed before calling <code>refreshCSSGradient()</code>. The
	<a href="#linear2">last example</a> below demonstrates this.</p>
	
	<h3 id="changelog">Changelog</h3>
	<dl>
	   <dt>1.2 (<time>2009-09-30</time>): </dt>
	   <dd>Phong Nguyen raised an <a href="http://weston.ruter.net/projects/css-gradients-via-canvas/#comment-9539"
	   title="This is pretty nice – except for one major issue I’ve seen. I’m
	   using the jQuery UI library and it includes a fairly large CSS file
	   (nearly 1700 lines!) that causes the forEach(document.styleSheets … )
	   loop to take a good long while to finish. This blocks the user from doing
	   anything to the page – in my case, for 2-3 seconds. That’s pretty
	   annoying for any user to have to deal with. Is there some way to speed up
	   that core loop? (Failing that, I could try and detect if I’m loading
	   certain large files and ignore them).">excellent point</a>
	   in that stylesheets which don't contain any CSS Gradients should be ignored in order
	   to improve performance (in his case, for example, the jQuery UI
	   stylesheets are large and don't need to be parsed).
	   Now you can add <code>class="no-css-gradients"</code> to any
	   <code>style</code> or <code>link</code> element and that will prevent
	   this script from looking for CSS Gradients to apply with canvas.</dd>
	   
	   <dt>1.1 (<time>2009-08-12</time>): </dt>
	   <dd>Now if <code>cssGradientsViaCanvas.useCache</code> is set to
	   <code>true</code>, the CSS rules containing gradients are cached in
	   <code>sessionStorage</code> instead of having to be re-parsed out of
	   the stylesheets each time a page loads. For this to work, there
	   must be implementations of <code>JSON.stringify()</code> and
	   <code>JSON.parse()</code> available (e.g. <a
	   href="http://www.json.org/json2.js">json2.js</a>).</dd>
	   
	   <dd>Ability to use
	   <code>data:</code> URIs for images is not explicitly detected since
	   testing for the presence of <code>canvas.toDataURI()</code> is
	   sufficient.</dd>
	   
	   
	   <dt>1.0.3 (<time>2009-08-10</time>): </dt>
	   <dd>Detecting support for native support for CSS Gradients in Firefox 3.6</dd>
	   
	   <dt>1.0.2 (<time>2009-08-05</time>): </dt>
	   <dd>Now requiring that <code>gradient(…)</code> only be used with the
	   <code>background-image</code> property instead of with the
	   <code>background</code> shorthand properties since the
	   additional <code>background-*</code> properties are not parsed out.</dd>
	</dl>
	
	<div id="examples">
	<h3>Examples</h3>
	<style scoped="scoped">
	#linear1 { width:150px; height:150px; border:2px solid black; /*padding: 10px; */
		   background-image:-webkit-gradient(linear, left top, left bottom, from(#00abeb), to(#fff), color-stop(0.5, #fff), color-stop(0.5, #66cc00)) !important;
		   background-image:-moz-linear-gradient(left top, left bottom, from(#00abeb), to(#fff), color-stop(0.5, #fff), color-stop(0.5, #66cc00)) !important;
		   /*-webkit-background-origin: padding-box; -webkit-background-clip: content-box;*/ }
	
	#linear2 {
			border:2px solid black;
			width:150px; height:150px;
			/*Note: Only use gradients background-image, not background shortcut property. */
			background-image: -webkit-gradient(linear, 0% 25%, 75% 100%,
									 from(red),
									 to(purple),
									 color-stop(.2, orange),
									 color-stop(.4, yellow),
									 color-stop(.6, green),
									 color-stop(.8, blue));
			background-image: -moz-linear-gradient(0% 25%, 75% 100%,
									 from(red),
									 to(purple),
									 color-stop(.2, orange),
									 color-stop(.4, yellow),
									 color-stop(.6, green),
									 color-stop(.8, blue));
			background-repeat:no-repeat;
	
	}
	
	#radial1 { width:150px; height:150px; border:2px solid black;
	       /*Note: Only use gradients background-image, not background shortcut property. */
		   background-image: -webkit-gradient(radial, 45 45, 10, 52 50, 30, from(#A7D30C), to(rgba(1,159,98,0)), color-stop(90%, #019F62)),
					   -webkit-gradient(radial, 105 105, 20, 112 120, 50, from(#ff5f98), to(rgba(255,1,136,0)), color-stop(75%, #ff0188)),
					   -webkit-gradient(radial, 95 15, 15, 102 20, 40, from(#00c9ff), to(rgba(0,201,255,0)), color-stop(80%, #00b5e2)),
					   -webkit-gradient(radial, 0 150, 50, 0 140, 90, from(#f4f201), to(rgba(228, 199,0,0)), color-stop(80%, #e4c700));
		
		   background-image: -moz-radial-gradient(45px 45px, 10px, 52px 50px, 30px, from(#A7D30C), to(rgba(1,159,98,0)), color-stop(90%, #019F62)),
					   -moz-radial-gradient(105px 105px, 20px, 112px 120px, 50px, from(#ff5f98), to(rgba(255,1,136,0)), color-stop(75%, #ff0188)),
					   -moz-radial-gradient(95px 15px, 15px, 102px 20px, 40px, from(#00c9ff), to(rgba(0,201,255,0)), color-stop(80%, #00b5e2)),
					   -moz-radial-gradient(0px 150px, 50px, 0px 140px, 90px, from(#f4f201), to(rgba(228, 199,0,0)), color-stop(80%, #e4c700));
			
			/*background-image:-moz-radial-gradient(45px 45px, 10px, 45px 45px, 30px, from(#ff0000), to(#0000ff));*/
			background-repeat:no-repeat;
	}
	
	/* Play around with some interactivity; requires manual mouseover/mouseout
	handlers to be attached with Javascript to refresh CSS Gradients when box
	is resized, see script and comments in footer. */
	#linear2 {
		border-color:#CCC;
		border-style:outset;
		cursor:pointer;
		padding:0;
	}
	#linear2:hover {
		border-color:#888;
	}
	html:not(.css-gradients-via-canvas) #linear2:active,
	#linear2.mousedown {
		width:400px;
		border-style:inset;
	}
	
	p:target {
		background-color:#FFFFCC;
		padding:0.2em;
	}
	
	html.no-css-gradients img.fallback,
	html.no-css-gradients #fallback-notice,
	html.no-css-gradients .fallback-notice{
		display:block !important;
		color:red;
	}
	</style>
	
	<p>The following two boxes are from WebKit's <a href="http://trac.webkit.org/browser/trunk/LayoutTests//fast/gradients/simple-gradients.html?format=raw">Background
	Gradients Example</a> <small>(a couple browser-specific <code>background</code> properties are disabled in the first one)</small>:</p>
	
	<p id='fallback-notice' hidden="hidden" style="display:none"><em>It appears that your browser doesn't support CSS Gradients, neither natively nor via Canvas.
	The gradients you see below are regular externally-loaded PNG images that demonstrate the CSS gradient effects; the gradients were generated from
	this Canvas implementation of CSS Gradients (see <a href="#browser-support">browser support</a> above).</em></p>
	
	<p id="linear1" class='gradient'><img src="http://shepherd-interactive.googlecode.com/svn/trunk/css-gradients-via-canvas/linear1.png" class='fallback' style="display:none" title="Fallback image; this is not a CSS Gradient!" /></p>
	<p id="radial1" class='gradient'><img src="http://shepherd-interactive.googlecode.com/svn/trunk/css-gradients-via-canvas/radial1.png" class='fallback' style="display:none" title="Fallback image; this is not a CSS Gradient!" /></p>
	
	<p>Here is a bonus diagonal rainbow…but wait, there's more! Clicking on the element causes its width to increase and when it does, its gradient is adjusted (see <a href="#notes">notes</a> above).
	<em hidden="hidden" class='fallback-notice' style="display:none;">(Clicking will not have the desired effect because, again, it appears your browser is not supported.)</em></p>
	
	<p id="linear2" class='gradient'><img src="http://shepherd-interactive.googlecode.com/svn/trunk/css-gradients-via-canvas/linear2.png" class='fallback' style="display:none" title="Fallback image; this is not a CSS Gradient!" /></p>
	
	<!-- jQuery, Prototype, and Sizzle looked for in the case that document.querySelectorAll is not available;
	if using another library, please make sure that document.querySelectorAll is implemented -->
	<!--<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"></script>-->
	
	<script src="http://shepherd-interactive.googlecode.com/svn-history/r191/trunk/css-gradients-via-canvas/css-gradients-via-canvas.js"></script>
	<script>
	//Add mousedown/mouseup event handlers to correspond with the :active rule that changes the element's width
	// because the CSS Gradient needs to be refreshed because the box size changes; note that we add the class manually
	// because CSS rules aren't applied before the corresponding events are triggered (thus the box would not
	// be resized when the event handler inspects it).
	
	if(document.addEventListener){
		document.addEventListener('DOMContentLoaded', function(){
			var linear2 = document.getElementById('linear2');
			linear2.addEventListener('mouseup', function(){
				if(this.refreshCSSGradient){
					this.className = this.className.replace(/\s*mousedown/, '');
					this.refreshCSSGradient();
				}
			}, false);
			linear2.addEventListener('mousedown', function(){
				if(this.refreshCSSGradient){
					this.className += " mousedown";
					this.refreshCSSGradient();
				}
			}, false);
		}, false);
	}
	</script>
	</div><!-- end examples --><p><strong><br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://weston.ruter.net/projects/css-gradients-via-canvas/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Accepted into UW Computational Linguistics Master’s Program</title>
		<link>http://weston.ruter.net/2009/07/22/accepted-into-uw-computational-linguistics-masters-program/</link>
		<comments>http://weston.ruter.net/2009/07/22/accepted-into-uw-computational-linguistics-masters-program/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 16:57:54 +0000</pubDate>
		<dc:creator>Weston Ruter</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://weston.ruter.net/?p=185</guid>
		<description><![CDATA[A couple years ago I learned of the University of Washington&#8217;s Computational Linguistics Master&#8217;s program and I was really interested. But since I had moved to Portland, it wasn&#8217;t feasible for me to attend classes—this is especially true now since I am employed here and got married a year ago.
For my birthday this year, my [...]]]></description>
			<content:encoded><![CDATA[<p>A couple years ago I learned of the University of Washington&#8217;s <a href="http://www.compling.washington.edu/compling/">Computational Linguistics Master&#8217;s program</a> and I was really interested. But since I had moved to Portland, it wasn&#8217;t feasible for me to attend classes—this is especially true now since I am employed here and got married a year ago.</p>
<p>For my birthday this year, my dad gave me one of the best presents ever: <a href="http://en.wikipedia.org/wiki/John_McWhorter">John McWhorter</a>&#8217;s audio course &#8220;<a title="&quot;The Story of Human Language&quot; by John McWhorter, produced by The Teaching Company" href="http://www.teach12.com/ttcx/CourseDescLong2.aspx?cid=1600" target="_blank">The Story of Human Language</a>&#8220;; LaVonne and I couldn&#8217;t get enough of his lectures. I&#8217;m sad to say I&#8217;ve finished them, but listening to them re-peaked my interest in the academic study of Linguistics; so I meandered over to UW&#8217;s Computational Linguistics website and, to my shock, I found that the entire program can now be completed via online correspondence! I was so excited! I was already a couple months past the admission application deadline, but I contacted the department and got approval to apply. Now, a few weeks later, I have just received news that I have been accepted into the program! This is one of my dreams come true!</p>
<p>For some more background and the reasons why I&#8217;m excited about this program, I&#8217;ve included below the statement of purpose I wrote for the application. If everything works out, I will begin studying part-time this Fall while still being employed full-time at <a href="http://shepherd-interactive.com/">Shepherd Interactive</a>. <small>(Note: when talking about Open Scriptures below, I don&#8217;t mention <a title="Open Scriptures Google Group information" href="http://groups.google.com/group/open-scriptures/about">the others</a> who are working so hard alongside me—it&#8217;s true I started it, but now it&#8217;s &#8220;my project&#8221; only in the sense that I am but a part of it.)</small></p>
<blockquote>
<h3>Statement of Purpose for Application to UW Computational Linguistics Program</h3>
<p>Using the computer to solve linguistic problems has been a core interest of mine for the past decade. As I studied and entered the workforce as a web application developer, I have studied linguistics and languages on the side. When I started my undergraduate studies at Seattle Pacific University, I was intending to create a self-designed major in computational linguistics, but I was disappointed to find that the faculty weren&#8217;t experienced enough in this area to advise me. So I made do by majoring in computer science and minoring in both linguistics and Spanish. I thoroughly enjoyed taking CS and linguistics courses in parallel, taking concepts in one and applying them in another, for example studying the Chomsky hierarchy in my syntax course for linguistics but then applying his concepts in my compiler design CS course. Furthermore, I used my web application development skills to create relevant applications along the way, like a <a id="uyvb" title="syntax tree drawer" href="http://weston.ruter.net/projects/syntax-tree-drawer/">syntax tree drawer</a> and a popular <a id="kx80" title="IPA chart keyboard tool" href="http://weston.ruter.net/projects/ipa-chart/view/keyboard/">IPA chart keyboard tool</a>, and I also completed various linguistics assignments by <a id="i7l_" title="publishing them" href="http://weston.ruter.net/2009/02/21/old-mainly-linguistics-stuff-from-college-days/">publishing them</a> on the Web.</p>
<p>Although I learned much from taking computer science and linguistics in parallel, I have missed out on the focused intersection of the two in the sub-field of natural language processing. It is my desire to satisfy my initial undergraduate computational linguistic aspirations in the Master&#8217;s program at the University of Washington.</p>
<p>With regard to applying what I would learn in the program, I am the founder of the <a title="Open Scriptures" href="http://openscriptures.org/">Open Scriptures</a> project, an initiative which seeks to interlink the various scriptural corpora and derivative datasets to create a Linked Data infrastructure for scripture, and on top of this foundation provide a platform that allows developers to build innovative applications on top of the data available. One of the key problem areas in this endeavor is the alignment of translated texts with their source manuscripts. I had been thinking to utilize collective intelligence to power the semantic interlinking of the texts, but I have come to realize that NLP will be necessary to achieve the desired results. The concepts and techniques I learn in the Master&#8217;s program would be directly applicable to my project.</p>
<p>I am an advanced Spanish speaker, and I have also taken one term each of French and Koiné Greek, and two terms of Biblical Hebrew. I am especially interested in Semitic languages and corpus linguistics of the Hebrew Tanakh and the Arabic Qur&#8217;an. I am studying Arabic on my own, and have attained a novice familiarity with the language. I desire that this Master&#8217;s program in computational linguistics would be a stepping stone to further graduate studies in the field.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://weston.ruter.net/2009/07/22/accepted-into-uw-computational-linguistics-masters-program/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multiple Borders via CSS box-shadow</title>
		<link>http://weston.ruter.net/2009/06/15/multiple-borders-via-css-box-shadow/</link>
		<comments>http://weston.ruter.net/2009/06/15/multiple-borders-via-css-box-shadow/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 00:15:08 +0000</pubDate>
		<dc:creator>Weston Ruter</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://weston.ruter.net/2009/06/15/multiple-borders-via-css-box-shadow/</guid>
		<description />
			<content:encoded><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>To make multiple borders appear around an element, the traditional
approach has been to nest multiple elements and apply a different border to
each. For example, to put a rainbow border on an element:</p>

<div style="border:solid 2px purple; width:134px; text-align:center; margin-left:auto; margin-right:auto; ">
    <div style="border:solid 2px blue;">
        <div style="border:solid 2px cyan;">
            <div style="border:solid 2px lime;">
                <div style="border:solid 2px yellow;">
                    <div style="border:solid 2px orange;">
                        <div style="border:solid 2px red; padding:5px;">
                            <b>I have rainbow borders!</b>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
    
<p>This approach uses seven <code>div</code> elements. However, there is an
alternative that avoids the need for so many superfluous elements: the
new CSS3 <a href="http://www.w3.org/TR/css3-background/#box-shadow"><code>box-shadow</code>
property</a>. A key feature of this property is that it allows for <em>multiple shadows</em> to be supplied at once:</p>
    
<blockquote><code>box-shadow: none | &lt;shadow&gt; [ , &lt;shadow&gt; ]*</code></blockquote>

<!--&lt;shadow&gt; = inset || [ &lt;length&gt; &lt;length&gt; &lt;length&gt;? &lt;length&gt;? || &lt;color&gt; ]-->
    
<p>When multiple shadows are supplied, they can be positioned on top of each
other to create a multiple-border effect. Using the <code>box-shadow</code>
property in this way requires support for the "spread radius" value, and this
is not currently supported by WebKit (includes Safari and Chrome). However,
<strong>Firefox 3.5</strong> (now <a href="http://www.mozilla.com/en-US/firefox/all-beta.html">available</a>
as a preview release) does <a href="https://developer.mozilla.org/En/CSS/-moz-box-shadow" title="-moz-box-shadow">support</a>
the <code>box-shadow</code> spread radius, and if
using that browser, the following example should look identical to the example
above:</p>
    
<div style="width:100px; margin:30px auto; text-align:center; padding:5px;
	-moz-box-shadow:
		0 0 0 2px red,
		0 0 0 4px orange,
		0 0 0 6px yellow,
		0 0 0 8px lime,
		0 0 0 10px cyan,
		0 0 0 12px blue,
		0 0 0 14px purple;
	-webkit-box-shadow:
		0 0 0 2px red,
		0 0 0 4px orange,
		0 0 0 6px yellow,
		0 0 0 8px lime,
		0 0 0 10px cyan,
		0 0 0 12px blue,
		0 0 0 14px purple;
	box-shadow:
		0 0 0 2px red,
		0 0 0 4px orange,
		0 0 0 6px yellow,
		0 0 0 8px lime,
		0 0 0 10px cyan,
		0 0 0 12px blue,
		0 0 0 14px purple;
">
    <b>I have rainbow borders!</b>
</div>

<p>Using <code>box-shadow</code> for multiple borders not only eliminates the need for extra markup,
it also allows the multiple borders to be easily rounded on corners simply by adding the
<a href="http://www.w3.org/TR/css3-background/#the-border-radius"><code>border-radius</code>
property</a> (see <a href="/projects/multiple-borders/rainbow-borders-with-rounded-corners.png">screenshot</a> from Firefox 3.5):</p>

<div style="width:200px; margin:30px auto; text-align:center; padding:5px 15px;
	-moz-border-radius:40px;
	-webkit-border-radius:40px;
	border-radius:40px;
	-moz-box-shadow:
		0 0 0 2px red,
		0 0 0 4px orange,
		0 0 0 6px yellow,
		0 0 0 8px lime,
		0 0 0 10px cyan,
		0 0 0 12px blue,
		0 0 0 14px purple;
	-webkit-box-shadow:
		0 0 0 2px red,
		0 0 0 4px orange,
		0 0 0 6px yellow,
		0 0 0 8px lime,
		0 0 0 10px cyan,
		0 0 0 12px blue,
		0 0 0 14px purple;
	box-shadow:
		0 0 0 2px red,
		0 0 0 4px orange,
		0 0 0 6px yellow,
		0 0 0 8px lime,
		0 0 0 10px cyan,
		0 0 0 12px blue,
		0 0 0 14px purple;
">
    <b>I have rainbow borders with rounded corners!</b>
</div>

<p>To accomplish the above with multiple nested elements, you would have to
tediously increase the <code>border-radius</code> for each wrapped
element in order to get the corner arcs to fit together properly.</p>

<p>I suppose using <code>box-shadow</code> to implement borders is a kind of hack
(the technique requires setting margins because the shadows don't effect page flow),
but we're celebrating the compeltion of Firefox 3.5 by
<a href="http://hacks.mozilla.org/">showcasing hacks</a> like these!
It would be great if multiple borders could simply be specified on a
<code>border</code> property just as is possible with <code>box-shadow</code>.
Each subsequent border defined could wrap around the previously defined borders.
The property could be defined:</p>

<blockquote><code>border: none | &lt;border&gt; [ , &lt;border&gt; ]*</code></blockquote>

<p>In any case, the <code>box-shadow</code> property still has a benefit of
allowing the borders to blend together by specifying the <code>box-shadow</code>'s
blur radius (see <a href="/projects/multiple-borders/blended-rainbow-borders.png">screenshot</a> from Firefox 3.5):</p>

<div style="width:100px; height:100px; margin:30px auto; text-align:center; 
	-moz-border-radius:50px;
	-webkit-border-radius:50px;
	border-radius:50px;
	-moz-box-shadow:
		0 0 4px 2px red,
		0 0 4px 4px orange,
		0 0 4px 6px yellow,
		0 0 4px 8px lime,
		0 0 4px 10px cyan,
		0 0 4px 12px blue,
		0 0 4px 14px purple;
	-webkit-box-shadow:
		0 0 4px 2px red,
		0 0 4px 4px orange,
		0 0 4px 6px yellow,
		0 0 4px 8px lime,
		0 0 4px 10px cyan,
		0 0 4px 12px blue,
		0 0 4px 14px purple;
	box-shadow:
		0 0 4px 2px red,
		0 0 4px 4px orange,
		0 0 4px 6px yellow,
		0 0 4px 8px lime,
		0 0 4px 10px cyan,
		0 0 4px 12px blue,
		0 0 4px 14px purple;
">
    <b style="display:block; padding:10px; ">I have blended rainbow borders!</b>
</div>

<p>It's exciting to see how Mozilla is implementing bleeding-edge CSS features in Firefox
as we have become accustomed to from the WebKit team. Great work everyone!</p>

</div>
]]></content:encoded>
			<wfw:commentRss>http://weston.ruter.net/2009/06/15/multiple-borders-via-css-box-shadow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Detecting Support for data: URIs</title>
		<link>http://weston.ruter.net/2009/05/07/detecting-support-for-data-uris/</link>
		<comments>http://weston.ruter.net/2009/05/07/detecting-support-for-data-uris/#comments</comments>
		<pubDate>Thu, 07 May 2009 20:53:19 +0000</pubDate>
		<dc:creator>Weston Ruter</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://weston.ruter.net/?p=162</guid>
		<description><![CDATA[Updates: Added note at end to respond to V1&#8217;s comment, and fixed the &#8220;awkward CSS syntax&#8221; which was actually a big typo (thanks Harmen).
The data: URI scheme is now supported by the most current version of every major browser, including Internet Explorer. Because of this I wanted to use CSS background images encoded with data: [...]]]></description>
			<content:encoded><![CDATA[<p><ins><strong>Updates:</strong> Added note at end to respond to <a href="http://weston.ruter.net/2009/05/07/detecting-support-for-data-uris/#comment-4936">V1&#8217;s comment</a>, and fixed the &#8220;awkward CSS syntax&#8221; which was actually a big typo (<a title="Can you elaborate a bit on that awkward CSS syntax? Why repeat the background-image rule as a string inside the background-image rule?" href="#comment-5037">thanks Harmen</a>).</ins></p>
<p>The <a title="data URI scheme @ Wikipedia" href="http://en.wikipedia.org/wiki/Data_URI_scheme"><code>data:</code> URI scheme</a> is now supported by the most current version of every major browser, including Internet Explorer. Because of this I wanted to use CSS background images encoded with <code>data:</code> URIs in a current project at <a title="Shepherd Interactive does web development, internet strategy, consulting, video, web hosting, graphic design, and brand identity in Portland, Oregon" href="http://shepherd-interactive.com/">Shepherd Interactive</a>. Why? The first rule of <a title="High Performance Websites by Steve Souders" href="http://oreilly.com/catalog/9780596529307/">High Performance Websites</a> is to <strong><a title="Minimize HTTP Requests: Best Practices for Speeding Up Your Web Site" href="http://developer.yahoo.com/performance/rules.html#num_http">Minimize HTTP Requests</a></strong>. By storing background images directly in the stylesheet only one HTTP request is then necessary to fetch the stylesheet and the images all at once. Furthermore, by giving that stylesheet a <a title="Add an Expires or a Cache-Control Header: Best Practices for Speeding Up Your Web Site" href="http://developer.yahoo.com/performance/rules.html#expires">far-future cache expiration date</a> the browser will never need to request it again.</p>
<p>However, while every browser vendor&#8217;s current version supports <code>data:</code> URIs, older browsers like MSIE 7 do not. Therefore it is necessary to also have fallback CSS rules to serve externally-referenced background images. I came up a way of doing this by utilizing the following script which I place as an inline script in the document <code>head</code>:</p>
<pre><code class="js">var data = new Image();
data.onload = data.onerror = function(){
	if(this.width != 1 || this.height != 1)
		document.documentElement.className += " no-data-uri";
}
data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";</code></pre>
<p>This script attempts to load a 1&#215;1 pixel via a <code>data:</code> URI. If the <code>onload</code> callback fires and it detects that the image&#8217;s width and height are each a single pixel, then the browser supports <code>data:</code> URIs. Otherwise the browser does not support such URIs and a class name is added to the document root so that fallback CSS rules can be written, for example:</p>
<pre><code class="css">#foo {
    background-image:url("data:image/png;base64,<strong>&lt;...&gt;</strong>");
}
html.no-data-uri #foo {
    background-image:url("images/foo.png"); /* fallback */
}</code></pre>
<p>In this way, CSS rules can define background images that utilize <code>data:</code> URIs only for browsers that support them, while at the same time older browsers still render the content properly due to the fallback rules. <ins>Note that for browsers that support <code>data:</code> URIs, the fallback CSS rule above will never be applied and thus <em>its externally-referenced background image will never be downloaded</em>. However, if the browser does <em>not</em> support <code>data:</code> URIs, then the resources will essentially be downloaded twice, but that&#8217;s the price you pay for using an old browser. In any case, when the images are tiny (&lt;1KB) then the overhead is minimal for non-supporting browsers, and your development process is greatly eased since you don&#8217;t have to hassle with creating image sprites (which are sometimes impossible anyway); those who use current browser versions will be rewarded as will the generations of Internet users to come.<br />
</ins></p>
]]></content:encoded>
			<wfw:commentRss>http://weston.ruter.net/2009/05/07/detecting-support-for-data-uris/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Open Scriptures Presentation at BibleTech:2009</title>
		<link>http://weston.ruter.net/2009/04/27/open-scriptures-presentation-at-bibletech2009/</link>
		<comments>http://weston.ruter.net/2009/04/27/open-scriptures-presentation-at-bibletech2009/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 23:31:46 +0000</pubDate>
		<dc:creator>Weston Ruter</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://weston.ruter.net/?p=160</guid>
		<description><![CDATA[As previously announced, I had the privilege of presenting the Open Scriptures project at BibleTech:2009. Multimedia of the talk is available:

]]></description>
			<content:encoded><![CDATA[<p>As <a title="Open Scriptures at BibleTech" href="http://weston.ruter.net/2009/01/14/open-scriptures-at-bibletech/">previously announced</a>, I had the privilege of <a title="Abstract of Open Scriptures: Picking Up the Mantle of the Re:Greek – Open Source Initiative @ BibleTech:2009" href="http://www.bibletechconference.com/speakers.htm#WestonRuter-2009">presenting</a> the <a href="http://openscriptures.org/">Open Scriptures</a> project at <a href="http://www.bibletechconference.com/">BibleTech:2009</a>. Multimedia of the talk is <a title="Multimedia of Presentation at BibleTech:2009" href="http://openscriptures.org/blog/2009/04/multimedia-of-presentation-at-bibletech2009/">available</a>:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="319" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="never" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=3935864&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="425" height="319" src="http://vimeo.com/moogaloop.swf?clip_id=3935864&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="never" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://weston.ruter.net/2009/04/27/open-scriptures-presentation-at-bibletech2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Newly Designed Open Scriptures Website with Blog</title>
		<link>http://weston.ruter.net/2009/03/08/newly-designed-open-scriptures-website-with-blog/</link>
		<comments>http://weston.ruter.net/2009/03/08/newly-designed-open-scriptures-website-with-blog/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 03:12:47 +0000</pubDate>
		<dc:creator>Weston Ruter</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://weston.ruter.net/?p=152</guid>
		<description><![CDATA[I haven&#8217;t formally announced this here yet, but there is a newly designed Open Scriptures website with blog. Future posts regarding Open Scriptures will be posted there. There are two new posts, the first regarding the recently-unveiled exciting Tagged Tanakh project, and the second about redeeming the ill-fated Re:Greek Open Source Initiative with a call [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://openscriptures.org/"><img class="alignright size-medium wp-image-153" style="float:right; margin-left: 12px; margin-bottom: 6px;" title="New Open Scriptures Home Page" src="http://weston.ruter.net/wp-content/uploads/2009/03/open-scriptures-home-page-300x212.png" alt="" width="300" height="212" /></a>I haven&#8217;t formally announced this here yet, but there is a newly designed <a href="http://openscriptures.org/">Open Scriptures</a> website with blog. Future posts regarding Open Scriptures will be posted there. There are two new posts, the first regarding the recently-unveiled exciting Tagged Tanakh project, and the second about redeeming the ill-fated Re:Greek Open Source Initiative with a call for participation. <a href="http://openscriptures.org/">Check them out</a> and <a title="Open Scriptures FeedBurner " href="http://feeds2.feedburner.com/open-scriptures">subscribe to the feed</a>.</p>
<p>Please also follow <a href="http://twitter.com/openscriptures">Open Scriptures on Twitter</a>.</p>
<p>Join in on the discussion on the <a title="Open Scriptures Google Group" href="http://groups.google.com/group/open-scriptures">Google Group</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://weston.ruter.net/2009/03/08/newly-designed-open-scriptures-website-with-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>“Old” Mainly Linguistics Stuff from College Days</title>
		<link>http://weston.ruter.net/2009/02/21/old-mainly-linguistics-stuff-from-college-days/</link>
		<comments>http://weston.ruter.net/2009/02/21/old-mainly-linguistics-stuff-from-college-days/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 21:05:20 +0000</pubDate>
		<dc:creator>Weston Ruter</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Linguistics]]></category>
		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://weston.ruter.net/?p=138</guid>
		<description><![CDATA[This morning I got inspired to go over some relatively old stuff that I worked on in college. There are several linguistics projects that I think are pretty interesting (the first three especially):

Phonological Analysis of a Second Language
Arabic Phonemes Represented by the Spanish Letter “J”
Indo-European Cognates in Psalm 23 and the Beatitudes
El alfabeto árabe
Hamlet Word [...]]]></description>
			<content:encoded><![CDATA[<p>This morning I got inspired to go over some relatively old stuff that I worked on in college. There are several linguistics projects that I think are pretty interesting (the first three especially):</p>
<ul>
<li><a href="/projects/misc-linguistics/phonological-analysis-of-a-second-language/"><strong>Phonological Analysis of a Second Language</strong></a></li>
<li><a href="/projects/misc-linguistics/arabic-phonemes-represented-by-the-spanish-letter-j.html"><strong>Arabic Phonemes Represented by the Spanish Letter “J”</strong></a></li>
<li><a href="/projects/misc-linguistics/indo-european-cognates-in-psalm-23-and-beatitudes.html"><strong>Indo-European Cognates in Psalm 23 and the Beatitudes</strong></a></li>
<li><a hreflang="es" href="../projects/misc-linguistics/el-alfabeto-arabe.html">El alfabeto árabe</a></li>
<li><a href="/projects/misc-linguistics/hamlet-word-origin-study.html">Hamlet Word Origin Study</a></li>
<li><a href="/projects/misc-linguistics/indo-european-word-history-of-plek.png">Indo-European Word History of <em>plek</em></a></li>
</ul>
<p>And then I found an old chart I made of <a href="/projects/race-and-ethnicity.html">my racial makup</a>.</p>
<p>And then there is a little <a href="/projects/nickerson-signal/">web app for SPU&#8217;s Nickerson Signal</a> which attempts to model a traffic signal so that upcoming crossing times can be predicted. (Didn&#8217;t end up accurately modeling reality.)</p>
<p>And finally there is the <a href="/projects/s-link/">Semantic Linking</a> tool (mentioned in my last post) which is a prototype for an upcoming tool which enables contributors to link the semantic units between manuscripts and translations.</p>
]]></content:encoded>
			<wfw:commentRss>http://weston.ruter.net/2009/02/21/old-mainly-linguistics-stuff-from-college-days/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manuscript Comparator and the Open Scriptures Platform</title>
		<link>http://weston.ruter.net/2009/02/07/manuscript-comparator-and-open-scriptures-platform/</link>
		<comments>http://weston.ruter.net/2009/02/07/manuscript-comparator-and-open-scriptures-platform/#comments</comments>
		<pubDate>Sat, 07 Feb 2009 18:37:52 +0000</pubDate>
		<dc:creator>Weston Ruter</dc:creator>
				<category><![CDATA[Bible Tech]]></category>
		<category><![CDATA[Linguistics]]></category>
		<category><![CDATA[Open Scriptures]]></category>

		<guid isPermaLink="false">http://weston.ruter.net/?p=116</guid>
		<description><![CDATA[This post has been moved to the Open Scriptures blog.
]]></description>
			<content:encoded><![CDATA[<p><em>This post has been moved to the <a title="Manuscript Comparator and the Open Scriptures Platform" href="http://openscriptures.org/2009/02/manuscript-comparator-and-the-open-scriptures-platform/">Open Scriptures blog</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://weston.ruter.net/2009/02/07/manuscript-comparator-and-open-scriptures-platform/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Discussing Open Scriptures</title>
		<link>http://weston.ruter.net/2009/01/17/discussing-open-scriptures/</link>
		<comments>http://weston.ruter.net/2009/01/17/discussing-open-scriptures/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 01:28:08 +0000</pubDate>
		<dc:creator>Weston Ruter</dc:creator>
				<category><![CDATA[Open Scriptures]]></category>

		<guid isPermaLink="false">http://weston.ruter.net/?p=108</guid>
		<description><![CDATA[This post has been moved to the Open Scriptures blog.
]]></description>
			<content:encoded><![CDATA[<p><em>This post has been moved to the <a title="Discussing Open Scriptures" href="http://openscriptures.org/2009/01/discussing-open-scriptures/">Open Scriptures blog</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://weston.ruter.net/2009/01/17/discussing-open-scriptures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open Scriptures at BibleTech</title>
		<link>http://weston.ruter.net/2009/01/14/open-scriptures-at-bibletech/</link>
		<comments>http://weston.ruter.net/2009/01/14/open-scriptures-at-bibletech/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 19:25:20 +0000</pubDate>
		<dc:creator>Weston Ruter</dc:creator>
				<category><![CDATA[Bible Tech]]></category>
		<category><![CDATA[Faith]]></category>
		<category><![CDATA[Linguistics]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://weston.ruter.net/?p=103</guid>
		<description><![CDATA[(This post has been cross-posted on the Open Scriptures blog.)
For the past several years, I&#8217;ve been dreaming about an open source community-driven Web application for Scripture. In the past few months, things have really been kicking into high gear. At BibleTech:2009 I&#8217;m presenting the project in the talk Open Scriptures: Picking Up the Mantle of [...]]]></description>
			<content:encoded><![CDATA[<p><em>(This post has been cross-posted on the <a title="Open Scriptures at BibleTech" href="http://openscriptures.org/2009/01/open-scriptures-at-bibletech/">Open Scriptures blog</a>.)</em></p>
<p><a href="http://www.bibletechconference.com/"><img class="alignright" style="border: 0pt none; float:right; margin-left:10px; margin-bottom:10px;" src="http://www.bibletechconference.com/ads/banners/bibletechbanner_300x250.gif" border="0" alt="Register Now for BibleTech:2009, March 27/28 in Seattle, Washington" width="300" height="250" /></a>For the past several years, I&#8217;ve been dreaming about an open source community-driven Web application for Scripture. In the past few months, things have really been kicking into high gear. At <a href="http://www.bibletechconference.com/">BibleTech:2009</a> I&#8217;m presenting the project in the talk <cite><a href="http://www.bibletechconference.com/speakers.htm#WestonRuter-2009">Open Scriptures: Picking Up the Mantle of the Re:Greek – Open Source Initiative</a></cite>:</p>
<blockquote><p><a href="http://openscriptures.org/">Open Scriptures</a> seeks to be a comprehensive open-source Web repository for integrated scriptural data and a general application framework for building internationalized social applications of scripture. An abundance of scriptural resources are now available online—manuscripts, translations, and annotations are all being made available by students and scholars alike at an ever-increasing rate. These diverse scriptural resources, however, are isolated from each other and fragmented across the Internet. Thus mashing up the available data into new scriptural applications is not currently possible for the community at large because the resources&#8217; interrelationships are not systematically documented. Open Scriptures aims to establish a scriptural database for interlinked textual resources such as merged manuscripts, the differences among them, and the links between their semantic units and the semantic units of their translations. With such a foundation in place, derived scriptural data like cross-references may be stored in a translation-neutral and internationalized manner so as to be accessible to the community no matter what language they speak or version they prefer.</p></blockquote>
<p>Think of it as a Wikipedia for scriptural data. Just as Wikipedia has become the go-to place to find open encyclopedia information, Open Scriptures seeks to be the go-to place for open scriptural data. (Non-free data could also be stored, but it would be restricted to non-commercial personal use, as Wikipedia does with <a href="http://en.wikipedia.org/wiki/Wikipedia:Fair_use">fair use</a> or by obtaining special permission.)</p>
<p>Interested? The project needs you! I&#8217;d love for a core group of scholars and developers to come together with the shared vision of open access to scriptural data employing open standards and best practices of the Web.</p>
]]></content:encoded>
			<wfw:commentRss>http://weston.ruter.net/2009/01/14/open-scriptures-at-bibletech/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
