<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Pathfinder Development » Agile Ajax</title>
	
	<link>http://www.pathf.com/blogs</link>
	<description>Running commentary about agile development, user experience design and Ajax.</description>
	<pubDate>Fri, 10 Oct 2008 20:33:45 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/AgileAjax" type="application/rss+xml" /><feedburner:emailServiceId>345210</feedburner:emailServiceId><feedburner:feedburnerHostname>http://www.feedburner.com</feedburner:feedburnerHostname><item>
		<title>Roles Testing For Security</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/417136186/</link>
		<comments>http://www.pathf.com/blogs/2008/10/roles-testing-for-security/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 20:32:28 +0000</pubDate>
		<dc:creator>Noel Rappin</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1193</guid>
		<description><![CDATA[






	Flickr Image By Darwin Bell



Every web site that has some concept of user login also has some concept of user roles. Administrators have special editing access or behind the scenes report views. Users with different relationships have different ability to view the other user's data, and so on. In my experience, every site's requirements along [...]]]></description>
			<content:encoded><![CDATA[<div class="right">
<a href="http://www.flickr.com/photos/darwinbell/406208791/"><br />
<img src="http://www.pathf.com/blogs/wp-content/uploads/2008/10/dcd23057-ca39-4d2a-a17e-2190fb80c9a7.jpg" alt="Flickr Image By Darwin Bell" border="0" width="234" height="240" class="right"/><br />
</a><br />
<br clear="all"/><br />
<span class="right" style="font-size: smaller"><br />
<a href="http://www.flickr.com/photos/darwinbell/406208791/"><br />
	Flickr Image By Darwin Bell<br />
</a><br />
</span>
</div>
<p>Every web site that has some concept of user login also has some concept of user roles. Administrators have special editing access or behind the scenes report views. Users with different relationships have different ability to view the other user's data, and so on. In my experience, every site's requirements along this line are just different enough that a one-size-fits all plugin approach to roles never quite works.</p>
<p>That said, there are some common principles that I've found helpful in implementing roles and security.</p>
<p><span id="more-1193"></span></p>
<h3>When blocking entire controller actions, use filters</h3>
<p>This one should be pretty familiar, since the restful_authentication plugin recommends placing <code>before_filter :login_required</code> at the top of any controller that requires the user to be logged in. Similarly, you'll want something like <code>before_filter :admin_required, :only => [:create]</code> for the controller actions that require administrative users.</p>
<p>Before filters are simple and powerful. It's also very easy to forget to add a new action to the <code>:only</code> list (especially for non-RESTful controllers). So, be sure and test with something like this, assuming that <code>logged_in?</code> and the home controller are defined.</p>
<pre class="ruby">&nbsp;
should <span style="color:#996600;">&quot;not let regular users see the edit page&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  login_as <span style="color:#ff3333; font-weight:bold;">:normal_user</span>
  post <span style="color:#ff3333; font-weight:bold;">:create</span>
  assert <span style="color:#9966CC; font-weight:bold;">not</span> logged_in?
  assert_redirected_to <span style="color:#ff3333; font-weight:bold;">:controller</span> =&gt; <span style="color:#996600;">&quot;home&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:action</span> =&gt; <span style="color:#996600;">&quot;index&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>Note this test also asserts that a user who tries to access a forbidden page is logged out. You probably also want to test for the case where nobody is logged in -- at least where the functionality isn't already covered by restful_authentication or whatever login package you are using.</p>
<p>Also, the Footnotes plugin contains a tab for checking all the filters called on a given request, which is very helpful when trying to debug weird behavior.</p>
<h3>When blocking part of a page, try a block helper</h3>
<p>Another common role based security need is to only expose part of a page to a particular user role. For instance, only an administrator or the actual poster can edit a forum post. What I like to do here is combine partials and block helpers, with a helper that looks like this:</p>
<pre class="ruby">&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> if_current_admin
  <span style="color:#9966CC; font-weight:bold;">yield</span> <span style="color:#9966CC; font-weight:bold;">if</span> current_user.<span style="color:#9900CC;">admin</span>?
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>And an ERb file that looks like this:</p>
<pre class="ruby">&nbsp;
&lt;% if_current_admin %&gt;
  &lt;%= render <span style="color:#ff3333; font-weight:bold;">:partial</span> =&gt; admin_edit_content %&gt;
&lt;% <span style="color:#9966CC; font-weight:bold;">end</span> %&gt;
&nbsp;</pre>
<p>(Alternately, if the partial is always going to be restricted, the if statement could go in the partial).</p>
<p>Unfortunately, if you have if/else functionality, the block helper is less pretty because you wind up with something like this:</p>
<pre class="ruby">&nbsp;
&lt;% if_current_admin %&gt;
  &lt;%= render <span style="color:#ff3333; font-weight:bold;">:partial</span> =&gt; admin_content %&gt;
&lt;% <span style="color:#9966CC; font-weight:bold;">end</span> %&gt;
&lt;% unless_current_admin %&gt;
  &lt;%= render <span style="color:#ff3333; font-weight:bold;">:partial</span> =&gt; user_content %&gt;
&lt;% <span style="color:#9966CC; font-weight:bold;">end</span> %&gt;
&nbsp;</pre>
<p>Which is a lot less nice than:</p>
<pre class="ruby">&nbsp;
&lt;% <span style="color:#9966CC; font-weight:bold;">if</span> current_admin? %&gt;
  &lt;%= render <span style="color:#ff3333; font-weight:bold;">:partial</span> =&gt; admin_content %&gt;
&lt;% <span style="color:#9966CC; font-weight:bold;">else</span> %&gt;
  &lt;%= render <span style="color:#ff3333; font-weight:bold;">:partial</span> =&gt; user_content %&gt;
&lt;% <span style="color:#9966CC; font-weight:bold;">end</span> %&gt;
&nbsp;</pre>
<p>The advantage of moving all this stuff into guarded partials it it keeps your main page somewhat clean and makes it easier to figure out what's going on.</p>
<h3>Use negative assert_select testing</h3>
<p>When doing a guarded view block like the ones above, you also should test to make sure that the correct content is displayed and that the incorrect content is not displayed. The <code>assert_select</code> function lets you assert that content is <strong>not</strong> in a result, which is helpful.</p>
<p>Let's say you have two tests, and assume that everything's been defined properly:</p>
<pre class="ruby">&nbsp;
should <span style="color:#996600;">&quot;show admins the administrative content&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  login_as users<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:admin</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  get show, <span style="color:#ff3333; font-weight:bold;">:id</span> =&gt; thing<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:one</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  assert_select <span style="color:#996600;">&quot;div#admin_only_content&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
should <span style="color:#996600;">&quot;show users the user only content&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  login_as users<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:normal_user</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  get show, <span style="color:#ff3333; font-weight:bold;">:id</span> =&gt; thing<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:one</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  assert_select <span style="color:#996600;">&quot;div#user_only_content&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>The tests would still pass even if the user gets the <code>admin_only_content</code> div. You can avoid that potential problem by using the <code>:count</code> option of <code>assert_select</code> like so:</p>
<pre class="ruby">&nbsp;
should <span style="color:#996600;">&quot;show admins the administrative content&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  login_as users<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:admin</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  get show, <span style="color:#ff3333; font-weight:bold;">:id</span> =&gt; thing<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:one</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  assert_select <span style="color:#996600;">&quot;div#admin_only_content&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:count</span> =&gt; <span style="color:#006666;">1</span>
  assert_select <span style="color:#996600;">&quot;div#user_only_content&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:count</span> =&gt; <span style="color:#006666;">0</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
should <span style="color:#996600;">&quot;show users the user only content&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  login_as users<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:normal_user</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  get show, <span style="color:#ff3333; font-weight:bold;">:id</span> =&gt; thing<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:one</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  assert_select <span style="color:#996600;">&quot;div#admin_only_content&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:count</span> =&gt; <span style="color:#006666;">0</span>
  assert_select <span style="color:#996600;">&quot;div#user_only_content&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:count</span> =&gt; <span style="color:#006666;">1</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>In the second batch of tests, you are explicitly asserting that the incorrect DOM element is not in the output. This is a very handy feature when testing for behavior under different roles, I use this all the time.</p>
<h3>Put active record guards in the model</h3>
<p>Eventually, the question of whether active record content can be saved by a particular user is a business logic question that should be handled by the model layer. I don't think this can be made totally goof-proof (you might be able to do something with callbacks, but I haven't hit on the magic words yet). However, you can promote an API that makes it easier for your development team to do the right thing:</p>
<pre class="ruby">&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">create_from_params_if_user_can</span><span style="color:#006600; font-weight:bold;">&#40;</span>current_user, params = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">user_can_create</span><span style="color:#006600; font-weight:bold;">&#40;</span>current_user<span style="color:#006600; font-weight:bold;">&#41;</span>
  create<span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>From the controller, this would look like:</p>
<pre class="ruby">&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> create
  Thing.<span style="color:#9900CC;">create_from_params_if_user_can</span><span style="color:#006600; font-weight:bold;">&#40;</span>current_user, params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:thing</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>Putting a guard in the ActiveRecord class may seem redundant, if you have a good before filter in place, then the create method will only be called by valid users. However, as your application gets more complicated, the <code>create</code> method may be called by different user types, each with different rights to do different actions. Alternately, Thing objects might be created from other places. Keeping the actual model rights logic in the model makes it easier to keep the logic clear and straight. </p>
<h3>Don't take inputs for granted</h3>
<p>Even in cases where the user ID might be passed back via a form or URL parameter, you still should use the stored session current user to determine rights (with the obvious exception of the actual login where you are authenticating with a password). You want to prevent somebody from hijacking the session by passing in the parameter of a user with more or different rights. </p>
<p>Along the same lines, when checking for objects via a relationship, always check via the association proxy. That is, do this:</p>
<pre class="ruby">&nbsp;
current_user.<span style="color:#9900CC;">articles</span>.<span style="color:#9900CC;">find_by_active</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;</pre>
<p>And not this:</p>
<pre class="ruby">&nbsp;
Articles.<span style="color:#9900CC;">find_by_user_id_and_active</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:user_id</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;</pre>
<p>This limits the ability of a user to URL surf.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=ljhuM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=ljhuM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=TQSuM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=TQSuM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=kKzQM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=kKzQM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=vcbbm"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=vcbbm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=mK4um"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=mK4um" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/417136186" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/10/roles-testing-for-security/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/10/roles-testing-for-security/</feedburner:origLink></item>
		<item>
		<title>Blackbird takes the pain out of JavaScript logging</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/415903034/</link>
		<comments>http://www.pathf.com/blogs/2008/10/blackbird-takes-the-pain-out-of-javascript-logging/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 16:23:06 +0000</pubDate>
		<dc:creator>Brian Dillard</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[Javascript]]></category>

		<category><![CDATA[Javascript Libraries]]></category>

		<category><![CDATA[logging]]></category>

		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1190</guid>
		<description><![CDATA[
I'm excited to announce the arrival of Blackbird, an open-source JavaScript logging and profiling utility written by G. Scott Olson, a former colleague from my days at Orbitz Worldwide. 
A previous iteration of Blackbird provided no-nonsense, cross-browser logging on a variety of projects within Orbitz. Since that iteration, known as jsLogger, Scott has re-written the [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://www.pathf.com/blogs/wp-content/uploads/2008/10/blackbird.jpg'><img src="http://www.pathf.com/blogs/wp-content/uploads/2008/10/blackbird.jpg" alt="Blackbird screenshot" title="Blackbird" width="300" height="162" class="right" /></a></p>
<p>I'm excited to announce the arrival of <a class="b" href="http://www.gscottolson.com/blackbirdjs/">Blackbird</a>, an open-source JavaScript logging and profiling utility written by <a href="http://www.gscottolson.com/">G. Scott Olson</a>, a former colleague from my days at Orbitz Worldwide. </p>
<p>A previous iteration of Blackbird provided no-nonsense, cross-browser logging on a variety of projects within Orbitz. Since that iteration, known as jsLogger, Scott has re-written the code from the ground up; provided tons of useful new features, including custom namespacing and a spiffy new graphical interface; and released it under an MIT license.</p>
<p>Why, you might ask, in the age of Firebug, would anybody need a JavaScript logging utility? Simple:</p>
<ul>
<li>Blackbird works in a wide variety of modern browsers. Write one style of log statement for every browser.</li>
<li>Blackbird can be deployed to production. By stubbing out its public API with empty functions, you can leave your log statements in production code. (I'm not endorsing this approach to code maintenance, just pointing out that Blackbird makes it easy.)</li>
<li>Blackbird does one thing and does it well. It's not a debugger, it's just a logger and profiler.</li>
<li>Blackbird doesn't interfere with Firebug's <code>console.log</code> utility, but it does improve on its interface. You can hide or show the Blackbird modal with a single, customizable keystroke. You can also choose from four levels of logging (debug, info, warning and error) and atomically toggle their visibility within the console.</li>
</ul>
<p>The <a href="http://code.google.com/p/blackbirdjs/">Blackbird project now lives at Google Code</a>, where you can download it and learn about how to contribute.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=ErWOM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=ErWOM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=47sjM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=47sjM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=xzinM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=xzinM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=EcdTm"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=EcdTm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=oVATm"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=oVATm" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/415903034" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/10/blackbird-takes-the-pain-out-of-javascript-logging/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/10/blackbird-takes-the-pain-out-of-javascript-logging/</feedburner:origLink></item>
		<item>
		<title>Making GWT JSON not Quite so Painful</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/414212396/</link>
		<comments>http://www.pathf.com/blogs/2008/10/making-gwt-json-not-quite-so-painful/#comments</comments>
		<pubDate>Tue, 07 Oct 2008 22:25:41 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[GWT]]></category>

		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1189</guid>
		<description><![CDATA[I've been using GWT to resurface interfaces of a variety of legacy applications -- J2EE, PHP, Rails -- and more often than not that means working with JSON returned from the server. One thing that I've found is that GWT's JSON support is kind of chatty. That is, you have to write a bunch of [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pathf.com/blogs/wp-content/uploads/2008/06/gwt.png"><img class="alignright size-full wp-image-952" style="float: right;" title="gwt" src="http://www.pathf.com/blogs/wp-content/uploads/2008/06/gwt.png" alt="" width="130" height="125" /></a>I've been using GWT to resurface interfaces of a variety of legacy applications -- J2EE, PHP, Rails -- and more often than not that means working with JSON returned from the server. One thing that I've found is that GWT's JSON support is kind of chatty. That is, you have to write a bunch of code like this:</p>
<pre class="java5">JSONValue root = JSONParser.<span style="color: #006600;">parse</span><span style="color: #66cc66;">&#40;</span>json<span style="color: #66cc66;">&#41;</span>;
JSONObject obj = root.<span style="color: #006600;">isObject</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>obj != <span style="color: #b13366;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    JSONValue map = obj.<span style="color: #006600;">get</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;map&quot;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>map != <span style="color: #b13366;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        JSONArray arr = map.<span style="color: #006600;">isArray</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>arr != <span style="color: #b13366;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>arr.<span style="color: #006600;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> &gt; <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                JSONValue strval = arr.<span style="color: #006600;">get</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
                <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>strval != <span style="color: #b13366;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                    JSONString str = strval.<span style="color: #006600;">isString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
                    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>str != <span style="color: #b13366;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                        <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><span style="color: #aaaadd; font-weight: bold;">String</span></a> s = str.<span style="color: #006600;">stringValue</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
                        <span style="color: #808080; font-style: italic;">// do something with the string</span>
                    <span style="color: #66cc66;">&#125;</span>
                <span style="color: #66cc66;">&#125;</span>
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>Yikes! Just to get the string in the second array item in the "map" key of the top level object. Truth is, most of the JSON I'm getting back is fairly predictable. And if it's not in that predictable form, it's an error that the client code can't recover from. I'd like to be able to write something like <code>String result = obj.get("map").get(1).stringValue()</code> without having to worry about <code>NullPointerException</code>'s cropping up all over the place.</p>
<p><span id="more-1189"></span></p>
<p>One option is to do what other developers have done, which is to use JNSI to roll out own JSON handling code. But that defeats the purpose of a framework like GWT. I'd rather leverage what's already there than come up with my own code which I'll then have to support.</p>
<p>So I've written up a little helper class called <code>JSONWrapper</code> that lets you do the above style code. It's pretty simple. As it's name suggests, it wraps a <code>JSONValue</code> object and lets you perform selections on it that return other <code>JSONWrapper</code> objects. Thus you can string together the method calls with method chaining (ala JQuery).</p>
<pre class="java5"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> JSONWrapper <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> JSONValue value;
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> JSONWrapper<span style="color: #66cc66;">&#40;</span>JSONValue value<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">value</span> = value;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> JSONValue getValue<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> value;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000000; font-weight: bold;">static</span> JSONWrapper NULL = <span style="color: #000000; font-weight: bold;">new</span> JSONWrapper<span style="color: #66cc66;">&#40;</span><span style="color: #b13366;">null</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">boolean</span> isValid<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #66cc66;">&#40;</span>value != <span style="color: #b13366;">null</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#91;</span>...<span style="color: #66cc66;">&#93;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>If at any point a request results in an invalid value, such as requesting an array index from a non-array, we return a <code>JSONWrapper</code> with <code>null</code> as its value. We reuse the <code>NULL</code> constant to save on some memory.</p>
<pre class="java5">    <span style="color: #000000; font-weight: bold;">public</span> JSONWrapper get<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> index<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>index &lt; <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> NULL;
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>value == <span style="color: #b13366;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> NULL;
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
        JSONArray arr = value.<span style="color: #006600;">isArray</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>arr == <span style="color: #b13366;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> NULL;
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>index &gt;= arr.<span style="color: #006600;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> NULL;
        <span style="color: #66cc66;">&#125;</span>
        JSONValue retval = arr.<span style="color: #006600;">get</span><span style="color: #66cc66;">&#40;</span>index<span style="color: #66cc66;">&#41;</span>;
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>retval == <span style="color: #b13366;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> NULL;
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> JSONWrapper<span style="color: #66cc66;">&#40;</span>retval<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span></pre>
<p>We want to distinguish between <code>JSONNull</code> and our <code>null</code> values, since sometimes the backend will really want to pass a JSON null.</p>
<p>I'll put this up on google code in a day or two. It's just one class (though one I find really useful). Perhaps this shouldn't be a module but rather find a home in another library.</p>
<p>Some other things I've been working on: <code>StringReader</code> for GWT and a simple model Observer/Observable library.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=K5CaM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=K5CaM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=6SmhM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=6SmhM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=tjDLM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=tjDLM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=SygBm"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=SygBm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=N21Rm"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=N21Rm" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/414212396" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/10/making-gwt-json-not-quite-so-painful/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/10/making-gwt-json-not-quite-so-painful/</feedburner:origLink></item>
		<item>
		<title>HTML5, Ajax history management, and The Ajax Experience 2008 Boston</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/413073266/</link>
		<comments>http://www.pathf.com/blogs/2008/10/html5-ajax-history-management-and-the-ajax-experience-2008-boston/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 19:38:24 +0000</pubDate>
		<dc:creator>Brian Dillard</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[Ajax Experience]]></category>

		<category><![CDATA[Ajax history management]]></category>

		<category><![CDATA[events]]></category>

		<category><![CDATA[Javascript]]></category>

		<category><![CDATA[Really Simple History]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1186</guid>
		<description><![CDATA[
The Ajax Experience last week in Boston yielded lots of exciting developments on the Ajax history management front:


My talk itself drew a crowd of 110 people or so despite its 8.10 a.m. start time. I received good questions from the audience and didn't notice too many people heading for the doors when they realized how [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://www.pathf.com/blogs/wp-content/uploads/2008/10/brain-dillard.jpg'><img src="http://www.pathf.com/blogs/wp-content/uploads/2008/10/brain-dillard.jpg" alt="Brian, a.k.a. Brain, Dillard" title="Brian, a.k.a. Brain, Dillard" width="111" height="150" class="right" /></a></p>
<p><a href="http://www.pathf.com/blogs/2008/09/the-ajax-experience-2008-hope-to-see-you-in-beantown/">The Ajax Experience</a> last week in Boston yielded lots of exciting developments on the Ajax history management front:</p>
<ul>
<li>
<p><a href="http://ajaxexperience.techtarget.com/east/html/client.html#BDillardBrowser">My talk itself</a> drew a crowd of 110 people or so despite its 8.10 a.m. start time. I received good questions from the audience and didn't notice too many people heading for the doors when they realized how deep into the nitty-gritty technical details I was getting. Instead of using Keynote or Powerpoint for my slides, I built a basic DHTML application. That way, one artifact could serve as both my content and a demo of <a href="http://code.google.com/p/reallysimplehistory/">Really Simply History</a>, the Ajax history and back-button library I maintain. <a href="http://labs.pathf.com/ajax/tae2008boston/">You can view the application - and the slides - at Pathfinder Labs.</a></p>
</li>
<li>
<p>I did not meet<a href="http://www.pathf.com/blogs/2008/09/a-mea-culpa-and-a-launch-date-for-really-simple-history-08/"> my goal of releasing an alpha of Really Simple History 0.8 in conjunction with the conference</a>. But I did accomplish a ton of work on the library during the build-up to my talk. I'm now hard at work finalizing the alpha and preparing updates to the project's Google Code-hosted homepage.</p>
</li>
<li>
<p>The most exciting Ajax history development was the face time I enjoyed with <a href="http://nathanhammond.com/">Nathan Hammond</a>, creator of <a href="http://trac.nathanhammond.com/jssm">JavaScript State Manager (JSSM)</a>, and <a href="http://www.codinginparadise.org/">Brad Neuberg</a>, original creator of Really Simple History. After my talk we enjoyed an impromptu Ajax back-button summit and hammered out a shared agenda for the future of both my library and the topic in general. I'm pleased to announce that Nathan will be coming on as an RSH co-maintainer with the goal of merging RSH 0.8 and JSSM into a single, stable 1.0 library. I'm also excited that Brad, Nathan and I - plus other authors of Ajax history libraries who wish to participate - will be issuing a position paper on the current history implementation in the HTML 5 spec. Ajax history experts, please <a href="http://www.pathf.com/contact-us/">contact me via Pathfinder</a> if you want to weigh in.</p>
</li>
<li>
<p>As for <a href="http://ajaxexperience.techtarget.com/html/index.html">the conference itself</a>, it was my first time attending The Ajax Experience and I really enjoyed it. The topics were many, varied and well-presented. My favorites included <a href="http://www.crockford.com/">Douglas Crockford</a>'s discussion of JavaScript's good parts, which could have been a simple book promo but turned out to be far more; the panel discussion between the leaders of YUI, Dojo, jQuery and Prototype moderated by the inimitable <a href="http://www.quirksmode.org/book/">PPK</a>; and my colleage Dietrich's <a href="http://www.pathf.com/blogs/2008/10/tae-boston-2008-the-unsexy-presentations/">un-sexy</a> but vital look at <a href="http://ajaxexperience.techtarget.com/east/html/server.html#DKappeGWT">how to resurface J2EE apps for Ajax using the Google Web Toolkit</a>.</p>
<p>I have to say, the crowd here felt like my tribe. The guys running around with the word "JavaScript" shaved into their hair put a smile on my face. Ajax developers are often third-class citizens at other conferences. They're either jammed together with designers and user experience folks, or thrown into the midst of Java and Ruby developers. That wasn't the case here, and I dug it highly.</p>
<p>My least favorite aspect of the conference had nothing to do with the crowd or the content; it was the depressing lack of vegan food. One meal was 90% vegan, but most were 0%. Given the conference center's distance from civilization, it would have been nice if attendees' diverse dietary needs had been taken into consideration. On the plus side, I think I lost five pounds.</p>
</li>
</ul>
<p>Many thanks to the folks from Tech Target for the awesome speaker support. My name, so amusingly misspelled on the monitor outside the ballroom where I spoke, had been corrected by the time I took the podium.</p>
<p>And special thanks to Ben, Dion and everyone at Ajaxian for throwing such a jam-packed event, letting me speak at it, and doing so much for the Ajax community over the years.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=11s1M"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=11s1M" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=Gz99M"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=Gz99M" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=c4yaM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=c4yaM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=DyNcm"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=DyNcm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=DKvkm"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=DKvkm" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/413073266" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/10/html5-ajax-history-management-and-the-ajax-experience-2008-boston/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/10/html5-ajax-history-management-and-the-ajax-experience-2008-boston/</feedburner:origLink></item>
		<item>
		<title>A Look Back At Past Posts</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/410361522/</link>
		<comments>http://www.pathf.com/blogs/2008/10/a-look-back-at-past-post/#comments</comments>
		<pubDate>Fri, 03 Oct 2008 16:09:10 +0000</pubDate>
		<dc:creator>Noel Rappin</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1184</guid>
		<description><![CDATA[Updates to past posts:
TankEngine
Thanks to Gregg and Jason at RailsEnvy for mentioning TankEngine on their podcast. The git repository now has 54 watchers and 3 forks. Thanks, everybody who is watching. I'm hoping for some updates soon.
Plugin testing
This is always what I'm afraid of, I write a big post on something, then a commenter points [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.pathf.com/blogs/wp-content/uploads/2008/10/b785e46e-926a-478f-8f21-3b566d8af521.jpg" alt="B785E46E-926A-478F-8F21-3B566D8AF521.jpg" border="0" width="256" height="256" class="right"/>Updates to past posts:</p>
<h3><a href="http://www.pathf.com/blogs/2008/09/tankengine-new-plugin-for-rails-iphone-development/">TankEngine</a></h3>
<p>Thanks to <a href="http://www.railsenvy.com">Gregg and Jason at RailsEnvy</a> for mentioning TankEngine on their podcast. The <a href="http://github.com/noelrappin/tank-engine/tree/master">git repository</a> now has 54 watchers and 3 forks. Thanks, everybody who is watching. I'm hoping for some updates soon.</p>
<h3><a href="http://www.pathf.com/blogs/2008/09/tips-for-testing-plugins/">Plugin testing</a></h3>
<p>This is always what I'm afraid of, I write a big post on something, then a commenter points out a plugin that already does it reasonably well. In this case, the commenter mentioned <a href="http://github.com/pluginaweek/plugin_test_helper">the plugin_test_helper library</a>, which allows you to pretty easily include a Rails environment inside your plugin for testing. The only problem I had with it is that if you have an actual application has this plugin installed, it seems to do odd things to the environment load -- I wound up limiting the init.rb of the plugin to only do something if the RAILS_ENV was specifically set to test plugins.</p>
<p><span id="more-1184"></span></p>
<h3><a href="http://www.pathf.com/blogs/2008/08/im-cranky-because-im-not-getting-enough-rest/">REST</a></h3>
<p>After being a little cranky about REST a few weeks ago, I wound up doing some much stricter REST development on part of a new project. The one addition I'd like to make to the previous post is that REST is a very useful abstraction for determining when you need to split off functionality into another controller.</p>
<p>In particular, when you start adding methods to an existing controller with names like "add_subfeature" or "list_subfeature" your code is probably trying to tell you to split off to another RESTful controller, where you can call those things "create" and "index". </p>
<p>I should also mention, with respect to the topic of the last post, that it is possible to include Ajax features within the standard REST methods by triggering different respond_to blocks. That works to a point, but can eventually lead to the kind of bloated controller methods that REST was supposed to avoid.</p>
<h3>Project Post-Mortem</h3>
<p>The project that included <a href="http://www.pathf.com/blogs/2008/08/integrating-design-drafts-into-your-rails-app/">integrated design drafts</a>, <a href="http://www.pathf.com/blogs/2008/06/more-named-scope-awesomeness/">named-scope based reporting</a>, and <a href="http://www.pathf.com/blogs/2008/05/html-code-marku/">aggressive markup in the helpers</a> had it's post-mortem this week. It was interesting to see how these sort-of prototype structures worked in the context of the larger team project.</p>
<p>On the plus side, everybody seemed to like the integrated design materials, even with the sort of rickety implementation described in the blog post. The designers liked being able to easily integrate wireframes with actual site material, the programmers liked seeing the wireframes as they were working on the real site.</p>
<p>I think the named-scope stuff was basically liked, but the common Ajax controller that I created to manage it across various resources was, I think, generally understood to be "weird", "non-standard", and "probably not the best way to structure the problem".</p>
<p>The HTML markup in the helper files was not liked very much by the rest of the team. Everybody felt it was kind of hard to find where code was, and also that it was harder to modify than traditional ERb. I still think the mechanism has some use as a replacement for <code>content_tag</code>, but it probably needs to be better integrated with the existing partials system for better usage. So I guess we're still looking for the best way to untangle complicated markup.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=m3pXM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=m3pXM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=B6qJM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=B6qJM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=iICNM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=iICNM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=B3rsm"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=B3rsm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=CfWSm"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=CfWSm" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/410361522" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/10/a-look-back-at-past-post/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/10/a-look-back-at-past-post/</feedburner:origLink></item>
		<item>
		<title>Flash Player on iPhone gossip</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/410223014/</link>
		<comments>http://www.pathf.com/blogs/2008/10/flash-player-on-iphone-gossip/#comments</comments>
		<pubDate>Fri, 03 Oct 2008 12:59:56 +0000</pubDate>
		<dc:creator>Sasha Dzeletovic</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[TechDev]]></category>

		<category><![CDATA[Flash]]></category>

		<category><![CDATA[flash player]]></category>

		<category><![CDATA[Flex]]></category>

		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1181</guid>
		<description><![CDATA[
First thing that came to my mind when I initially heard about the iPhone was the multi-touch possibilities that would start changing the way we create Flash/Flex interfaces (hopefully through SDK extension supporting multi-touch on Adobe's side triggered by iPhone release).
It looked very promising and natural to me in the beginning that this will be [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pathf.com/blogs/wp-content/uploads/2008/10/iphone-flash.jpg"><img class="alignnone size-full wp-image-1182" src="http://www.pathf.com/blogs/wp-content/uploads/2008/10/iphone-flash.jpg" alt="" width="300" height="200" /></a></p>
<p>First thing that came to my mind when I initially heard about the iPhone was the multi-touch possibilities that would start changing the way we create Flash/Flex interfaces (hopefully through SDK extension supporting multi-touch on Adobe's side triggered by iPhone release).</p>
<p>It looked very promising and natural to me in the beginning that this will be the route. Flash is a great part of the Internet experience and iPhone is a great mobile device for, among other things, Internet access.</p>
<p><span id="more-1181"></span></p>
<p>Long time passed, and still all I can find on this topic is gossip.</p>
<p>Ranging from initial optimism:</p>
<p><a href="http://gizmodo.com/gadgets/iphone/iphone-adobe-flash-support-coming-275317.php" target="_blank">iPhone Adobe Flash Support Coming</a><br />
<a href="http://gizmodo.com/gadgets/iphone/iphone-adobe-flash-support-coming-275317.php" target="_blank"></a><a href="http://www.appleinsider.com/articles/07/07/05/mossberg_apple_working_on_adobe_flash_support_for_iphone.html" target="_blank">Mossberg: Apple working on Adobe Flash support for iPhone</a><br />
<a href="http://www.gearlive.com/news/article/q108-flash-on-iphone-is-just-around-the-corner/" target="_blank">Flash on iPhone is just around the corner</a><br />
<a href="http://www.engadget.com/2008/03/19/adobe-says-flash-is-coming-to-the-iphone/" target="_blank"><span>Adobe says Flash is coming to the iPhone</span></a></p>
<p>...to some doubts about the timeline:<br />
<a href="http://www.alleyinsider.com/2008/6/adobe_flash_apple_iphone_maybe_someday" target="_blank">Adobe Flash Coming To Apple's iPhone -- Maybe, Someday</a><br />
<a href="http://www.eribium.org/blog/?p=139" target="_blank">Flash iPhone project stumbles: SDK insufficient</a></p>
<p>...to some doubts about the outcome:<br />
<a href="http://news.cnet.com/8301-10787_3-9886265-60.html" target="_blank">Adobe bites its tongue after iPhone Flash jab</a><br />
<a href="http://www.alleyinsider.com/2008/3/steve_jobs_flash_not_good_enough_for_iphone_is_microsofts_silverlight" target="_blank">Steve Jobs: Flash Not Good Enough For iPhone. Is Microsoft's Silverlight?</a></p>
<p>...to advanced angles on the topic:<br />
<a href="http://daringfireball.net/2008/02/flash_iphone_calculus" target="_blank">Flash on iPhone Political Calculus</a></p>
<p>After all this (and much more) gossip, I came up with the following conclusion: It has never been a better time to learn <span><a href="http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/chapter_1_section_1.html" target="_blank">Objective-C</a>. </span></p>
<p>If the Flash support ever pans out, I will be waiting and ready. In the meantime, it seams like a waiste not to apply all the interface development techniques learned through Flash/Flex development on iPhone and learn something new.</p>
<p>I dare to say that Flash/Flex developers should have an edge on at least the interface logic, and learning a new language should be on everybody's agenda from time to time.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=6yEKM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=6yEKM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=Bi4tM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=Bi4tM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=bHdHM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=bHdHM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=Zi46m"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=Zi46m" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=hiytm"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=hiytm" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/410223014" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/10/flash-player-on-iphone-gossip/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/10/flash-player-on-iphone-gossip/</feedburner:origLink></item>
		<item>
		<title>Microsoft to Jump on Board EC2</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/409464769/</link>
		<comments>http://www.pathf.com/blogs/2008/10/microsoft-to-jump-on-board-ec2/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 17:57:36 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Disruption]]></category>

		<category><![CDATA[Amazon]]></category>

		<category><![CDATA[Cloud Computing]]></category>

		<category><![CDATA[EC2]]></category>

		<category><![CDATA[Editorial]]></category>

		<category><![CDATA[Microsoft]]></category>

		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1179</guid>
		<description><![CDATA[Hold on to your hats; Microsoft has just made a radical change in business model. A couple of months ago I wrote about the competitive advantage that firms using Linux and Amazon's EC2 cloud computing had over their competitors.
Server-on-demand providers like Amazon's EC2, Joyent,
and others have reduced the capital necessary to launch scalable,
server intensive businesses. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pathf.com/blogs/wp-content/uploads/2008/10/screaming.jpg"><img class="alignright size-medium wp-image-1180" style="float: right;" title="screaming" src="http://www.pathf.com/blogs/wp-content/uploads/2008/10/screaming.jpg" alt="" width="199" height="300" /></a>Hold on to your hats; Microsoft has just made a radical change in business model. A couple of months ago I wrote about the <a href="http://www.pathf.com/blogs/2008/05/agile-business/" target="_blank">competitive advantage</a> that firms using Linux and Amazon's EC2 cloud computing had over their competitors.</p>
<blockquote><p>Server-on-demand providers like Amazon's EC2, Joyent,<br />
and others have reduced the capital necessary to launch scalable,<br />
server intensive businesses. Google has just launched a similar<br />
on-demand service, and companies like RightScale and CohesiveFT are building mature businesses around managing EC2 configurations.</p>
<p>...</p>
<p>Facebook applications are just the most extreme example of business initiatives that can be scaled on demand from $70/month on one EC2 server to $10,000/month on many dozens of servers running web, application and database server clusters and farms. Compare that with the old school of investing in a large data center with a significant fraction of the hardware and bandwidth that you might need if your business is a success. What used to cost $100k in capital can now be done with just a few hundreds of dollars.</p>
<p>...</p>
<p>And it's all possible as long as you are using a unix variant - Linux for the most part - to power your apps. So there is a whole class of companies out there using Linux that can out compete their Windows-using rivals - again, the capital they need to launch is much smaller because of cloud computing. That means Linux will win among the class of young entrepreneurial businesses that are so vital to the US economy.</p></blockquote>
<p><span id="more-1179"></span></p>
<p>It seems that Microsoft has spotted this gaping vulnerability and is seeking to close it. From the Amazon <a href="http://aws.amazon.com/windows/">announcement on support for Windows</a> on EC2:</p>
<blockquote><p>Starting later this Fall, Amazon Elastic Compute Cloud (Amazon <span class="caps">EC2</span>) will offer you the ability to run Microsoft Windows Server or Microsoft <span class="caps">SQL</span> Server.</p>
<p>...</p>
<p>Customers <strong>will only pay for as much or little as they actually use</strong>; of course the actual price will be higher than Linux-based instances, due to the cost of Windows licenses. We’ll announce specific pricing when we make the service broadly available later this Fall.</p></blockquote>
<p>Combine this with the announcement earlier this month that you could <a href="http://aws.amazon.com/solutions/featured-partners/oracle/" target="_blank">officially run Oracle on EC2</a> (though you still have to license it rather than pay as you go), and it's clear that commercial software vendors are feeling the preasure of SaaCS (Software as a Commodity Service).</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=0qaAM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=0qaAM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=soLOM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=soLOM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=Bgi5M"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=Bgi5M" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=5pgNm"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=5pgNm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=QPVPm"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=QPVPm" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/409464769" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/10/microsoft-to-jump-on-board-ec2/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/10/microsoft-to-jump-on-board-ec2/</feedburner:origLink></item>
		<item>
		<title>TAE Boston 2008: The Unsexy Presentations</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/408504320/</link>
		<comments>http://www.pathf.com/blogs/2008/10/tae-boston-2008-the-unsexy-presentations/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 19:07:15 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[CruiseControl]]></category>

		<category><![CDATA[Hudson]]></category>

		<category><![CDATA[JsUnit]]></category>

		<category><![CDATA[Test Driven Development]]></category>

		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1178</guid>
		<description><![CDATA[Lets face it, most people come to Ajax conference for the eye candy. TAE Boston 2008 is no different, and the jQuery, Dojo and other sessions are packed. That's great. I love good eyecandy. But the shame is that many folks skip the less sexy presentations, such as today's presentation by Ted Husted entitle Ajax [...]]]></description>
			<content:encoded><![CDATA[<p>Lets face it, most people come to Ajax conference for the eye candy. TAE Boston 2008 is no different, and the jQuery, Dojo and other sessions are packed. That's great. I love good eyecandy. But the shame is that many folks skip the less sexy presentations, such as today's presentation by Ted Husted entitle <em>Ajax Testing Tool Review</em>. Talks like these and the tools and methods they discuss is what is leading to the "professionalisation" of front end development, as my colleague Brian Dillard likes to say.</p>
<p>Some of the highlights from Ted's talk:</p>
<ul>
<li>If you like CruiseControl, but it's too fiddly for you, you'll love <a href="https://hudson.dev.java.net/" target="_blank">Hudson</a>, a much more user friendly continuous integration engine.</li>
<li>The Selenium IDE is great for getting started or smoke testing, but use the API's (in Java, C#, Ruby, etc.) to get real, supportable unit tests done.</li>
<li>YUI Test is intrusive, but it overcomes some of the shortcomings for testing asynchronous events that are present in JsUnit and Selenium. See Ted's post on <a href="http://sites.google.com/site/tedhusted/posts/yui-test---the-new-kid-on-block" target="_blank">YUI Test</a>.</li>
</ul>
<p>OK, not sexy, but if you want to develop quality software, you have to keep an eye on the non-sexy bits.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=ydoRM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=ydoRM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=PoV3M"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=PoV3M" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=CYveM"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=CYveM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=JuJfm"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=JuJfm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=HSILm"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=HSILm" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/408504320" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/10/tae-boston-2008-the-unsexy-presentations/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/10/tae-boston-2008-the-unsexy-presentations/</feedburner:origLink></item>
		<item>
		<title>The Ajax Experience 2008: Hope to see you in Beantown</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/406525925/</link>
		<comments>http://www.pathf.com/blogs/2008/09/the-ajax-experience-2008-hope-to-see-you-in-beantown/#comments</comments>
		<pubDate>Mon, 29 Sep 2008 19:24:40 +0000</pubDate>
		<dc:creator>Brian Dillard</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[Ajax Experience]]></category>

		<category><![CDATA[events]]></category>

		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1176</guid>
		<description><![CDATA[
I'm posting today from Boston, where my colleague Dietrich Kappe and I are proud to be presenting at The Ajax Experience 2008.
At 5.10 p.m. tomorrow (Tuesday 30 September), Dietrich will present "Saving Your Investment: Transforming J2EE Applications into Web 2.0 Using GWT." This 90-minute session will introduce noobs to the Google Web Toolkit; school experienced [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://www.pathf.com/blogs/wp-content/uploads/2008/09/theajaxexperience.jpg'><img src="http://www.pathf.com/blogs/wp-content/uploads/2008/09/theajaxexperience.jpg" alt="The Ajax Experience 2008 Boston" title="The Ajax Experience 2008 Boston" width="300" height="216" class="right" /></a></p>
<p>I'm posting today from Boston, where my colleague Dietrich Kappe and I are proud to be presenting at <a href="http://ajaxexperience.techtarget.com/east/">The Ajax Experience 2008</a>.</p>
<p>At 5.10 p.m. tomorrow (Tuesday 30 September), Dietrich will present <a href="http://ajaxexperience.techtarget.com/east/html/server.html#DKappeGWT">"Saving Your Investment: Transforming J2EE Applications into Web 2.0 Using GWT."</a> This 90-minute session will introduce noobs to the Google Web Toolkit; school experienced GWT developers in the security implications of leaky client-side business logic; and delight business folks and bean-counters alike with the money-savings possibilities of retrofitting a legacy webapp instead of building a new one from scratch.</p>
<p>At 8.10 a.m. the following day (Wednesday 1 October), I will present <a href="http://ajaxexperience.techtarget.com/east/html/client.html#BDillardBrowser">"Making Friends with the Browser: Ajax, Back Buttons and Bookmarks."</a> In it, I'll look at the state of Ajax history management, from new libraries such as the <a href="http://nathanhammond.com/jssm">JavaScript State Manager</a> and <a href="http://code.google.com/p/dshistory/">dsHistory</a> to my own project, Really Simple History. I'll discuss the problems and tradeoffs inherent in any browser history manager. I'll also examine the impact of new browsers such as Google Chrome and Microsoft Internet Explorer 8 on this small, rapidly evolving corner of the Ajax world.</p>
<p>We look forward to seeing some of you there and reporting back about the rest of the conference.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=zpuRL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=zpuRL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=gcMbL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=gcMbL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=4Fl8L"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=4Fl8L" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=WaYil"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=WaYil" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=4ecpl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=4ecpl" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/406525925" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/09/the-ajax-experience-2008-hope-to-see-you-in-beantown/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/09/the-ajax-experience-2008-hope-to-see-you-in-beantown/</feedburner:origLink></item>
		<item>
		<title>TankEngine: New plugin for Rails iPhone Development</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/403998685/</link>
		<comments>http://www.pathf.com/blogs/2008/09/tankengine-new-plugin-for-rails-iphone-development/#comments</comments>
		<pubDate>Fri, 26 Sep 2008 18:24:30 +0000</pubDate>
		<dc:creator>Noel Rappin</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[iPhone]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1170</guid>
		<description><![CDATA[





Picture of me at Windy City Rails taken by John McCaffrey


Last Saturday at Windy City Rails, I had the pleasure of announcing TankEngine, a new Rails plugin for targeting iPhone and Mobile Safari. ("git" it here)
Now, I know, I've done this already, so why a brand-new version of the plugin with a new name?
Good question. [...]]]></description>
			<content:encoded><![CDATA[<div class="right">
<a href=""><br />
<img src="http://www.pathf.com/blogs/wp-content/uploads/2008/09/skitched-20080926-112333.jpg" alt="" border="0" width="" height="" class="right"/><br />
</a><br />
<br clear="all"/><br />
<span class="right" style="font-size: smaller"><br />
<a href="http://www.flickr.com/photos/johnmccaffrey/2877410178/in/pool-wcr08">Picture of me at Windy City Rails taken by John McCaffrey</a><br />
</span>
</div>
<p>Last Saturday at <a href="http://www.windycityrails.org">Windy City Rails</a>, I had the pleasure of announcing <a href="http://www.pathf.com/showcase/open-source-projects/tankengine">TankEngine</a>, a new Rails plugin for targeting iPhone and Mobile Safari. (<a href="http://github.com/noelrappin/tank-engine/tree/master">"git" it here</a>)</p>
<p>Now, I know, I've <a href="http://www.pathf.com/blogs/2008/05/rails-developme/">done this already</a>, so why a brand-new version of the plugin with a new name?</p>
<p>Good question. The original plugin was basically a wrapper around the iUI JavaScript and CSS classes. After working with iUI for a while, it turned out that I had a few differences of opinion with iUI (which I still think is a very nice piece of work).<br />
<span id="more-1170"></span><br />
<img src="http://www.pathf.com/blogs/wp-content/uploads/2008/09/iphone-simulator-13.jpg" alt="iPhone Simulator-13.jpg" border="0" width="160" height="230" class="right"/></p>
<ul>
<li>iUI is effectively optimized towards a drill-down list, and especially one where all the list data is sent down as a single page. This is somewhat restrictive for a Rails application.</li>
<li>iUi has a custom history mechanism for managing going backward through the list, but the mechanism causes conflicts with any other DOM-id based JavaScript on the page.</li>
<li>The CSS structure for iUI makes very strong assumptions about the structure of the underlying HTML</li>
</ul>
<p>Again, not a criticism of iUI, just an acknowledgement that it wasn't quite meeting my needs.</p>
<p>Which brings us to TankEngine, which offers the following.</p>
<p><img src="http://www.pathf.com/blogs/wp-content/uploads/2008/09/iphone-simulator-17.jpg" alt="iPhone Simulator-17.jpg" border="0" width="160" height="115" class="right"/></p>
<ul>
<li>A jQuery-based JavaScript layer, for managing iPhone-esque look and feel.</li>
<li>A more flexible mechanism for deciding which requests get the iPhone content.</li>
<li>An updated CSS page, based on the iUI original, but a bit more flexible, and also using WebKit specific CSS where appropriate.</li>
<li>A lot of helpers for lists and toggles and the like.</li>
</ul>
<p>There's still work to be done on the API, and adding some other iPhone style elements, but if you've got some needs in this area, check it out.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=eapEL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=eapEL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=9y5LL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=9y5LL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=PQYyL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=PQYyL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=qcYzl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=qcYzl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=p5mSl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=p5mSl" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/403998685" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/09/tankengine-new-plugin-for-rails-iphone-development/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/09/tankengine-new-plugin-for-rails-iphone-development/</feedburner:origLink></item>
		<item>
		<title>Symphony of Ruby on Rails and Flex through RubyAMF</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/402977795/</link>
		<comments>http://www.pathf.com/blogs/2008/09/simphony-of-ruby-on-rails-and-flex-through-rubyamf/#comments</comments>
		<pubDate>Thu, 25 Sep 2008 17:27:30 +0000</pubDate>
		<dc:creator>Sasha Dzeletovic</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[TechDev]]></category>

		<category><![CDATA[amf]]></category>

		<category><![CDATA[AS3]]></category>

		<category><![CDATA[Flex]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[rubyamf]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1163</guid>
		<description><![CDATA[
In a project that I am currently a part of, we inherited Ruby on Rails from our client's system and project front-end was designated to be developed in Flex. RubyAMF came naturally.
I have been working with two other AMF frameworks prior to this: AMFPHP and WebOrb. My experience with both was that they are fairly [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-1164" src="http://www.pathf.com/blogs/wp-content/uploads/2008/09/ror-ramf-fx.jpg" alt="" width="288" height="200" /></p>
<p>In a project that I am currently a part of, we inherited Ruby on Rails from our client's system and project front-end was designated to be developed in Flex. <a href="http://code.google.com/p/rubyamf/" target="_blank">RubyAMF</a> came naturally.</p>
<p>I have been working with two other AMF frameworks prior to this: <a href="http://www.amfphp.org/" target="_blank">AMFPHP</a> and <a href="http://www.themidnightcoders.com/weborb/" target="_blank">WebOrb</a>. My experience with both was that they are fairly hard to set up and once you go through that minefield, everything works excellent. No need to say that I am a great advocate of AMF in general. <a href="http://code.google.com/p/rubyamf/" target="_blank">RubyAMF</a> brings the same good old AMF but with a stunning ease and speed of development!</p>
<p>My colleague working on the Ruby side, Justin Ficke, introduced me to code and architecture of Ruby on Rails  and I was impressed to see with what ease, precision and speed can one develop it.</p>
<p>Justin and I put a little test together of this architecture and here is a screen cast of it.</p>
<p><a href="http://www.pathf.com/blogs/wp-content/uploads/2008/09/ror-ramf-fx-test.mov" target="_blank"><img class="alignnone size-full wp-image-1166" src="http://www.pathf.com/blogs/wp-content/uploads/2008/09/test.jpg" alt="" width="500" height="226" /></a></p>
<p>All the lovely custom typed objects and speed of data transfer are there. Beauty of it, appart from obvious benefits from AMF, is that the development process couldn't have been better and faster.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=FYLeL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=FYLeL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=tyAiL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=tyAiL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=Ey2yL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=Ey2yL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=Rj9Xl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=Rj9Xl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=hRsOl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=hRsOl" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/402977795" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/09/simphony-of-ruby-on-rails-and-flex-through-rubyamf/feed/</wfw:commentRss>
<enclosure url="http://www.pathf.com/blogs/wp-content/uploads/2008/09/ror-ramf-fx-test.mov" length="2885960" type="video/quicktime" />
		<feedburner:origLink>http://www.pathf.com/blogs/2008/09/simphony-of-ruby-on-rails-and-flex-through-rubyamf/</feedburner:origLink></item>
		<item>
		<title>“Build half a product, not a half-assed product” - tips on clarity and focus from Jason Fried of 37Signals</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/402123202/</link>
		<comments>http://www.pathf.com/blogs/2008/09/build-half-a-product-not-a-half-assed-product-tips-on-clarity-and-focus-from-jason-fried-of-37signals/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 20:31:04 +0000</pubDate>
		<dc:creator>John McCaffrey</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Disruption]]></category>

		<category><![CDATA[TechDev]]></category>

		<category><![CDATA[37signals]]></category>

		<category><![CDATA[agile]]></category>

		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1160</guid>
		<description><![CDATA[
Jason Fried from 37Signals spoke yesterday at the ITA "Speaking of Success" event, about the history of 37Signals, their philosophy and culture, and the critical business decisions they've made to get them where they are today.
The software biz is fundamentally broken. Too many products fail because of the obsession of adding more and more, and [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pathf.com/blogs/wp-content/uploads/2008/09/hammer.jpg"><img src="http://www.pathf.com/blogs/wp-content/uploads/2008/09/hammer.jpg" alt="" class="right" height="214" width="284" /></a></p>
<p><strong>Jason Fried</strong> from <a href="http://www.37signals.com" target="_blank">37Signals</a> spoke yesterday at the ITA "<a title="Speaking of Success" href="https://www.illinoistech.org/calendar.aspx/1024" target="_blank">Speaking of Success</a>" event, about the history of 37Signals, their philosophy and culture, and the critical business decisions they've made to get them where they are today.</p>
<blockquote><p>The software biz is fundamentally broken. Too many products fail because of the obsession of adding more and more, and trying to do too much.</p></blockquote>
<p>Jason went on to say that the approach of adding more and more only works for companies that have lots of money and lots of time, but that for the average company the main goal should be to build something that is "good enough," get it out to the users, and improve the design based on their feedback. The challenge of which features to include, and which to say "No" to, is covered well in the "<a href="http://books.google.com/books?id=SIexi_qgq2gC&amp;dq=innovator%27s+dilemma&amp;pg=PP1&amp;ots=AhtNdGH8Kl&amp;sig=nfxVSDAyu_zmT8W7tHbmgbJoU5c&amp;hl=en&amp;sa=X&amp;oi=book_result&amp;resnum=1&amp;ct=result" target="_blank">The Innovator's Dilemma</a>," which he said "everyone in this room should have read." The book resonates the core philosophy of 37Signals, which is evident from their <a href="http://www.37signals.com/svn/" target="_blank">blogs</a>, their book "Getting Real," and the design of the Rails framework. As an example of the "Good Enough" philosophy, Jason used his laptop and its basic webcam to stream the Q&amp;A session out over <a href="http://www.justin.tv/search?sort-by=newest&amp;q=37signals&amp;section=all" target="_blank">justin.tv</a> and send out a text to the 37signals Twitter group. "The quality probably isn't that great, but its good enough," and with that quick setup he had now broadened the audience by 1,000 users or so. (I searched for the video archive at justin.tv, but didn't find it yet.)</p>
<p><span id="more-1160"></span></p>
<blockquote><p>"Our products do less than the competition"</p></blockquote>
<p>While this quote isn't new, I still find that its worth digesting, particularly as it relates to product planning and product design. I'm a big fan of Agile and iterative development, and the idea that we don't have to have the full product requirements solidified before we can get started. I like to take a product vision to market quickly, improve on the design, and add features as their necessity becomes more clear.</p>
<p> I found that the things that Jason mentioned that resonated with me the most were closely in line with what I liked about <a href="http://www.pathf.com/blogs/2008/09/tips-tricks-from-windy-city-rails/" target="_blank">DHH's Q&amp;A session</a> at last week's <a href="http://www.windycityrails.org" target="_blank">WindyCityRails</a> conference in Chicago. I think a big part of 37Signals success is due to the fact that its two primary partners are totally on the same page.</p>
<p>Working at a consulting company like Pathfinder presents two major challenges in this area. First, the customer most likely doesn't know anything about Agile, nor do they really care about it. They want to see results and the details of how those results come about may not be something they care to explore. Secondly, our customer cares deeply about the design of the product, and the features that absolutely HAVE to be in for the release. The idea of going to market with "less" is a difficult concept to swallow. I've found that the more the design process explicitly involves the actual end user, the easier it is to investigate the importance of a given feature, ask them about it, prototype it, and figure out if its going to make things better for them. Conversely, if the end-user isn't closely involved in the design process, feature priority is more of a guess, and out of fear and lack of certainty features are included because "yeah, we might need that too". So when the question is raised, "Which is a higher priority, feature A, or feature B?", the answer is often an unequivocal "BOTH!"</p>
<p>On this point Jason had two elegant explanations that I hope to draw from. First, doing "less" really means covering the "essentials" of what is needed, and doing those "fewer" things better. He mentioned their products as being like a tool, with a specific, focused purpose.</p>
<blockquote><p>"A hammer is a tool, its very focused, and has a clean, simple interface."</p></blockquote>
<p>It strikes me as a perfect example of clarity and focus, because no one is screaming for a hammer that measures distance, cuts wood, or tightens nuts &amp; bolts. Its intended use is clear, it doesn't need to do more than that.</p>
<p>"We like to think of ourselves as curator's of the product. A curator at a museum chooses which pieces of Art should be included in the collection. They say "No" to many things. A building full of lots of Art that isn't carefully selected isn't a museum, its a warehouse"</p>
<p>I've certainly seen applications that were a "warehouse" of features in need of greater focus and "tasteful selection" for what should be included. My mission now is to find a better way to deliver the message that "less is more," and that in most cases, its better to get the application out to the users quickly, and leave room to iterate and improve on the design, than it is to try to build and release the perfect product all in one shot.</p>
<p>How do you deal with this issue in your day to day work? What effective techniques have you found for bringing clarity to the design of a product?</p>
<p><strong>Photo Credit</strong>:<br /><a href="http://www.flickr.com/photos/ppdigital/2054989998/">Darren Hester</a><br />under a Creative Commons Attribution License</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=amLyL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=amLyL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=gN0PL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=gN0PL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=IQ1xL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=IQ1xL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=B9kMl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=B9kMl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=LOGFl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=LOGFl" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/402123202" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/09/build-half-a-product-not-a-half-assed-product-tips-on-clarity-and-focus-from-jason-fried-of-37signals/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/09/build-half-a-product-not-a-half-assed-product-tips-on-clarity-and-focus-from-jason-fried-of-37signals/</feedburner:origLink></item>
		<item>
		<title>Rails Performance, Code Metrics, and Locking Down your Application: Tips &amp; Tricks from Windy City Rails 2008</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/402118698/</link>
		<comments>http://www.pathf.com/blogs/2008/09/tips-tricks-from-windy-city-rails/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 20:27:25 +0000</pubDate>
		<dc:creator>Josh Symonds</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1161</guid>
		<description><![CDATA[Windy City Rails was the best Rails conference I've ever been to, which is easy for me to say since it was my first actual Rails conference. But even speaking from a fairly uninformed point of view I found it very full of quality. In case you didn't know, it was created by ChicagoRuby, sponsored [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pathf.com/blogs/wp-content/uploads/2008/08/rails.png"><img class="alignright size-medium wp-image-1100" title="Ruby on Rails" src="http://www.pathf.com/blogs/wp-content/uploads/2008/08/rails.png" alt="" width="50" height="64" /></a>Windy City Rails was the best Rails conference I've ever been to, which is easy for me to say since it was my first actual Rails conference. But even speaking from a fairly uninformed point of view I found it very full of quality. In case you didn't know, it was created by ChicagoRuby, sponsored by Pathfinder (us) among others, and you can find tons more details if you're interested at <a href="http://windycityrails.org/">http://windycityrails.org/</a>. Anyway, it was this last Saturday the 20th, and after four days of digestion I am prepared to deliver some of the highlights:</p>
<p><span id="more-1161"></span></p>
<h3>DHH on Rails Performance and Winning in the Website Business</h3>
<p>DHH did a pretty neat 30 minute Q&amp;A session towards the beginning of the day. I'd never actually met (or seen) the guy who initially spawned the framework from which I make my day-to-day livelihood. He's very personable, awfully loud, thoroughly opinionated, and quite brilliant, just like Rails. It is my career goal to be cool enough that I can show up at a conference dedicated to software I created, with no speech in hand and no real plan, but still wing a Q&amp;A session that ends up being one of the conference highlights, because DHH did just that.</p>
<p>One of the questions he answered was about the speed of the Rails framework, which got him off on a really interesting diatribe on how Rails is A) fairly speedy at doing its thing and B) not usually the problem when there are throughput difficulties on a server. Rails only takes up about 10-20% of the time a request is being processed by the server. Seriously, the biggest improvement DHH said 37signals implemented in BaseCamp was telling the server to check the browser's etags. Very handy headers that have been part of the HTTP spec for generations (like HTTP_IF_MODIFIED_SINCE) can provide huge speed improvements if implemented correctly, and that's something usually done by Apache and not Rails at all. But that said in Edge Rails we now have a request.fresh? method that lets us quickly return head :not_modified. We don't even have to hit the database. How cool!</p>
<p>Remember to gzip files you're sending around, and minify JS, and all that other good stuff. Seriously. The tool <a href="http://developer.yahoo.com/yslow/">yslow</a> (which I knew about before the talk because I'm a great web developer) is completely invaluable for boosting the performance of your apps. Use it. Love it.</p>
<p>After DHH finished his talk, there was a small collection of people out in the hallway sponging around him, and being a mindless sheep I stuck around too and learned that DHH has a secret hatred of migrations. They're really great to build iteratively and allow seamless database support, but he was definitely of the opinion that they should be thrown away with great regularity and replaced with the overall schema. Certainly they were never intended for use in production environments (which should be obvious from the existence of the rake db:schema:load task).</p>
<p>And finally, I spoke with him myself, which was kind of awkward since I had absolutely nothing to say. I mean, after you thank him for creating the thing that makes you money, what conversational gambits are left? Discussions of the weather? I ended kind of lamely and ended up kicking myself through the rest of the conference for it. Next time, I'm going to have some emergency questions prepared in case I get a one-on-one with him or another luminary of he Rails world.</p>
<p>What I took away most from his talk was something just of general inspiration and not Rails-related at all, though. In answering someone's question about how to succeed in creating web applications, he stated two things: A) be marginally better than your competition, and B) have greater longevity. Seriously, if you're only 2% better, you'll win in the long run because most companies die and your competitor's will before yours, if you play your cards right. Ultimately, he stated that having a market of millions is nearly impossible; be satisfied with thousands, or even a few dozen thousands.</p>
<p>Think about this: a mere 2,000 customers paying $40 a month leaves your company with a revenue stream approaching a million dollars. That is certainly nothing to sneeze at, and only goes to show that web business models do not require 100,000 users before they become profitable. A lot of people fall into the trap of believing that they'll be the next Google or YouTube and their company will have a market capitalization of a billion dollars overnight. It won't happen. It's more likely you'll win the lottery. Aim modestly, and your chances of success increase exponentially.</p>
<h3>Jake Scruggs and Code Metrics that Matter</h3>
<p>Of course, our own John McCaffery delivered an immensely popular talk about JavaScript testing, highlighting JavaScript-unfriendly browsers like everyone's favorite Internet Explorer. But since I had heard it already, I went to Jake Scruggs' presentation, 'Using Metrics to Take a Hard Look at Your Code.'</p>
<p>Everyone knows the big code metric: code coverage. It's kind of the old standby of the code numbers world. But Jake Scruggs was pretty dismissive towards it, which is perfectly correct of him. Rcov in particular is not a complicated tool; it checks code coverage only by seeing that particular lines are called. It does not check complicated conditional logic, nor does it check for weird failing cases, and it doesn't tell you when your methods are crazy and overwrought. It is a good metric because you want tests, but it is not a good metric because it doesn't really tell you how good your code actually is.</p>
<p>For that, he recommended a tool I had never heard of: <a href="http://ruby.sadi.st/Flog.html">flog</a>. Flog determines the complexity of your methods and lets you know when your code should be refactored into more sensible, bite-sized chunks. This isn't to say that you can't have a hundred-line-long method; but testing is easier and more sensible when code is atomic, and flog really encourages refactoring with an eyes towards atomization.</p>
<p>Also he talked about <a href="http://saikuro.rubyforge.org/">Saikuro</a>, which is a cyclomatic complexity analyzer. In human speak that means it counts the number of branches in your code for you, which is probably as many tests as that method should have. If you have 5 paths through a method, you want to test them all, am I right? Even if Rcov, the lying but wonderful tool it is, says you have 100% coverage, you almost certainly don't unless you have those 5 paths as 5 different tests.</p>
<p>Anyway I'm totally giving his talk short shrift. It was really fascinating and you can read more about the individual bits of it on <a href="http://jakescruggs.blogspot.com/">his blog</a>.</p>
<h3>Locking Down Rails with Aaron Bedra</h3>
<p>Aaron Bedra gave a really cool talk on Rails security. Really I don't think developers pay enough attention to this (and I am just as guilty as the rest of us). We take for granted the amazing tools Rails provides to protect against malicious users. SQL injection is rendered useless by sensible finders, cross-site request forgery is foiled by authenticity tokens, and the small little h tag nullifies most cross-site scripting attacks. These are so easy to use and require so little thought on our part that we don't test them, which is clearly the wrong thing to do.</p>
<p>So Aaron suggested a cool new tool that I intend to use from now on called <a href="http://github.com/relevance/tarantula/tree/master">tarantula</a>. Tarantula by default crawls your app and puts bad form data into it to see if your application bombs out. That's fun but kind of yawn-inducing (you're testing your model validations already, right?). Where it gets really cool is that you can set it to perform XSS, CSRF, and SQL injection attacks on your site.</p>
<p>You might get lots and lots of failures.</p>
<p>In that case, it's best to install a plugin that helps audit your code. I recommend <a href="http://xss.rubyforge.org/">xss_sniper</a>, which wraps all of your strings and texts in little h tags so you don't need to remember to whitelist them yourself. But Aaron also suggested <a href="http://agilewebdevelopment.com/plugins/safe_erb">SafeERB</a> and <a href="http://github.com/artmotion/xss_shield/tree/master">xss_shield</a>. Check 'em out and install one! It can't hurt to secure your app even more.</p>
<h3>Noel Rappin's Test Last Development</h3>
<p>Our very own Noel Rappin also gave a really cool talk on some common pitfalls in test driven development. I'll be brutally honest here. For all my strengths, I am not the best test driven developer in existence. It is hard work to remember to be test driven, especially when you tell yourself, "Oh, I'll just whip this up really quickly and get to the tests later." Good self-auditing techniques are completely required to keep on the testing straight and narrow... and it's very, very easy to stumble.</p>
<p>Noel talked a lot about those stumbles and what they show us about test driven development. I'll leave it for him to discuss the details since I hate stealing others' thunder, and anyway if I tried I certainly wouldn't cover the topic nearly as well as him. Suffice it to say that all of us have been guilty of stumbling into potholes on the road to completely test driven development, and that actually analyzing those roadbumps helps us figure out when some can actually be useful, and how to avoid them in the future.</p>
<p>So, all in all, Windy City Rails rocked! The energy level was high, the food was completely bearable, there were lots of people there, a fair amount of swag was given away (but in a grotesque oversight I did not win any), and here's my strange anecdote from the conference: I was standing in line for lunch and the guy behind me struck up a conversation with me. He said that he's a .Net developer and doesn't know the first thing about Rails. He just wants to learn more about our development processes and what we're doing.</p>
<p>How cool is that?</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=SPueL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=SPueL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=ckPVL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=ckPVL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=XSPmL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=XSPmL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=AULQl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=AULQl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=cRpxl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=cRpxl" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/402118698" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/09/tips-tricks-from-windy-city-rails/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/09/tips-tricks-from-windy-city-rails/</feedburner:origLink></item>
		<item>
		<title>Betting Your Business on the iPhone</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/401016048/</link>
		<comments>http://www.pathf.com/blogs/2008/09/betting-your-business-on-the-iphone/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 17:35:45 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Disruption]]></category>

		<category><![CDATA[Business]]></category>

		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1148</guid>
		<description><![CDATA[Monopsony - the market condition that exists when there is only one buyer.
We all have heard the term "monopoly" and even know a little bit of what it means - a market where there is only one seller. But the related term "monopsony," a market where there is only one buyer, is not as well [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><span class="dicColor">Monopsony - </span>the market condition that exists when there is only one buyer.</p></blockquote>
<p><a href="http://www.pathf.com/blogs/wp-content/uploads/2008/07/iphone_in_dock.jpg"><img class="alignright alignnone size-medium wp-image-1016" style="float: right;" title="iPhone in Dock" src="http://www.pathf.com/blogs/wp-content/uploads/2008/07/iphone_in_dock.jpg" alt="iPhone in Dock" width="160" height="240" /></a>We all have heard the term "monopoly" and even know a little bit of what it means - a market where there is only one seller. But the related term "monopsony," a market where there is only one buyer, is not as well known and it's dangers not as well understood.</p>
<p>Certainly both monopolies and monopsonies will reduce competition, innovation and consumer choice, but they further constitute a big risk for the sellers. For businesses on the seller side a monopsony can be the kiss of death. Just ask <a href="http://walmartwatch.com/blog/archives/harpers_magazine_break_up_wal_mart/" target="_blank">Walmart's suppliers</a> how good it's been for them.</p>
<p>Not all monopsonies are as obvious or as overtly damaging to suppliers as that of Walmart, but Apple's iPhone and iTunes appstore looks like a benign monopsony. A monopsony in that although the iphone consumer is the ultimate buyer, Apple determines what is permitted in it's appstore, and benign in the fact that Apple hasn't flexed that restrictive muscle more than a few times.</p>
<p><span id="more-1148"></span></p>
<p>But for the business launching an iPhone app this monopsony - benign or not - presents a real concern, a real business risk. What happens if Apple decides to compete in your space? The evidence on what happens right now is not encouraging. Take the recent example of the <a href="http://almerica.blogspot.com/2008/09/podcaster-rejeceted-because-it.html" target="_blank">podcasting application that was excluded from the AppStore</a>. The reason for it's exclusion?</p>
<blockquote><p><span style="font-style: italic;">Since <span id="SPELLING_ERROR_1" class="blsp-spelling-error">Podcaster</span> assists in the distribution of <span id="SPELLING_ERROR_2" class="blsp-spelling-error">podcasts</span>, it duplicates the functionality of the Podcast section of <span id="SPELLING_ERROR_3" class="blsp-spelling-error">iTunes</span>. </span></p></blockquote>
<p>That's the desktop version of iTunes versus an application on the iPhone that you can use without a PC or Mac. Presumably, if people don't have to use iTunes to get their podcasts, then there's less reason to use iTunes and consequently less chance that they'll actually spend money with Apple.</p>
<p>Since you only find out whether your application will be approved in the last step, i.e. after all of the hard development work has been done, that's a lot of risk to take. How to minimize it? One approach to minimizing risk might go as follows:</p>
<ul>
<li>Distribute an application with an initial pretty minimal set of functionality. Quick to produce and get the yes/no appstore answer.</li>
<li>Design your application so that it supports and embedded language runtime, such as Ruby or JavaScript, and a capability to push additional modules of functionality to the application independent of the appstore.</li>
<li>Extend your application using the above distribution mechanism. The only time you'll have to push a new version of the app is when the underlying iPhone platform changes and you'd like your embedded layer to take advantage of new features.</li>
</ul>
<p>Of course Apple is known to have a <a href="http://www.businessweek.com/technology/content/aug2008/tc20080818_266301.htm?campaign_id=rss_daily" target="_blank">"kill switch"</a> to turn off apps that have already been downloaded to a phone, so even the above approach may not insulate you from risk. So, if you are developing for the iPhone, have a care on whether your application will run into competition from Apple. You may find your application unceremoniously rejected or killed.</p>
<p><strong>Update: </strong>Looks like Apple has  banned another application, <a href="http://angelo.dinardi.name/2008/09/20/mailwrangler-and-the-apple-app-store/" target="_blank">MailWrangler</a>, that competes with it's own email application.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=BscFL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=BscFL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=SFl4L"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=SFl4L" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=fIm4L"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=fIm4L" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=dg61l"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=dg61l" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=Pf12l"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=Pf12l" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/401016048" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/09/betting-your-business-on-the-iphone/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/09/betting-your-business-on-the-iphone/</feedburner:origLink></item>
		<item>
		<title>GWT Tutorial - Building A Model</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/400960857/</link>
		<comments>http://www.pathf.com/blogs/2008/09/gwt-tutorial-building-a-model/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 17:05:29 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[GWT]]></category>

		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1157</guid>
		<description><![CDATA[Shalk Neethling has written up a nice, streamlined tutorial on how to build a model in GWT using the GWTx project's support for java.beans.PropertyChangeSupport.
The basic idea here is that while the browser is the View and the server side is the Model and Controller in MVC, you really should structure your browser side code as [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pathf.com/blogs/wp-content/uploads/2008/06/gwt.png"><img class="alignright alignnone size-medium wp-image-952" style="float: right;" title="gwt" src="http://www.pathf.com/blogs/wp-content/uploads/2008/06/gwt.png" alt="" width="260" height="250" /></a>Shalk Neethling has written up a <a href="http://css.dzone.com/news/gwt-building-a-model" target="_blank">nice, streamlined tutorial</a> on how to build a model in GWT using the <a href="http://code.google.com/p/gwtx/" target="_blank">GWTx</a> project's support for <code>java.beans.PropertyChangeSupport</code>.</p>
<p>The basic idea here is that while the browser is the View and the server side is the Model and Controller in MVC, you really should structure your browser side code as an MVC itself where only the Model interacts with the server.</p>
<p>Well worth a read.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=DqNiL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=DqNiL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=De5TL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=De5TL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=mxdBL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=mxdBL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=sC7Pl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=sC7Pl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=UlZsl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=UlZsl" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/400960857" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/09/gwt-tutorial-building-a-model/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/09/gwt-tutorial-building-a-model/</feedburner:origLink></item>
		<item>
		<title>What does your CSS Swiss Army knife look like?</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/400057865/</link>
		<comments>http://www.pathf.com/blogs/2008/09/what-does-your-css-swiss-army-knife-look-like/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 19:15:50 +0000</pubDate>
		<dc:creator>Brian Dillard</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[UXD]]></category>

		<category><![CDATA[CSS]]></category>

		<category><![CDATA[Javascript]]></category>

		<category><![CDATA[Progressive Enhancement]]></category>

		<category><![CDATA[Web Standards]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1158</guid>
		<description><![CDATA[
CSS 2.1 is more like a Swiss Army knife than a fully stocked toolbox. We can accomplish a lot, but we have to get creative with the standard attachments. Floats, relative positioning, the box model - each tool must performs double or triple duty because they're the only ones we've got.
When we do discover a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pathf.com/blogs/wp-content/uploads/2008/09/swissarmy.jpg"><img src="http://www.pathf.com/blogs/wp-content/uploads/2008/09/swissarmy.jpg" alt="Swiss Army knife" title="Swiss Army knife" width="90" height="90" class="right" /></a></p>
<p>CSS 2.1 is more like a Swiss Army knife than a fully stocked toolbox. We can accomplish a lot, but we have to get creative with the standard attachments. Floats, relative positioning, the box model - each tool must performs double or triple duty because they're the only ones we've got.</p>
<p>When we do discover a clever way to accomplish a common task using these limited tools, we're likely to employ that technique over and over. I'm not talking about <a href="http://www.blueprintcss.org/">CSS frameworks</a> here; those help out more at the macro level. I'm talking about repeatable techniques that can be applied at the micro level. When done right, these simple techniques can feel like entirely new Swiss Army attachments rather than intelligent application of existing blades.</p>
<p>Whenever I start out on a new client project, I start off with the following plug-and-play components:</p>
<p><span id="more-1158"></span></p>
<ol>
<li>
<p><strong>A reset stylesheet:</strong> Sometimes I plug <a href="http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/">Eric Meyer's latest reset</a> in wholesale, while sometimes I pick and choose which parts make sense for my project. Regardless, it's absolutely essential to erase default styling and provide a common, cross-browser foundation on which to build.</p>
</li>
<li>
<p><strong>Semantic, cross-browser float-clearing:</strong> I <a href="http://www.pathf.com/blogs/2007/09/developers-note-2/">posted about this topic a year ago</a>, generating plenty of debate. Whether you're using my Orbitz-inspired grocery-list-of-selectors approach or a generic <code>clearfix</code> class, you've got to tackle this problem if you employ float-based layout - until, that is, some future CSS spec implements a <code>float-clear</code> property.</p>
</li>
<li>
<p><strong>Standard-issue pipe-delimited lists:</strong> If you're representing lists as paragraphs full of text punctuated by hard-coded pipe characters (|), you're probably not paying much attention to web standards. A set of CSS rules like the following makes it dead simple accomplish the same effect semantically with borders. True, Internet Explorer 6/7's lack of support for the <code>first-child</code> pseudo-class means you'll have to create an actual class called <code>first-child</code> and apply it to your initial list element. Still, once you adjust border colors and spacing to fit your site design, this solution works anywhere. Variations can even allow for pipe-delimited definition lists.</p>
<pre>
/*
	standard pipe-delimited list: add a class
	of &quot;first-child&quot; to the first element
	for IE either via script or in the markup
*/

/*
	- the 0 margin and padding are unnecessary if
	  you&#x27;re using a standard reset stylesheet
	- you'll need to clear floats inside of ul.piped
	  using whatever your preferred method is
*/
ul.piped {
	margin: 0;
	padding: 0;
}
ul.piped li {
	float: left;
	margin-left: 8px;
	padding-left: 8px;
	border-left: 1px solid #000;
	list-style: none;
}
ul.piped li:first-child,
ul.piped li.first-child{
	margin-left: 0;
	padding-left: 0;
	border-left: 0;
}
</pre>
</li>
<li>
<p><strong>Simple hide/show utility classes:</strong> Unless you're using an effects library to create visual transitions, it's easier to toggle classes on hide/show elements than to manipulate their style properties directly. The only problem is differentiating between block and inline elements when you're ready to show them again. That's where the <code>block</code>, <code>inline</code>, <code>noneBlock</code> and <code>noneInline</code> classes come in. Your JavaScript code just needs to know that elements with a class of <code>block</code> get toggled to <code>noneBlock</code> and vice-versa; same for elements with a class of <code>inline</code> and <code>noneInline</code>.</p>
<pre>
/* classes to hide and show elements programmatically*/

.inline {
	display: inline;
}
.block {
	display: block;
}
.noneInline,
.noneBlock {
	display: none;
}
</pre>
</li>
<li>
<p><strong>A style-as-link class for JavaScript actions:</strong> It's easier - not to mention more semantic - to trigger JavaScript code from click events on divs, spans or other non-anchor elements. That way, you don't have to deal with a dummy <code>href</code> value or cancel out the link's default action. Besides, the <code>&lt;a href=&quot;&quot;&gt;&lt;/a&gt;</code> tag is for taking you to new pages, not performing an action within the existing page.</p>
<p>Some JavaScript coders ignore these advantages because they want the built-in styling shortcut of the <code>a</code> tag: cursors and hover states. As the code below demonstrates, however, it's dead simple to achieve the same visual effects with some simple CSS. Modern browsers can apply the <code>hover</code> pseudo-class to most any element. Ditto custom cursors.</p>
<pre>
a,
.styleAsLink{
	color: #08c;
	text-decoration: none;
}
a:hover,
.styleAsLink:hover{
	color: #444;
	text-decoration: underline;
	cursor: pointer;
}
</pre>
<p>Once you've created a <code>styleAsLink</code> class, you can replace this type of code:</p>
<pre>
&lt;a href=&quot;#&quot;
onclick=&quot;alert(&#x27;Isn&#x27;t it annoying to have to return
false every time?&#x27;); return false;&quot;&gt;
	this is an actual link
&lt;/a&gt;
</pre>
<p>... with this:</p>
<pre>
&lt;div class=&quot;styleAsLink&quot;
onclick=&quot;alert(&#x27;In the real world the click event
should be applied unobtrusively!&#x27;);&quot;&gt;
	this is a pseudo-link
&lt;/div&gt;
</pre>
<p>One caveat: This technique is useful for links that serve no other function than to trigger JavaScript code. Don't employ it in the case of a progressively enhanced link that triggers a script when JavaScript is available but takes you to a new page when it's not. A simple rule of thumb: If the link exists in your actual markup, it should remain a link. If it's inserted into the DOM wholesale by JavaScipt, it should be a pseudo-link.</p>
</li>
</ol>
<p>Enough about my own personal Swiss Army attachments. How do you get all <a href="http://en.wikipedia.org/wiki/MacGyver">MacGyver</a> with your CSS? Let us know in the comments.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=RZulL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=RZulL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=HwQlL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=HwQlL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=USBfL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=USBfL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=2Fvjl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=2Fvjl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=jsbil"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=jsbil" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/400057865" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/09/what-does-your-css-swiss-army-knife-look-like/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/09/what-does-your-css-swiss-army-knife-look-like/</feedburner:origLink></item>
		<item>
		<title>Windy City Rails</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/397512625/</link>
		<comments>http://www.pathf.com/blogs/2008/09/windy-city-rails/#comments</comments>
		<pubDate>Fri, 19 Sep 2008 20:13:10 +0000</pubDate>
		<dc:creator>Noel Rappin</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1156</guid>
		<description><![CDATA[





WindyCityRails Logo


A quick plug for the WindyCityRails conference being held tomorrow here in Chicagoland. I guess it's technically not a "plug" since the conference is all sold out, but it does promise to be a fun day. So think of this post as a promise against a longer post on Monday with a round up.
The [...]]]></description>
			<content:encoded><![CDATA[<div class="right">
<a href="http://www.windycityrails.org"><br />
<img src="http://www.pathf.com/blogs/wp-content/uploads/2008/09/b09a4e41-cea1-4daa-9319-ec0a1026fcb0.jpg" alt="B09A4E41-CEA1-4DAA-9319-EC0A1026FCB0.jpg" border="0" width="152" height="97" class="right"/><br />
</a><br />
<br clear="all"/><br />
<span class="right" style="font-size: smaller"><br />
<a href="http://www.windycityrails.org">WindyCityRails Logo</a><br />
</span>
</div>
<p>A quick plug for the <a href="http://www.windycityrails.org">WindyCityRails</a> conference being held tomorrow here in Chicagoland. I guess it's technically not a "plug" since the conference is all sold out, but it does promise to be a fun day. So think of this post as a promise against a longer post on Monday with a round up.</p>
<p>The headline session is a Q&A with David Heinemeier Hansson. David Chelimsky, lead developer of RSpec is also speaking. And we have three talks from Pathfinder as well.</p>
<p>John McCaffery will be doing a presentation on JavaScript practices including testing and debugging.</p>
<p>I'll be doing a talk on iPhone web development, and a talk on testing that I hope will also be fun. </p>
<p>Expect some round ups early next week. If you can't wait that long, I'll probably be updating my <a href="http://www.twitter.com/noelrap">twitter feed</a> all day with any interesting info.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=l5yvL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=l5yvL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=8DlrL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=8DlrL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=WaocL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=WaocL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=LH0Cl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=LH0Cl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=bEzIl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=bEzIl" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/397512625" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/09/windy-city-rails/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/09/windy-city-rails/</feedburner:origLink></item>
		<item>
		<title>ZK 3.5 Released with Comet Support</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/396539396/</link>
		<comments>http://www.pathf.com/blogs/2008/09/zk-35-released-with-comet-support/#comments</comments>
		<pubDate>Thu, 18 Sep 2008 20:27:56 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Ajax Frameworks]]></category>

		<category><![CDATA[Announcement]]></category>

		<category><![CDATA[ZK]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1154</guid>
		<description><![CDATA[ZK 3.5, the latest version of the server-side Ajax framework, is out with a raft of new features. Three of those features really stand out for me:

Comet server push
Customization of look and feel
Performance monitoring

Server push via polling has been available in ZK for a while, and Comet in the ZK "Enterprise Edition," but now it [...]]]></description>
			<content:encoded><![CDATA[<p>ZK 3.5, the latest version of the server-side Ajax framework, is out with a <a href="http://zkoss.org/smalltalks/zk3.5/" target="_blank">raft of new features</a>. Three of those features really stand out for me:</p>
<ul>
<li>Comet server push</li>
<li>Customization of look and feel</li>
<li>Performance monitoring</li>
</ul>
<p>Server push via polling has been available in ZK for a while, and Comet in the ZK "Enterprise Edition," but now it is available to everyone. And it is pretty easy to use: "The implementation of server push is transparent to developers.  ZK chooses which implementation to use according to the edition of ZK automatically, but it is configurable."</p>
<p>Customization of look and feel has gotten much easier. ZK has followed the example of a number of other frameworks in styling its widgets with predictably named CSS styles. Changing the look and feel of an application is now as easy as changing the ZK widget style sheet. Styles can further be overridden on a widget <a href="http://zkoss.org/smalltalks/zk3.5/#all" target="_blank">instance-by-instance basis</a>.</p>
<p>Performance monitoring is perhaps the most exciting new feature. Client-side tools such as <a href="http://developer.yahoo.com/yslow/" target="_blank">YSlow</a> can guide optimization efforts and give you point in time performance snapshots. But critical applications need to be monitored and tracked end to end over their lifespan. With ZK 3.5, you now have the plumbing to instrument your application to capture five data points for each request:</p>
<ul>
<li>T1, the time browser sends a request to server</li>
<li>T2, the time server receives a request</li>
<li>T3, the time server sends a request to browser</li>
<li>T4, the time browser receives a request from server</li>
<li>T5, the time the browser finishes processing a request</li>
</ul>
<p><strong>ZKStudio 0.8.2</strong></p>
<p>There's also a <a href="http://www.zkoss.org/smalltalks/zkstudioins/" target="_blank">new version of ZKStudio</a> for Eclipse out. The major change is that it now supports auto update via <a href="http://studioupdate.zkoss.org/studio/update">http://studioupdate.zkoss.org/studio/update</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=VyVPL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=VyVPL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=tsIEL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=tsIEL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=hbN4L"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=hbN4L" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=kRFZl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=kRFZl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=7zlRl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=7zlRl" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/396539396" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/09/zk-35-released-with-comet-support/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/09/zk-35-released-with-comet-support/</feedburner:origLink></item>
		<item>
		<title>Mouse wheel (scroll) Event in Flash Player running on a Mac</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/396423504/</link>
		<comments>http://www.pathf.com/blogs/2008/09/mouse-wheel-scroll-event-in-flash-player-running-on-a-mac/#comments</comments>
		<pubDate>Thu, 18 Sep 2008 18:04:45 +0000</pubDate>
		<dc:creator>Sasha Dzeletovic</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[TechDev]]></category>

		<category><![CDATA[externalinterface]]></category>

		<category><![CDATA[Flash]]></category>

		<category><![CDATA[Flex]]></category>

		<category><![CDATA[Mac]]></category>

		<category><![CDATA[mouse scroll]]></category>

		<category><![CDATA[mouse wheel]]></category>

		<category><![CDATA[osx]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1147</guid>
		<description><![CDATA[One of the great advantages of Flash technology is cross-browser and cross-platform compatibility. That is almost entirely true but a few things did slip Adobe.
A big issue that was overlooked is support for mouse wheel event on Mac OSX. A pretty basic functionality you would think. If your interface is heavily relying on mouse scrolling, [...]]]></description>
			<content:encoded><![CDATA[<p>One of the great advantages of Flash technology is cross-browser and cross-platform compatibility. That is almost entirely true but a few things did slip Adobe.</p>
<p>A big issue that was overlooked is support for mouse wheel event on Mac OSX. A pretty basic functionality you would think. If your interface is heavily relying on mouse scrolling, your audience on Mac's will probably have a "so how does this work" blank stare.</p>
<p><span id="more-1147"></span></p>
<p>Google didn't overlook this in their implementation of Maps, but most apps I've seen online did.</p>
<p>There is a very nice and simple solution to this issue coming from <a href="http://hasseg.org" target="_blank">hasseg.org</a> and I find it very important to put this little effort in to maintain same look and feel of application interface across platforms.</p>
<p>Solution is executed with help from JavaScript. Mouse wheel events get passed to Flash player and parsed to simulate regular functionality.</p>
<p>A lot of praise to <a href="http://hasseg.org" target="_blank">hasseg.org</a> for coming up with and publishing <a href="http://hasseg.org/stuff/FlexOSXMouseWheel/OSXMouseWheelSupportForFlex2.zip">working source code</a> of this solution.</p>
<p>You can find the full explenation on this <a href="http://hasseg.org/blog/?p=3" target="_blank">blog post</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AgileAjax?a=5c8JL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=5c8JL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=q75jL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=q75jL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=oJSjL"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=oJSjL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=Frqkl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=Frqkl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AgileAjax?a=cZltl"><img src="http://feeds.feedburner.com/~f/AgileAjax?i=cZltl" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AgileAjax/~4/396423504" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2008/09/mouse-wheel-scroll-event-in-flash-player-running-on-a-mac/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.pathf.com/blogs/2008/09/mouse-wheel-scroll-event-in-flash-player-running-on-a-mac/</feedburner:origLink></item>
		<item>
		<title>iPhone Usability: More Taps, Less In My Head</title>
		<link>http://feeds.feedburner.com/~r/AgileAjax/~3/395567104/</link>
		<comments>http://www.pathf.com/blogs/2008/09/iphone-usability-more-taps-less-in-my-head/#comments</comments>
		<pubDate>Wed, 17 Sep 2008 21:23:34 +0000</pubDate>
		<dc:creator>Noel Rappin</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1153</guid>
		<description><![CDATA[





The background image was probably taken from Scott McCloud's web site


Consider this my somewhat belated follow up to Brian's post about iPhone usability.
First, one pure follow-up. If you are so inclined, you can join an online petition calling for Apple to allow iPhone users or developers to disable keyboard auto correct if they so desire. [...]]]></description>
			<content:encoded><![CDATA[<div class="right">
<a href=""><br />
<img src="http://www.pathf.com/blogs/wp-content/uploads/2008/09/img-0005.png" alt="IMG_0005.PNG" border="0" width="160" height="240" class="right"/><br />
</a><br />
<br clear="all"/><br />
<span class="right" style="font-size: smaller"><br />
<a href="http://www.scottmccloud.com">The background image was probably <br/>taken from Scott McCloud's web site</a><br />
</span>
</div>
<p>Consider this my somewhat belated follow up to <a href="http://www.pathf.com/blogs/2008/09/four-blatant-iphone-usability-blunders-and-one-constant-annoyance/">Brian's post</a> about iPhone usability.</p>
<p>First, one pure follow-up. If you are so inclined, you can join an <a href="http://please-let-us-disable-autocorrection-steve.com/">online petition</a> calling for Apple to allow iPhone users or developers to disable keyboard auto correct if they so desire. </p>
<p>Here are my usability notes. I should say, I'm not a complete mobile warrior or anything, so there are probably other users a lot more dependent on, say, mobile email than I am. Also, the iPhone is my first smartphone, so I don't have any residual BlackBerry or Window Mobile experiences to compare it to.</p>
<h3>Phone Usability</h3>
<p>For all that everybody focuses on the fancy stuff, an iPhone still needs to allow you to make and receive phone calls. I have to say, the basic phone interface is perhaps my favorite of the built in Apple applications. The basic set of in-call options (speaker, mute, etc...) are clearly and cleanly presented with large buttons, reducing the need to remember how to trigger different features. The visual voice mail interface is outstanding -- almost making it pleasant to deal with voice mail.</p>
<h3>One More Thing...</h3>
<p>The iPhone 2.x OS features an unusual password entry field, in that the most recent character typed is displayed plain while all the other characters are masked. The idea, presumably is to make it easier to catch password typos, and it's (I guess?) not all that likely that somebody would look over your shoulder to catch a password.</p>
<p>Still, the behavior feels weird. I thought it was a bug the first time I saw it. I opened this up on <a href="http://www.twitter.com/noelrap">my twitter feed</a> and got exactly two responses. One in favor, one against. Obviously the masses have spoken. What do you think?</p>
<p><span id="more-1153"></span></p>
<p>There's an interesting User Experience issue here -- certain basic phone actions take more steps on the iPhone then they would have on my non-smart LG flip phone. The clearest example of this is dialing a known favorite contact. On the LG, up to 8 contacts are associated with numbers, and they can be dialed just by holding down the appropriate number -- one step. On the iPhone I have to open the phone app, open the favorites tab, and select my contact -- three steps (although you can set the phone to go directly to favorites from a double-tap on the home button).</p>
<p>The tradeoff here is user cognitive load versus steps. The downsides of the LG method are that a) it's limited to a small number of contacts, and b) it requires me to keep in my head who each number refers to. On the iPhone, I can have as many favorites as I want, and I can actually see who they are. Overall, that makes the iPhone feel more user-friendly even if making the call takes an extra second. </p>
<p>The iPhone interface is also more flexible, finding an arbitrary contact is much faster on the iPhone (because scrolling is faster), even though there are clear limitations to searching for contacts (recommended: using the Google Mobile App, which searches your local contacts..)</p>
<p>The point here is not that the iPhone is better designed than a regular non-smart phone, that would hardly be surprising. The point is that the iPhone uses it's best hardware asset -- the screen, to advantage in making using basic features easier to manage. (To a lesser extent, the same thing happens for, say, accessing the keypad during a call -- an extra step, but clearer options and more flexibility)</p>
<p>Oh, and while I'm here, I have to point out a little feature that I like. I have several contacts where two people have the same home number. If the two people have different last names, then a call from the number shows up as "Fred Flintstone or Barney Rubble". That's nice, but even better is if the two people have the same last names, and the caller ID shows "Fred or Wilma Flintstone". Minor point, but it shows that some thought went into the display.</p>
<h4>iPod Usability Nit</h4>
<p>I use the phone for iPod functionality pretty frequently, and I have a couple of annoying nits.</p>
<p>On a traditional iPod, the music display shows the time remaining in the song, and it's a button click to show the volume. This makes sense, because the time remaining is what is changing at, at least for me, is checked more frequently. The volume dis