<?xml version="1.0" encoding="UTF-8"?>
<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>Arc90 Lab</title>
	
	<link>http://lab.arc90.com</link>
	<description>Web Application Design &amp; Development</description>
	<lastBuildDate>Fri, 20 May 2011 20:14:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Arc90Lab" /><feedburner:info uri="arc90lab" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Donahue</title>
		<link>http://feedproxy.google.com/~r/Arc90Lab/~3/9-LT18t7wi4/</link>
		<comments>http://lab.arc90.com/2011/03/21/donahue/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 22:41:06 +0000</pubDate>
		<dc:creator>Tim Meaney</dc:creator>
				<category><![CDATA[Experiments]]></category>

		<guid isPermaLink="false">http://lab.arc90.com/?p=142</guid>
		<description><![CDATA[[UPDATE: Visit the Donahue site or see Donahue presentations.] Donahue is a web app co-designed and built by Arc90 and Behavior Design. The original idea for Donahue was born out of frustration with the state of (in)attention paid to presenters at conferences. As the project evolved, the tool shifted to&#8230; <a href="http://lab.arc90.com/2011/03/21/donahue/">More</a>]]></description>
			<content:encoded><![CDATA[<p>[<strong>UPDATE:</strong> Visit the Donahue <a href="http://www.donahueapp.com/">site</a> or see Donahue <a href="http://go.donahueapp.com/">presentations</a>.]</p>
<p>Donahue is a web app co-designed and built by Arc90 and <a href="http://behaviordesign.com/">Behavior Design</a>. The original idea for Donahue was born out of frustration with the state of (in)attention paid to presenters at conferences. As the project evolved, the tool shifted to one that attempts to break down the wall between the presenter and the audience. By creating a frictionless environment for the audience to react, respond, reject or share the presenter&#8217;s ideas, Donahue shifts the standard presentation from a broadcast / consumer approach into a that of a conversation. And this is precisely the reason that people attend conferences &#8211; to engage in conversations.</p>
<p>Donahue &#8211; a new and unique presentation tool powered by Twitter &#8211; was unveiled at SXSW 2011, in a talk co-presented by Arc90&#8242;s Tim Meaney and Behavior Design&#8217;s Chris Fahey. Tim and Chris delivered the talk, titled &#8220;<a href="http://schedule.sxsw.com/events/event_IAP6389">Toss the Projector: Redefining the Audience / Presenter Dynamic</a>&#8220;, via Donahue. The ideas explored in this talk were reinforced by Donahue, including:</p>
<ul>
<li>Conference talks, like all media, have been transformed from broadcast to conversation.</li>
<li>The technology of the conference presentation is broken.</li>
<li>The audience insists upon having a conversation in real-time about the presenter’s ideas, and the presenter should embrace this.</li>
<li>A presenter’s goal for a talk should be to start a meme.</li>
<li>Our collective concept of attention is changing.</li>
</ul>
<p>Donahue uses Twitter as its conversation medium. Each &#8220;slide&#8221; unveiled in Donahue is actually a tweet sent out in real-time by the presenter. The audience reaction (i.e. the &#8220;back channel&#8221;) is collected and displayed by Donahue in a unique presentation console that participants &#8211; whether present at the talk or anywhere in the world &#8211; can enjoy and use to directly engage. The result is a uniquely intimate and engaging experience that is markedly different from the typically passive experience of sitting through an exposition accompanied by a slide deck.</p>
<p>Another premise behind Donahue is that while presentations have a beginning and end point, the chatter lingers on long after. Donahue leaves behind a <a href="http://go.donahueapp.com/presentations/view/tosstheprojector/points/0">permanent record</a> of the speaker&#8217;s ideas, and the audience&#8217;s reaction to their points. This eliminates the abstraction of uploading the slides for later review by the audience, as the speaker&#8217;s ideas are immediately and always available online.</p>

<a href='http://lab.arc90.com/2011/03/21/donahue/toss-1/' title='Presenter&#039;s ideas'><img width="150" height="106" src="http://lab.arc90.com/files/2011/03/toss-1.png" class="attachment-thumbnail" alt="Presenter&#039;s ideas" title="Presenter&#039;s ideas" /></a>
<a href='http://lab.arc90.com/2011/03/21/donahue/toss-2/' title='Participant&#039;s tweet'><img width="150" height="107" src="http://lab.arc90.com/files/2011/03/toss-2.png" class="attachment-thumbnail" alt="Participant&#039;s tweet" title="Participant&#039;s tweet" /></a>
<a href='http://lab.arc90.com/2011/03/21/donahue/donahue-meme/' title='Start a meme!'><img width="150" height="93" src="http://lab.arc90.com/files/2011/03/Donahue-meme.png" class="attachment-thumbnail" alt="Start a meme!" title="Start a meme!" /></a>

<p>As a real-time platform for having a conversation around a conference presentation, Donahue had to be extremely scalable and performant. The possibility for a huge amount of curious participants was very real, as Donahue reaches out immediately into Twitter (what we internally called <em>The O&#8217;Reilly Effect</em>, where one retweet from <a href="http://twitter.com/#!/timoreilly">Tim O&#8217;Reilly</a> could bring in tens of thousand viewers to the presentation). Donahue achieved this level of performance with an architecture built upon real-time consumption of the Twitter API, dedicated node.js servers for the presenter and projector views of the content, a replicated farm of node servers for serving content to participants and directly connected clients using WebSockets instead of aggressive polling. The <a href="http://go.donahueapp.com/presentations/view/tosstheprojector/points/80">kick-ass development team</a> behind Donahue will be sharing the architecture and technical thinking behind Donahue in future blog posts.</p>
<p>Arc90 and Behavior are exploring options for moving this project forward, <a href="http://twitter.com/#!/donahueapp">follow @donahueapp on Twitter</a> to stay informed of any news.</p>
<img src="http://feeds.feedburner.com/~r/Arc90Lab/~4/9-LT18t7wi4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lab.arc90.com/2011/03/21/donahue/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://lab.arc90.com/2011/03/21/donahue/</feedburner:origLink></item>
		<item>
		<title>JSDOM</title>
		<link>http://feedproxy.google.com/~r/Arc90Lab/~3/LI28cP1f0oQ/</link>
		<comments>http://lab.arc90.com/2010/11/22/jsdom/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 15:45:06 +0000</pubDate>
		<dc:creator>Rich Ziade</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://lab.arc90.com/?p=112</guid>
		<description><![CDATA[Over the past few years, Javascript has matured from an &#34;amateur&#8217;s programming language&#34; into a full-fledged platform. Projects like Google Chrome and JQuery have helped elevate the language into a serious platform for delivering applications. On the server side, projects like Google&#8217;s V8 show off Javascript&#8217;s prowess and power beyond&#8230; <a href="http://lab.arc90.com/2010/11/22/jsdom/">More</a>]]></description>
			<content:encoded><![CDATA[<p>Over the past few years, Javascript has matured from an &quot;amateur&#8217;s programming language&quot; into a full-fledged platform. Projects like Google Chrome and JQuery have helped elevate the language into a serious platform for delivering applications.</p>
<p>On the server side, projects like Google&#8217;s <a href="http://code.google.com/p/v8/">V8</a> show off Javascript&#8217;s prowess and power beyond the browser. Building on top of V8, <a href="http://nodejs.org/">Node.js</a> leverages sever-side Javascript to allow for incredibly powerful, scalable software. Unfortunately, what isn’t included in the box with Node.js is the ability to leverage the powerful DOM capabilities built into nearly every browser that exists today. Enter our latest Arc90 Lab tool, JSDOM.</p>
<p>Jsdom is a <a href="http://commonjs.org">CommonJS</a> implementation of the <a href="http://www.w3.org/DOM/">W3C Document Object Model (DOM)</a> designed to work with Node.js. It is intended to be platform independent and as minimal/light as possible while adhering to the <a href="http://www.w3.org/DOM/DOMTR">W3C DOM specifications</a>. </p>
<hr />
<ul>
<li><a href="#why">Why build this?</a> </li>
<li><a href="#how">How does it work?</a> </li>
<li><a href="#installation">Installation</a> </li>
<li><a href="#license">License</a> </li>
<li><a href="#acknowledgement">Acknowledgement</a> </li>
<li><a href="#blog">Discuss</a> </li>
</ul>
<h4 id="what">Why build this?</h4>
<p>One of the first things that a front-end developer coming to a server-side Javascript platform notices is the lack of a window and/or document object.&#160; Without a browser environment it is impossible to run the frameworks and libraries that we have all come to know and love.&#160; JSDOM provides such a browser environment making it easy load external scripts and execute them in the context of a browser Window on the server. </p>
<p>By allowing both the server and the browser to interpret and manipulate the DOM, a host of new possibilities arise. For example, graceful degradation from rich AJAX-style experiences to simpler page-driven experiences is now much easier with JSDOM. In addition, powerful server-side DOM manipulation (e.g. to extract or replace certain elements depending on certain conditions) is now possible. </p>
<h4 id="how">How does it work?</h4>
<p>Getting started with JSDOM is quite simple. You will need <a href="http://nodejs.org">node.js</a> and the <a href="https://github.com/tmpvar/jsdom">JSDOM library</a>, and of course, a basic understanding of Javascript.</p>
<p>The following example shows how to create a DOM Window, load the jQuery framework, and run some code &#8211; right on the server:</p>
<pre class="javascript" name="code">
    var html = '
    &lt;html&gt;\
      &lt;head&gt;\
      &lt;/head&gt;\
        &lt;body&gt;\
        &lt;h1>Hello World&lt;/h1&gt;\
        &lt;p>This is a &lt;em&gt;stupid simple&lt;/em&gt; example&lt;/p&gt;\
        &lt;/body&gt;\
    &lt;/html&gt;\
    ';

    // create a new window, with the above markup
    var window = require('jsdom').jsdom(html).createWindow(),

        // create a new script tag to load up jQuery
        script = window.document.createElement('script');

    script.src = 'http://code.jquery.com/jquery-1.4.2.js';

    // when jQuery finishes loading
    script.onload = function() {

      // Since this is not a browser we need to specify the window that jQuery has
      // been added to

      // Output: 'H1 Contents: Hello World'
      console.log(&quot;H1 Contents:&quot;, window.jQuery('h1').text());

      // do a simple replace on the `em` text above
      window.jQuery('p em').text('silly');

      // Output: 'P Contents: This is a silly example'
      console.log(&quot;P Contents:&quot;, window.jQuery('p').text());
    };

    // Append the element to the head element of the document
    window.document.head.appendChild(script);</pre>
<h4 id="installation">Installation</h4>
<p>JSDOM&#8217;s source code is hosted on <a href="http://github.com/tmpvar/jsdom">github</a> along with examples, use cases, and other useful information. You may also use <a href="http://npmjs.org">NPM</a> to install JSDOM by typing the following in your terminal `npm install jsdom`</p>
<h4 id="license">License</h4>
<p>This library is licensed under the <a href="http://www.opensource.org/licenses/mit-license.php">MIT Open Source</a> license.</p>
<h4 id="acknowledgement">Acknowledgement</h4>
<p>This ambitious project is the brainchild of Arc90 lead engineer <a href="http://arc90.com/people/elijah-insua/">Elijah Insua</a>.</p>
<h4 id="blog">Discuss</h4>
<p>If you have questions about JSDOM or would just like to share your thoughts, you can do so at the <a href="http://blog.arc90.com/2010/11/17/our-next-lab-experiment-jsdom/">Arc90 blog</a>.</p>
<img src="http://feeds.feedburner.com/~r/Arc90Lab/~4/LI28cP1f0oQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lab.arc90.com/2010/11/22/jsdom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://lab.arc90.com/2010/11/22/jsdom/</feedburner:origLink></item>
		<item>
		<title>ActionScript 3 XPath Library</title>
		<link>http://feedproxy.google.com/~r/Arc90Lab/~3/SabNHoD2PAY/</link>
		<comments>http://lab.arc90.com/2010/04/28/actionscript-3-xpath-library/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 20:56:43 +0000</pubDate>
		<dc:creator>Andy Lewisohn</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xpath]]></category>

		<guid isPermaLink="false">http://lab.arc90.com/?p=74</guid>
		<description><![CDATA[One of the issues I&#8217;ve come across when dealing with XML in ActionScript 3 has been the inability to dynamically execute E4X queries. The need to do so arose several times, and one solution was to use RiaOne&#8217;s D.eval API. This solution is pretty robust; it&#8217;s a runtime parser/compiler for&#8230; <a href="http://lab.arc90.com/2010/04/28/actionscript-3-xpath-library/">More</a>]]></description>
			<content:encoded><![CDATA[<p>One of the issues I&#8217;ve come across when dealing with XML in ActionScript 3 has been the inability to dynamically execute E4X queries. The need to do so arose several times, and one solution was to use RiaOne&#8217;s <a href="http://www.riaone.com/products/deval/">D.eval API</a>. This solution is pretty robust; it&#8217;s a runtime parser/compiler for ActionScript code and it works pretty well. I have a couple of issues with it though. The first is that it&#8217;s like using an atomic bomb to kill a fly. When all you want to do is navigate through an XML document at runtime, a tool that can parse the entire ECMAScript specification seems like overkill. My second issue is that it&#8217;s a black box with hard to understand, diagnose, and catch runtime errors. At first, I thought that an implementation of just the E4X portions of the spec would provide a solution, but that soon led me into a labyrinthine maze of what to cut and what to keep. I wanted something a lot simpler and that&#8217;s where XPath 1.0 enters the picture.</p>
<p>The XPath specification is pretty simple, allowing for the searching (and limiting of those searches) within an XML document that is provided as context. I&#8217;m not going to go into how to write XPath, but I&#8217;ll point you to the <a href="http://www.w3.org/TR/xpath/">spec for 1.0</a>. I&#8217;m a firm believer in not reinventing the wheel, so the first thing I did was look for an XPath library written in ActionScript&#8217;s close cousin, JavaScript. It didn&#8217;t take much searching to find <a href="http://www.formfaces.com/">Form Faces</a>. The project appears to be defunct, but it provided the basis for my implementation. I have optimized the library where possible, but it is still not as fast as the native E4X implementation. <strong>The full feature set of the XPath 1.0 specification has been implemented.</strong> </p>
<p><em>One note on how to improve performance: position predicates in the form of <code>/document/element[1]</code> are much faster than boolean predicates in the form of <code>/document/element[@name = 'temp']</code></em>.</p>
<h4 id="use">How to use it</h4>
<p>The entry point for the library is the <code>com.watchthosecorners.xpath.XPath</code> class. It has two static methods and two instance methods that allow either the evaluation of an XPath query or the selection of a single node. Imagine we have the following XML document for use in our XPath queries (bear in mind that XPath uses 1 as its start index, not 0):</p>
<pre name="code" class="xml">&lt;document&gt;
   &lt;element&gt;Some Value&lt;/element&gt;
   &lt;element&gt;Some Other Value&lt;/element&gt;
&lt;/document&gt;</pre>
<p>The following snippet would retrieve the text value of an element. The evaluate method can return a string, a boolean, a number, or a node-set (an array of values):</p>
<pre name="code" class="as3">var string1:* = XPath.evaluate("/document/element[1]/text()", document);
var string2:* = new XPath("/document/element[2]/text()").evaluate(document);
trace(string1) // Output: Some Value
trace(string2) // Output: Some Other Value

var nodeSet:NodeSet = XPath.evaluate("/document/element", document);
trace(nodeSet) // Output: &lt;element&gt;Some Value&lt;/element&gt;,&lt;element&gt;Some Other Value&lt;/element&gt;

var boolean:Boolean = XPath.evaluate("1 = 1");
trace(boolean) // Output: true
boolean = XPath.evaluate("/document/element[1]/text() = 'Some Other Value'", document);
trace(boolean) // Output: false

var number:Number = XPath.evaluate("count(/document/element)", document);
trace(number) // Output: 2
</pre>
<p>The snippet below would select a single XML element (the value is returned as the native XML type):</p>
<pre name="code" class="as3">var result1:* = XPath.selectSingleNode("/document/element[1]", document);
var result2:* = new XPath("/document/element[2]").selectSingleNode(document);

trace(result1) // Output: &lt;element&gt;Some Value&lt;/element&gt;
trace(result2) // Output: &lt;element&gt;Some Other Value&lt;/element&gt;</pre>
<p>While the use cases above are simplistic, the XPath library allows for powerful searching of an XML document at runtime. One possible used could be to extend the <code>DataGrid</code> and <code>DataGridColumn</code> classes to support XPath as a value for the <code>dataField</code> property, thereby allowing more complex lookups of values.</p>
<h4 id="get_it">Get it</h4>
<p>The AS3 XPath Library is hosted on <a href="http://code.google.com/p/as3xpathlib/">googlecode</a>. It is built with Maven and consists of two modules.</p>
<ol>
<li>as3xpath-core: This is the core functionality and is all that&#8217;s required in a project. (<a href="http://watchthosecorners.com/as3xpath/as3xpath-core/asdoc/index.html">API Docs</a>)</li>
<li>as3xpath-ext-functions: This library contains a small set of functions that can be used in XPath queries, it is not required. (<a href="http://watchthosecorners.com/as3xpath/as3xpath-ext-functions/asdoc/index.html">API Docs</a>)</li>
</ol>
</p>
<p>For those who use Maven to manage dependencies, there is a maven repository <a href="https://as3xpathlib.googlecode.com/svn/releases">here</a> and the source for all releases and current development can be viewed <a href="http://code.google.com/p/as3xpathlib/source/browse">here</a>.</p>
<h4 id="issues">Issues</h4>
<p>Please report any bugs in the <a href="http://code.google.com/p/as3xpathlib/issues/list">issues</a> section of the googlecode project.</p>
<h4 id="license">License</h4>
<p>AS3 XPath Library is released under the Apache 2.0 license.</p>
<h4 id="discuss">Discuss</h4>
<p>Please offer feedback in the comments, or email me, Andy Lewisohn, at <a href="mailto:andrewl@arc90.com">andrewl@arc90.com</a>.</p>
<img src="http://feeds.feedburner.com/~r/Arc90Lab/~4/SabNHoD2PAY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lab.arc90.com/2010/04/28/actionscript-3-xpath-library/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://lab.arc90.com/2010/04/28/actionscript-3-xpath-library/</feedburner:origLink></item>
		<item>
		<title>HashMask</title>
		<link>http://feedproxy.google.com/~r/Arc90Lab/~3/mVvJNBRI7VE/</link>
		<comments>http://lab.arc90.com/2009/07/09/hashmask-another-more-secure-experiment-in-password-masking/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 19:06:02 +0000</pubDate>
		<dc:creator>Arc90</dc:creator>
				<category><![CDATA[Experiments]]></category>

		<guid isPermaLink="false">http://lab.daniell.acr90-dev-02/2009/07/09/hashmask-another-more-secure-experiment-in-password-masking/</guid>
		<description><![CDATA[<p>HashMask attempts to provide an easier-to-view visual "fingerprint" for users to recognize the password they've entered. Within the password text box, a sparkline is drawn to aid the user in recognizing what they've entered.</p>]]></description>
			<content:encoded><![CDATA[<p>HashMask is an attempt to find a more secure middle ground between clear and masked passwords. It does this by visualizing a hashed representation of the password as a sparkline with color &#8211; the intent being that the user would become familiar with this image and be able to easily confirm that they typed the right (or wrong) password.</p>
<hr />
<h4 id="demo">Demo</h4>
<p><iframe src="http://lab.arc90.com/experiments/hashmask/demo.html" width="600" height="300" style="margin-left: 10px; border: 1px solid #CCC"></iframe></p>
<h4 id="why">Why?</h4>
<p>My original experiment, <a href="http://lab.arc90.com/2009/07/halfmask.php">HalfMask</a>, produced lots of good discussion, which is exactly what I had hoped for. As security expert Bruce Schneier said recently, <a href="http://www.schneier.com/blog/archives/2009/07/the_pros_and_co.html">password masking is not a panacea</a>. Finding a solution that provides both security and usability is the goal.</p>
<p>As with HalfMask, HashMask is purely an experiment. I&#8217;m not suggesting that this is the best middle ground between clear and masked passwords. I am just hoping to get the community thinking about different approaches.</p>
<h4 id="how">How does it work?</h4>
<p>HashMask is a <a href="http://www.jquery.com">jQuery</a> plugin that will produce a unique and non reversible visualization of a users password.  The hope being that they would be able to confirm that they entered their password correctly, but no one else would. It also degrades gracefully so that users without javascript or a poor browser (IE6) will just see a password field.</p>
<p>Technically speaking, it uses a subset of the sha1 hash of the password as the seed for the sparkline&#8217;s shape and color. It should be relatively safe from reverse engineering as a result. There is the potential to estimate a possible range of characters of the first section of the hash, but overall this should be a extremely low risk.</p>
<h4 id="use">Can I use it?</h4>
<p>HashMask is still alpha-level software, but it should be relatively safe to use on an experimental basis if you are interested. It should work on Firefox 3, Safari 4 and IE6+. It&#8217;s available here, as well as on <a href="http://code.google.com/p/hashmask">google code</a>.</p>
<h4 id="download">Download</h4>
<p><p>Click on the icon to go to the download directory at google code:</p>
<p><a href="http://code.google.com/p/hashmask/downloads/list"><img alt="Download" src="http://arc90.com/_img/download.gif" /></a></p>
<p>Additionally, you may <a href="http://code.google.com/p/hashmask/source/browse/trunk/jquery.hashmask.js">view the source directly in google code</a>.</p>
</p>
<h4 id="license">License</h4>
<p>HashMask is released under the BSD license.</p>
<h4 id="improvement">Room for Improvement</h4>
<p>I personally like this approach much better than HalfMask. It&#8217;s more secure at the loss of slight usability. That said, there is room for improvement, specifically with regard to more memorable and elegant visualizations. A colored sparkline works, but it&#8217;s not ideal. If you have suggestions, please let me know or feel free to fork and implement!</p>
<h4 id="discuss">Discuss</h4>
<p>Any feedback on the concept is welcome &#8211; feel free to post it on the <a href="http://blog.arc90.com/2009/07/newer_in_the_lab_hashmask_-_an.php">Arc90 Blog</a>, or <a href="http://twitter.com/chrisdary">Follow me on Twitter</a>.</p>
<img src="http://feeds.feedburner.com/~r/Arc90Lab/~4/mVvJNBRI7VE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lab.arc90.com/2009/07/09/hashmask-another-more-secure-experiment-in-password-masking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://lab.arc90.com/2009/07/09/hashmask-another-more-secure-experiment-in-password-masking/</feedburner:origLink></item>
		<item>
		<title>HalfMask</title>
		<link>http://feedproxy.google.com/~r/Arc90Lab/~3/etl_XbL4Bsc/</link>
		<comments>http://lab.arc90.com/2009/07/08/halfmask-an-experiment-in-password-masking/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 15:03:11 +0000</pubDate>
		<dc:creator>Arc90</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://lab.daniell.acr90-dev-02/2009/07/08/halfmask-an-experiment-in-password-masking/</guid>
		<description><![CDATA[<p>HalfMask is an experimental approach to masking on password fields. Rather than just showing bullets or asterisks, HalfMask presents visual cues so the user can easily read their own password.</p>]]></description>
			<content:encoded><![CDATA[<p>HalfMask is an experimental approach to masking on password fields. Currently the standard shows bullets or asterisks to hide a user&#8217;s password completely as they type. Halfmask avoids this by obscuring the password with semi-visible random characters in the background. The intent is to only allow the user who typed the password to easily read it.</p>
<p><strong>Update: If you find HalfMask interesting, you may want to check out our newer experiment, <a href="http://lab.arc90.com/2009/07/hashmask.php">HashMask</a>.</strong></p>
<hr />
<h4 id="demo">Demo</h4>
<p><iframe src="http://lab.arc90.com/experiments/halfmask/demo.html" width="600" height="300" style="margin-left: 10px; border: 1px solid #CCC"></iframe></p>
<h4 id="why">Why?</h4>
<p>There&#8217;s been a lot of buzz in the tubes lately about password masking being A Bad Thing, specifically brought on by <a href="http://www.useit.com/alertbox/passwords.html">Jakob Nielsen&#8217;s AlertBox article, Stop Password Masking</a>. To be frank, I couldn&#8217;t disagree more with this. I think showing clear passwords would be a huge mistake, despite the obvious usability gains. But I&#8217;m all about compromise, so HalfMask is an attempt to meet Jakob halfway.</p>
<p>I&#8217;m not suggesting that this is the best way to mask passwords. I am just hoping to get the community thinking about different approaches by exploring one approach.</p>
<h4 id="how">How does it work?</h4>
<p>HalfMask is a <a href="http://www.jquery.com">jQuery</a> plugin that will obscure a password field with random characters. The intent is that to a casual observer the field will be unreadable at a glance, but the user inputting the text will be able to read it relatively clearly as they only need to confirm what they input, not read it fresh.</p>
<p>In this way, it is usable <em>enough</em>, by being visible to the author, but not <em>too usable</em>, in that shoulder surfers shouldn&#8217;t be able to read it. It also degrades gracefully so that users without javascript or with a poor browser (IE6) will still see a password field.</p>
<h4 id="use">Can I use it?</h4>
<p>Well sure, but I can&#8217;t recommend using this in any critical software. It should work in Firefox 3, Safari 3 and IE7. It&#8217;s available here, as well as on <a href="http://code.google.com/p/halfmask">google code</a>.</p>
<h4 id="download">Download</h4>
<p><p>Click on the icon to go to the download directory at google code:</p>
<p><a href="http://code.google.com/p/halfmask/downloads/list"><img alt="Download" src="http://arc90.com/_img/download.gif" /></a></p>
<p>Additionally, you may <a href="http://code.google.com/p/halfmask/source/browse/trunk/jquery.halfmask.js">view the source directly in google code</a>.</p>
</p>
<h4 id="license">License</h4>
<p>HalfMask is released under the BSD license.</p>
<h4 id="knownissues">Known Issues</h4>
<p>There are a few known issues with this approach:</p>
<ul>
<li>Text becomes nearly impossible to read at small fonts.</li>
<li>Password fields are still vulnerable to cameras/recording.</li>
<li>Colorblind people may have a harder time reading the correct text.</li>
</ul>
<p>These are issues which readers are welcome to solve with their own approach or with modifications to this one!</p>
<h4 id="discuss">Discuss</h4>
<p>Please offer feedback on the <a href="http://blog.arc90.com/2009/07/new_in_the_lab_halfmask_a_pass.php">Arc90 Blog</a>, or email me, Chris Dary, at <a href="mailto:chrisd@arc90.com">chrisd@arc90.com</a>.</p>
<img src="http://feeds.feedburner.com/~r/Arc90Lab/~4/etl_XbL4Bsc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lab.arc90.com/2009/07/08/halfmask-an-experiment-in-password-masking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://lab.arc90.com/2009/07/08/halfmask-an-experiment-in-password-masking/</feedburner:origLink></item>
		<item>
		<title>TBUZZ</title>
		<link>http://feedproxy.google.com/~r/Arc90Lab/~3/8MKlLW3TUKA/</link>
		<comments>http://lab.arc90.com/2009/05/12/tbuzz/#comments</comments>
		<pubDate>Tue, 12 May 2009 12:16:54 +0000</pubDate>
		<dc:creator>Arc90</dc:creator>
				<category><![CDATA[Experiments]]></category>
		<category><![CDATA[tbuzz arc90]]></category>

		<guid isPermaLink="false">http://lab.daniell.acr90-dev-02/2009/05/12/tbuzz/</guid>
		<description><![CDATA[<p>Our wildly-popular Twitter client, TBUZZ lets you easily post to Twitter directly from your Web browser, and shows you what others are saying about that page. It works with all modern Web browsers.</p>]]></description>
			<content:encoded><![CDATA[<p>Following in the footsteps of our last lab experiment &#8211; <a href="http://lab.arc90.com/experiments/readability/">Readability</a> &#8211; we bring yet another bookmarklet. We wanted an easy way to twitter as we browse the Web. We also wanted to see what others were saying about the pages we were visiting.</p>
<p>Enter <a href="http://tbuzz.arc90.com/">TBUZZ</a>:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="600" height="450" 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="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=4548135&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="600" height="450" src="http://vimeo.com/moogaloop.swf?clip_id=4548135&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>You can install <a href="http://tbuzz.arc90.com">TBUZZ</a> in just a few seconds by visiting:</p>
<h2 style="margin-bottom: 1em;text-align: center"><a href="http://tbuzz.arc90.com">http://tbuzz.arc90.com</a></h2>
<p>If you&#8217;ve got thoughts, feedback or suggestions regarding TBUZZ, feel free to <a href="http://blog.arc90.com/2009/05/introducing_tbuzz.php">leave a comment on the Arc90 blog</a>.</p>
<img src="http://feeds.feedburner.com/~r/Arc90Lab/~4/8MKlLW3TUKA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lab.arc90.com/2009/05/12/tbuzz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://lab.arc90.com/2009/05/12/tbuzz/</feedburner:origLink></item>
		<item>
		<title>Readability</title>
		<link>http://feedproxy.google.com/~r/Arc90Lab/~3/xuzdc3TXgps/</link>
		<comments>http://lab.arc90.com/2009/03/02/readability/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 00:31:37 +0000</pubDate>
		<dc:creator>Andy Lewisohn</dc:creator>
				<category><![CDATA[Experiments]]></category>
		<category><![CDATA[readability arc90 reading web]]></category>

		<guid isPermaLink="false">http://lab.daniell.acr90-dev-02/2009/03/02/readability/</guid>
		<description><![CDATA[<p><em>Update February 1, 2011:</em> Readability has launched as <a href="http://www.readability.com">a full-blown reading platform</a> that delivers a great reading experience provides a mechanism for supporting writers and publishers. <br /><a href="http://www.readability.com">Read More»</a></p>

<p>You can still view the <a href="http://www.readability.com">original post that started it all»</a></p>]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>Update:</strong> On February 1, 2011, Readability was re-launched into a full-fledged reading platform that includes mobile support, queuing articles for reading later and a greatly improved reading view. In addition, the platform provides a unique model for supporting publishers and writers through your reading activity. Visit <a href="http://www.readability.com">http://www.readability.com</a> to learn more.</p></blockquote>
<p>Reading anything on the Internet has become a full-on nightmare. As media outlets attempt to eke out as much advertising revenue as possible, we&#8217;re left trying to put blinders on to mask away all the insanity that surrounds the content we&#8217;re trying to read.</p>
<p>It&#8217;s almost like listening to talk radio, except the commercials <em>play during </em>the program in the background. It&#8217;s a pretty awful experience. Our friend to date has been the trusty &#8220;Print View&#8221; button. Click it and all the junk goes away. I click it all the time and rarely print. It&#8217;s really become the &#8220;Peace &amp; Quiet&#8221; button for many.</p>
<p>Recently, <a href="http://www.aworkinglibrary.com/">Mandy Brown</a> wrote a wonderful article for A List Apart called <a href="http://alistapart.com/articles/indefenseofreaders"><em>In Defense Of Readers</em></a><em>. </em>It&#8217;s an attempt to awaken designers responsibility to those who <em>read </em>on the Web:</p>
<blockquote><p>Despite the ubiquity of reading on the web, readers remain a neglected audience. Much of our talk about web design revolves around a sense of movement: users are thought to be finding, searching, skimming, looking. We measure how frequently they click but not how long they stay on the page. We concern ourselves with their travel and participation&#8211;how they move from page to page, who they talk to when they get there&#8211;but forget the needs of those whose purpose is to be still. Readers flourish when they have space&#8211;some distance from the hubbub of the crowds&#8211;and as web designers, there is yet much we can do to help them carve out that space.</p></blockquote>
<p>Mandy is spot on &#8211; and her concerns are even more salient in today&#8217;s cram-all-the-ads-on-one-page Web.</p>
<p>In response to all this madness, we&#8217;d like to introduce <em>Readability:</em></p>
<p><a href="http://vimeo.com/3445774">Readability : An Arc90 Lab Experiment</a> from <a href="http://vimeo.com/arc90">Arc90</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Readability is a browser bookmarklet (sort of like a bookmark on steroids). You can install Readability by visiting the Readability setup page:</p>
<p><a title="http://lab.arc90.com/experiments/readability/" href="http://lab.arc90.com/experiments/readability/"><strong>http://lab.arc90.com/experiments/readability/</strong></a></p>
<p>Readability works with most major modern browsers and has been tested on many news sites and blogs. It isn&#8217;t 100% effective but works surprisingly well.</p>
<p>Our latest experiment was partly inspired by <a href="http://www.marco.org/">Marco Arment&#8217;s</a> awesome <a href="http://www.instapaper.com">Instapaper</a> application (and equally awesome Instapaper iPhone app). We hope you enjoy this little tool. If you find any issues, feel free to <a href="http://blog.arc90.com/2009/03/shhh_im_trying_to_read.php">comment on our blog</a>.</p>
<p>If you&#8217;d like to keep track of Readability and other experiments that may escape out of our lab, be sure to subscribe to our RSS feeds for the <a href="http://feeds.feedburner.com/arc90lab">lab</a> and <a href="http://feeds.feedburner.com/arc90blog">blog</a> or <a href="http://twitter.com/arc90">follow us on Twitter</a> for announcements.</p>
<p>The Readability code (including setup pages and supporting assets) is <a href="http://code.google.com/p/arc90labs-readability/">available on Google Code</a>.</p>
<p><strong>Readability is licensed under the </strong><a href="http://www.apache.org/licenses/LICENSE-2.0"><strong>Apache License, Version 2.0</strong></a><strong>.</strong></p>
<img src="http://feeds.feedburner.com/~r/Arc90Lab/~4/xuzdc3TXgps" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lab.arc90.com/2009/03/02/readability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://lab.arc90.com/2009/03/02/readability/</feedburner:origLink></item>
		<item>
		<title>ActionScript XML Binding</title>
		<link>http://feedproxy.google.com/~r/Arc90Lab/~3/mPeywAFHx50/</link>
		<comments>http://lab.arc90.com/2009/02/12/actionscript-xml-binding/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 22:22:02 +0000</pubDate>
		<dc:creator>Arc90</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://lab.daniell.acr90-dev-02/2009/02/12/actionscript-xml-binding/</guid>
		<description><![CDATA[<p>&#8230; converting to and from XML is an often laborious, and certainly tedious, task.</p>]]></description>
			<content:encoded><![CDATA[<p>Working with XML in ActionScript has been made pretty simple by E4X. But many developers prefer to work with ActionScript objects rather than straight XML. Unfortunately, converting to and from XML is an often laborious, and certainly tedious, task. Java developers may be familiar with Java Architecture for XML Binding (<a href="https://jaxb.dev.java.net/">JAXB</a>) and will quickly note that it was the inspiration for ActionScript XML Biinding (ASXB). </p>
<p>ASXB is a concrete implementation of XML binding that used custom metadata as the means of annotation. This is the 0.1 release of ASXB and so it&#8217;s fairly rough around the edges and is intended to test the waters, so to speak, of the ActionScript developer community. If the ASXB project seems like it might be of use in your development, please comment on it over in <a href="http://blog.arc90.com/2009/02/actionscript_xml_binding.php">the arc90 blog</a>.</p>
<hr />
<ul>
<li><a href="#what">What is this?</a>
<li><a href="#how">How do I use it?</a>
<li><a href="#documentation">Documentation</a>
<li><a href="#licensing">Licensing</a>
<li><a href="#blog">Discuss <em>ActionScript XML Binding</em></a> </li>
</ul>
<h4 id="what">What is this?</h4>
<p>The ActionScript XML Binding (ASXB) project is intended to make the marshalling/unmarshalling of XML/ActionScript objects a much easier task. It&#8217;s a small library that allows a developer to use custom metadata to annotate his/her ActionScript objects for seamless marshalling and unmarshalling.</p>
</p>
<h4 id="how">How Do I Use It?</h4>
<p>To use <i>ASXB</i> in your Flex project, just follow these simple steps:</p>
<h5 id="one">Download The Code</h5>
<div class="howtouse">
<p>Click on the icon below to download the source code:</p>
<p><a href="http://www.arc90.com/_assets/asxb/asxb-0.1-with-dependencies.zip"><img alt="Download" src="http://arc90.com/_img/download.gif"></a>
<p>The file contains everything required to build the ASXB project, as well as a compiled release of the ASXB.swc.</p>
</div>
<h5 id="two">Add the code to your Flex or AIR project</h5>
<div class="howtouse">
<p>You can either add the compiled library, ASXB.swc, to your project&#8217;s library path, or include the source directly in your project. </p>
</div>
<h5 id="three">Add compiler settings</h5>
<div class="howtouse">
<p>Copy flex-config-template.xml to your project and change the name to flex-config.xml. Add the following compiler setting: -load-config+=&lt;path-to-config&gt;/flex-config.xml</p>
</div>
<h5 id="four">Annotate your ActionScript objects</h5>
<div class="howtouse">
<p>Below is a <i>very</i> basic example of an annotated object.</p>
<p>
<pre name="code" class="java">	[XmlRootElement(name="book")] 	public class Book 	{ 		[XmlAttribute(name="authorFullName")] 		public var author:String; 		 		[XmlAttribute] 		public var dateOfPublication:Date; 		 		[XmlAttribute(name="pageCount")]  		public var pages:int; 		 		[XmlElement] 		public var title:String; 		 		... 	} </pre>
</p>
<p>The above object maps to the following XML snippet. When the name of an annotated member is the same as the corresponding XML element or attribute, no name key/value pair is required.</p>
<p>
<pre name="code" class="xml" rows="5" cols="60">	&lt;book authorFullName="Alastair Reynolds" dateOfPublication="2003-5-27" pageCount="704"&gt; 		&lt;title&gt;Chasm City&lt;/title&gt; 	&lt;/book&gt; </pre>
</p>
</div>
<h5 id="five">Create an instance of <i>XMLService</i> using either MXML or ActionScript.</h5>
<div class="howtouse">
<p>MXML:</p>
<p>
<pre name="code" class="java" rows="5" cols="60">	&lt;arc90:XMLService id="service" url="http://example.url/service/" fault="faultHandler(event)" result="resultHandler(event)"/&gt;   </pre>
</p>
<p>ActionScript:</p>
<p>
<pre name="code" class="java" rows="5" cols="60">	import org.orpheus.xml.bind.XMLService; 	 	var service:XMLService = new XMLService(); 	service.url = "http://example.url/service/" 	service.addEventListener(FaultEvent.FAULT, faultHandler); 	service.addEventListener(ResultEvent.RESULT, resultHandler);   </pre>
</p>
</div>
<h5 id="six"><i>XMLService</i> functions <i>exactly</i> like mx.rpc.http.HTTPService</h5>
<div class="howtouse">
<p>To send data to a service just call send, passing an ActionScript object as the parameter, or by setting the request property.</p>
<p>
<pre name="code" class="java" rows="5" cols="60">	var book:Book = new Book(); 	book.author = "Alastair Reynolds"; 	book.title = "Chasm City"; 	 	service.send(book); 	 	// or 	 	service.request = book; 	service.send(); </pre>
</p>
<p>Any data returned as a result of a service call will be automatically unmarshalled into the appropriate data type. It is accessible via the result property of the ResultEvent object.</p>
<p>
<pre name="code" class="java" rows="5" cols="60">	private function resultHandler(event:ResultEvent):void 	{ 		var book:Book = event.result as Book; 		 		trace("You have retrieved " + book.title + " by " + book.author + "."); 		// OUTPUT: You have retrieved Chasm City by Alastair Reynolds.	 	} </pre>
</p>
</div>
<h4 id="documentation">Documentation</h4>
<p>Review the complete <a href="http://www.arc90.com/_assets/asxb/docs/index.html">documentation</a> for a full list of all properties, methods, and annotations of the <i>ActionScript XML Binding</i> project.</p>
<h4 id="licensing">Licensing</h4>
<p>This arc90 tool is licensed under the <a href="http://www.opensource.org/licenses/bsd-license.php">BSD license</a></p>
<h4 id="blog">Discuss <i>ActionScript XML Binding</i></h4>
<p>You can offer feedback on <i>ActionScript XML Binding</i> at the <a href="http://blog.arc90.com/2009/02/actionscript_xml_binding.php">arc90 blog</a>.</p>
<img src="http://feeds.feedburner.com/~r/Arc90Lab/~4/mPeywAFHx50" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lab.arc90.com/2009/02/12/actionscript-xml-binding/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://lab.arc90.com/2009/02/12/actionscript-xml-binding/</feedburner:origLink></item>
		<item>
		<title>Best Buy Remix API client (PHP)</title>
		<link>http://feedproxy.google.com/~r/Arc90Lab/~3/TBsYv_QhtqY/</link>
		<comments>http://lab.arc90.com/2009/02/06/best-buy-remix-api-client-php/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 15:29:18 +0000</pubDate>
		<dc:creator>Arc90</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://lab.daniell.acr90-dev-02/2009/02/06/best-buy-remix-api-client-php/</guid>
		<description><![CDATA[<p>BestBuy Remix API Client is a PHP library for placing HTTP calls to the <a href="http://remix.bestbuy.com/">Best Buy Remix</a> API.</p>]]></description>
			<content:encoded><![CDATA[<p>Best Buy has opened up its retail catalog in hopes that innovative developers will help to expand the company&#8217;s online presence. <a href="http://remix.bestbuy.com/" target="_blank">Best Buy Remix</a> (currently in Beta) exposes information about Best Buy products and stores.</p>
<p>Interested? <a href="http://remix.bestbuy.com/apps/register" target="_blank">Apply for an API key</a>, download the PHP client library and get started!</p>
<hr />
<ul>
<li><a href="#what">What is this?</a></li>
<li><a href="#how">How do I use it?</a></li>
<li><a href="#documentation">Documentation</a></li>
<li><a href="#licensing">Licensing</a></li>
<li><a href="#blog">Discuss <em>Best Buy Remix API Client</em></a></li>
</ul>
<h4 id="what">What is this?</h4>
<p>BestBuy_Service_Remix is a PHP library for placing HTTP calls to the <a href="http://remix.bestbuy.com/">Best Buy Remix</a> API.</p>
<h4 id="how">How Do I Use It?</h4>
<p>To use <em>BestBuy_Service_Remix</em> in your PHP project, just follow these simple steps:</p>
<h5 id="one">Download The Code From Google Code</h5>
<div class="howtouse">
<p>Click on the icon below to go get the source from Google Code:</p>
<p><a href="http://code.google.com/p/bestbuy-service-remix/"><br />
<img alt="Download" src="http://arc90.com/_img/download.gif" /><br />
</a></p>
<p>The most recent download will contain source code, usage instructions, and <a href="http://www.phpdoc.org/">documentation</a>.</p>
</div>
<h5 id="two">Add the code to your PHP project </h5>
<div class="howtouse">
<p>You&#8217;ll need to add the contents of the &#8216;lib&#8217; folder to <a href="http://www.php.net/set_include_path">your include path</a>.</p>
</div>
<h5 id="three">Create a <em>BestBuy_Service_Remix</em> API client with a valid API key</h5>
<div class="howtouse">
<p><pre name="code" class="php">
&lt;?php
require_once('BestBuy/Service/Remix.php');
$remix = new BestBuy_Service_Remix('YourApiKey');
</pre>
</p>
</div>
<h5 id="four"><em>BestBuy_Service_Remix</em> returns a response object containing API response data <strong>and</strong> <a href="http://www.php.net/manual/en/function.curl-getinfo.php">HTTP metadata</a> recorded by cURL</h5>
<div class="howtouse">
<p>Data may be requested in either XML (default) or JSON format.</p>
<p><pre name="code" class="php">
&lt;?php
require_once('BestBuy/Service/Remix.php');
$remix = new BestBuy_Service_Remix('YourApiKey');
// Retrieve a list of Movies containing the text "Bat"
$result = $remix-&gt;products(array('name=bat*','type=Movie'))-&gt;query();
if(!$result-&gt;isError())
{
echo $result;
}
else if(403 != $result-&gt;http_code)
{
// API errors result in an error document with detailed info
echo $result-&gt;toSimpleXml()-&gt;message;
}
else
{
// 403 errors do not contain a full document, only an h1 message
echo $result-&gt;toSimpleXml()-&gt;h1;
}
</pre>
</p>
</div>
<h4 id="documentation">Documentation</h4>
<p>Complete documentation is included with each download in the &#8216;docs&#8217; folder.</p>
<h4 id="licensing">Licensing</h4>
<p>This library is licensed under a <a href="http://www.opensource.org/licenses/bsd-license.php">BSD</a> license.</p>
<h4 id="blog">Discuss</h4>
<p>Share your thoughts, or just let us know what you&#8217;re up to over at <a href="http://blog.arc90.com/2009/02/best_buy_remix_big_retail_open.php">the Arc90 blog</a>.</p>
<img src="http://feeds.feedburner.com/~r/Arc90Lab/~4/TBsYv_QhtqY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lab.arc90.com/2009/02/06/best-buy-remix-api-client-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://lab.arc90.com/2009/02/06/best-buy-remix-api-client-php/</feedburner:origLink></item>
		<item>
		<title>SqlWatcher: Ad-hoc database change monitoring</title>
		<link>http://feedproxy.google.com/~r/Arc90Lab/~3/V6GlDspg5X8/</link>
		<comments>http://lab.arc90.com/2009/02/05/sqlwatcher-ad-hoc-database-change-monitoring/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 14:48:14 +0000</pubDate>
		<dc:creator>Arc90</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://lab.daniell.acr90-dev-02/2009/02/05/sqlwatcher-ad-hoc-database-change-monitoring/</guid>
		<description><![CDATA[<p>How many times have you needed to debug an application and wished, just wished, you had put better &#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>How many times have you needed to debug an application and wished, just wished, you had put better instrumentation in your code? It would have been brilliant if you had logged the key database fields before and after the update. It would have been killer if you had recognized exactly which rows and columns were in play and had a way of confirming that your stored proc is doing what you thought it would.</p>
<p>But you didn&#8217;t.</p>
<p><span id="more-47"></span></p>
<p>Your app has no logging at all, and you have no ability to see what&#8217;s happening in real-time other than firing up ol&#8217; SQL Server Management Studio and attempting to run queries before and after every action in your app. Now there is a better way.</p>
<ul class="contents">
<li><a href="#what">What is this?</a>
</li>
<li><a href="#how">How do I use it?</a>
</li>
<li><a href="#documentation">Documentation</a>
</li>
<li><a href="#download">Download the code</a>
</li>
<li><a href="#licensing">Licensing</a>
</li>
<li><a href="#discuss">Discuss</a> </li>
</ul>
<h4 id="what">What is this?</h4>
<p>SqlWatcher lets you use your web browser to query a SQL Server 2005/2008 database. Big deal so far. But after returning your results to you, SqlWatcher watches the database and notifies you instantly when your query results change, re-running your query and appending the latest results to your web browser as needed.</p>
<p><b>SqlWatcher does not poll for changes</b>, nor does it leave a database connection open, both of which could hammer your database performance. It uses the power of SQL Server&#8217;s <a href="http://msdn.microsoft.com/en-us/library/ms130764.aspx" target="_blank">Query Notifications</a> to let the database engine itself track data changes that would impact your query results. Whether data was added, deleted, or modified, if it touches data that was in your results, or adds new data to it, Query Notifications sees it and pushes a notification out to a <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldependency.aspx" target="_blank">SqlDependency</a> object in SqlWatcher. When SqlWatcher receives a notification, it re-runs your query and appends the latest results to your web browser, allowing you to see your query&#8217;s results before and after every database change.</p>
<p>Query Notifications relies on SQL Server&#8217;s <a href="http://msdn.microsoft.com/en-us/library/ms345108.aspx" target="_blank">Service Broker</a> for reliable asynchronous delivery of these notifications to clients such as SqlWatcher. As a result, Service Broker must be enabled on the database you are trying to watch. If it&#8217;s not, SqlWatcher will attempt to run </p>
<pre>ALTER DATABASE yourdatabase SET ENABLE_BROKER</pre>
<p> beforehand, and
<pre>ALTER DATABASE yourdatabase SET DISABLE_BROKER</pre>
<p> afterwards, but you will need to provide administrator-level credentials in the connection string for this to work.</p>
<h4 id="how">How do I use it?</h4>
<ol>
<li><a href="#download">Download</a> SqlWatcher</li>
<li>Unzip the /distribution folder to a new folder named /SqlWatcher on your web server and create a new application in IIS MMC</li>
<li>Point your browser to http://(your server)/SqlWatcher</li>
<li>Enter the server, database, login, and password to connect to your database</li>
<li>Enter a SELECT query, or a stored procedure call that performs a SELECT. See <a href="http://msdn.microsoft.com/en-us/library/aewzkxxh.aspx" target="_blank">Special Considerations Using Query Notifications (ADO.NET)</a> for the fine print, but wildcards are forbidden and table names must use two-part names. In other words,
<pre>SELECT * FROM customers WHERE last_name LIKE 'Pot%'</pre>
<p> will fail, but
<pre>SELECT id, first_name, last_name FROM dbo.customers WHERE last_name LIKE 'Pot%'</pre>
<p> will work.</li>
<li>Enter the number of updates you wish to see, or 0 for unlimited. Your browser will automatically append each database update as it occurs until Max Notifications is received or you hit ESC in your browser, at which point SqlWatcher will automatically clean up.</li>
<li>Run your application. As you make changes, SqlWatcher will add more data snapshots to your browser. For clarity my example client code is extremely bare-bones, so feel free to fancy it up with some AJAX.</li>
</ol>
<h4 id="documentation">Documentation</h4>
<p>Source code is fully documented. <a href="http://www.codeproject.com/KB/database/chatter.aspx" target="_blank">CodeProject: Using SqlDependency for data change events</a> provides an excellent introduction to, and concrete examples of, working with the SqlDependency class, and was instrumental in getting SqlWatcher operational. SqlWatcher was written in C# in Visual Studio 2008 and requires ASP.NET 2.0. It has no database of its own but can watch any SQL Server 2005/2008 database with Service Broker enabled, or can enable it automatically with an admin-level connection string.</p>
<h4 id="download">Download the code</h4>
<p>Click on the icon to go to the download directory then select the latest version:<br />
<a href="http://code.google.com/p/sqlwatcher/downloads/list"><img alt="Download" src="http://arc90.com/_img/download.gif" /></a></p>
<h4 id="licensing">Licensing</h4>
<p>This arc90 tool is licensed under the <a href="http://www.opensource.org/licenses/bsd-license.php" target="_blank">BSD license</a>.</p>
<h4 id="discuss">Discuss</h4>
<p>Feel free to offer feedback on the <a href="http://blog.arc90.com/2009/02/sqlwatcher_adhoc_database_chan.php">blog</a>, or feature requests/bugs on <a href="http://code.google.com/p/sqlwatcher/issues/list" target="_blank">Google Code</a>.</p>
<img src="http://feeds.feedburner.com/~r/Arc90Lab/~4/V6GlDspg5X8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lab.arc90.com/2009/02/05/sqlwatcher-ad-hoc-database-change-monitoring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://lab.arc90.com/2009/02/05/sqlwatcher-ad-hoc-database-change-monitoring/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.428 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-01-19 16:53:04 -->

