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

<channel>
	<title>Appcelerant &#187; Opinion</title>
	<atom:link href="http://www.appcelerant.com/category/opinion/feed" rel="self" type="application/rss+xml" />
	<link>http://www.appcelerant.com</link>
	<description>Appcelerator blog focused on helping you build your next killer mobile, desktop and web based applications</description>
	<lastBuildDate>Thu, 11 Mar 2010 01:15:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>The Possibilities for Fast JavaScript</title>
		<link>http://www.appcelerant.com/the-possibilities-for-fast-javascript.html</link>
		<comments>http://www.appcelerant.com/the-possibilities-for-fast-javascript.html#comments</comments>
		<pubDate>Wed, 01 Oct 2008 15:09:51 +0000</pubDate>
		<dc:creator>Mark Luffel</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://www.appcelerant.com/?p=88</guid>
		<description><![CDATA[There&#8217;s been lots of exciting news this summer about JavaScript performance improvements. We have Firefox&#8217;s TraceMonkey, Safari/WebKit&#8217;s SquirrelFish, and Google Chrome&#8217;s V8 all improving by leaps and bounds. On a sightly less exciting note, IE8 will contain 400 fewer memory leaks.
This is all very exciting for developers of highly-interactive web-apps, and it makes the Appcelerator [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "The Possibilities for Fast JavaScript", url: "http://www.appcelerant.com/the-possibilities-for-fast-javascript.html" });</script>]]></description>
			<content:encoded><![CDATA[<p></p><p>There&#8217;s been lots of exciting news this summer about JavaScript performance improvements. We have Firefox&#8217;s <a href="https://wiki.mozilla.org/JavaScript:TraceMonkey">TraceMonkey</a>, Safari/WebKit&#8217;s <a href="http://webkit.org/blog/214/introducing-squirrelfish-extreme/">SquirrelFish</a>, and Google Chrome&#8217;s <a href="http://code.google.com/apis/v8/intro.html">V8</a> all improving by leaps and bounds. On a sightly less exciting note, IE8 will contain <a href="http://blogs.msdn.com/ie/archive/2008/08/26/ie8-performance.aspx">400 fewer memory leaks</a>.</p>
<p>This is all very exciting for developers of highly-interactive web-apps, and it makes the Appcelerator style of client-side templating and interactivity even more responsive for the end-user. Though you may not see ray-tracers and bioinformatic apps being run in next year&#8217;s browsers, you&#8217;ll definitely see more processing and application state being moved from the server onto the client.</p>
<p>One rather surprising thing that speedy JavaScript enables is new languages inside your browser, like <a href="http://cappuccino.org/">Objective-J</a> or to some extent Appcelerator&#8217;s web expression mini-language. The surprising part about Objective-J is that it actually parses and interprets a full, real programming language when you open up a page. Seems like a lot of work, no? Regardless, the apps it generates are quite responsive.</p>
<p>Another project that could use a modern JavaScript engine to change how we develop web apps is something like <a href="http://syncwith.us/">Prophet</a>, a distributed database that supports offline use because of its &#8220;self-healing conflict resolution&#8221;. Though it&#8217;s written in Perl, a port to JavaScript might now be feasible, enabling developers to construct applications that operate with all of their data management and business logic in the client.</p>
<p>There will of course be cool uses of JavaScript that we can&#8217;t even predict yet. Many thanks are due to the clever compiler hackers at Mozilla, Apple and Google!</p>
<p><a href="http://sharethis.com/item?&wp=2.8.4&amp;publisher=fb25d17b-38b5-47ed-9857-f171051e9899&amp;title=The+Possibilities+for+Fast+JavaScript&amp;url=http%3A%2F%2Fwww.appcelerant.com%2Fthe-possibilities-for-fast-javascript.html">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.appcelerant.com/the-possibilities-for-fast-javascript.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>The Separation of Content and Presentation</title>
		<link>http://www.appcelerant.com/the-separation-of-layout-and-presentation.html</link>
		<comments>http://www.appcelerant.com/the-separation-of-layout-and-presentation.html#comments</comments>
		<pubDate>Tue, 30 Sep 2008 14:20:30 +0000</pubDate>
		<dc:creator>Tejus Parikh</dc:creator>
				<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://www.appcelerant.com/?p=85</guid>
		<description><![CDATA[The long-held best practice is that an ideally structured website will have it&#8217;s content completely separated form it&#8217;s presentation.  For websites, there&#8217;s no fault I can find in this approach.  After all, you can change a lot about the site through some simple css tricks, stylesheets give you the most tools to work [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "The Separation of Content and Presentation", url: "http://www.appcelerant.com/the-separation-of-layout-and-presentation.html" });</script>]]></description>
			<content:encoded><![CDATA[<p></p><p>The long-held best practice is that an ideally structured website will have it&#8217;s content completely separated form it&#8217;s presentation.  For websites, there&#8217;s no fault I can find in this approach.  After all, you can change a lot about the site through some simple css tricks, stylesheets give you the most tools to work around browser bugs, and inline javascript is ugly and inflexible.  </p>
<p>However, the situation changes when you stop making web-sites and start using the web to build applications.  For one, markup is no longer there to suggest to a browser &#8220;hey I think this should be bold.&#8221;  It defines necessary functionality for user interaction.  Elements become interactive controls.</p>
<p>This doesn&#8217;t mean you can&#8217;t separate out the control functionality from presentation, but more that it doesn&#8217;t make sense.  The fundamental reason for separation of concerns is to allow one aspect to change without the other.  However, this no longer holds true.  A pretty common semantic refactor is changing the ID of an element because it&#8217;s name no longer describes what it does.  In JQuery, this means you&#8217;ll a situation like this.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript"><span style="color: #66cc66;">&lt;</span>script type=<span style="color: #3366CC;">&quot;text/javascript&quot;</span> charset=<span style="color: #3366CC;">&quot;utf-8&quot;</span><span style="color: #66cc66;">&gt;</span>
    <span style="color: #003366; font-weight: bold;">function</span> attach<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        $<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'#submit_button'</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">click</span><span style="color: #66cc66;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #009900; font-style: italic;">/* do some nasty js for ajax */</span> <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&lt;/</span>script<span style="color: #66cc66;">&gt;</span>
&nbsp;
<span style="color: #66cc66;">&lt;</span>button id=<span style="color: #3366CC;">&quot;submit_button&quot;</span><span style="color: #66cc66;">&gt;</span>Request More Info<span style="color: #66cc66;">&lt;/</span>button<span style="color: #66cc66;">&gt;</span></pre></div></div>

<p>&#8220;Submit_button&#8221; is a pretty crappy name, so when you change it, you need to change two different places.  The concerns aren&#8217;t so separate after all.</p>
<p>With a modern, interactive web application, it makes sense to put the functionality inline with the markup around the content.  It&#8217;s how you would define things in most thick-clients anyway.  It reduces the amount of problems that can arise through simple refactors.  It&#8217;s also a cleaner for the code-base, since it allows one to move elements around without the need for a monstrous, custom-functions library.  </p>
<p><a href="http://sharethis.com/item?&wp=2.8.4&amp;publisher=fb25d17b-38b5-47ed-9857-f171051e9899&amp;title=The+Separation+of+Content+and+Presentation&amp;url=http%3A%2F%2Fwww.appcelerant.com%2Fthe-separation-of-layout-and-presentation.html">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.appcelerant.com/the-separation-of-layout-and-presentation.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Effects of Open Source on Recruiting</title>
		<link>http://www.appcelerant.com/effects-of-open-source-on-recruiting.html</link>
		<comments>http://www.appcelerant.com/effects-of-open-source-on-recruiting.html#comments</comments>
		<pubDate>Tue, 23 Sep 2008 14:57:35 +0000</pubDate>
		<dc:creator>Matthew Quinlan</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[recruiting]]></category>

		<guid isPermaLink="false">http://www.appcelerant.com/?p=57</guid>
		<description><![CDATA[This is the first of a series of blogposts in which I will explore the impact of an open-source business model on different aspects of a software company.  During my tenure at both JBoss and Red Hat and now at my current employer Appcelerator,  I have witnessed these sometimes subtle, often dramatic, effects [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "Effects of Open Source on Recruiting", url: "http://www.appcelerant.com/effects-of-open-source-on-recruiting.html" });</script>]]></description>
			<content:encoded><![CDATA[<p></p><p>This is the first of a series of blogposts in which I will explore the impact of an open-source business model on different aspects of a software company.  During my tenure at both JBoss and Red Hat and now at my current employer Appcelerator,  I have witnessed these sometimes subtle, often dramatic, effects from finance to sales to engineering to IT to support to marketing to legal to human resources.  Everyone is affected in an open-source company.  </p>
<p>I have always enjoyed technical recruiting.  Probably a result of my first employer (Tallan) emphasizing the importance of everyone participating in the recruiting process.  The company actually tracked statistics on which employees had passed/failed interviewees and the success/failure of those interviewees who were actually hired.  There were no direct financial rewards for being the best interviewer, but there were definitely some bragging rights.  It was during this time that I realized just how different hardcore technical recruiting is from almost any other position.  When companies  hire accountants, managers, lawyers, marketers, and salespeople, so much of the decision was based upon a candidate&#8217;s history, his/her personality, and his/her attitude.  However, when a company is trying to fill a highly technical position, the VAST majority of the decision (hopefully) falls on his/her technical accumen.  Technical recruiting is different&#8230; and for good reason.</p>
<p>One of the most difficult challenges facing companies who need to fill highly technical positions is to accurately assess a candidate&#8217;s skillset and knowledge.  Notice that I distinguish between knowledge and skills.  While I do actually understand the bodily mechanics, balance, and coordination necessary to dunk a basketball&#8230; I still do not possess the athletic skill to do so.  Oftentimes, the HR department won&#8217;t even attempt to evaluate the technical aptitude of a candidate, just assuming that the candidate&#8217;s proficiency on any technical skill listed on the resume is likely to be sufficient for the position&#8217;s requirements.  That&#8217;s not a dig on HR, how on earth would we expect them to evaluate whether a candidate who lists Oracle as a skill is capable of installing Oracle, designing datamodels, or tuning Oracle databases?  It takes a rockstar to know one (&#8221;&#8230;it&#8217;s just a handful of people in the world who can tell the difference between you and me. But I&#8217;m one of them.&#8221; &#8211; from Goodwill Hunting).  When companies do actually attempt to assess technical talent it is often conducted haphazardly by someone who would rather be coding than interviewing candidates.  Either way, the result is that the quality of technical talent within an organization fluctuates more than the price of crude oil.  And because companies loathe the concept of shedding weak talent, mediocrity becomes the accepted standard.</p>
<p><strong>Enter open-source.</strong></p>
<p>The introduction of open-source into a software company&#8217;s business model adds a new way to evaluate the technical accumen of potential hires.  When looking to add new members to the team, no talent pool can compare with the members of that project&#8217;s open-source community.  Rather than conducting a series of interviews to determine the best candidate, you can easily see who the most engaged, most insightful, and most talented community members are based on their comments, their posts, their blogs, and their code contributions.  This approach to recruiting results in a ruthlessly efficient &#8220;weedout&#8221; process allowing a company to easily identify the best possible candidates.  Much like the ability of open-source software to prove it&#8217;s value before a company invests in support, this model requires a job candidate to prove his/her value prior to consideration.  </p>
<p>During my tenure at JBoss I specifically remember that the HR department was not allowed to interview or source candidates for positions on the core development team.  You first had to be a contributor.  And if your contributions showed that you were a rockstar, then we would send you an email and ask if you would like to make your hobby into your job.  Few people declined because it gives them a chance to work on something they are personally interested in (which isn&#8217;t necessarily true for most programmers).</p>
<p>Next week, Appcelerator will have our first official hire directly from our community.  Kevin Whinnery (formerly of Lawson Software) will be joining our team as an evangelist.  Kevin has been one of our most active members to date and is in the process of writing a book about Appcelerator.  This is a perfect example of someone who clearly proved their worth in advance&#8230; and we are thrilled to have him coming aboard.  Welcome to Appcelerator Kevin!  Are you next?</p>
<p><a href="http://sharethis.com/item?&wp=2.8.4&amp;publisher=fb25d17b-38b5-47ed-9857-f171051e9899&amp;title=Effects+of+Open+Source+on+Recruiting&amp;url=http%3A%2F%2Fwww.appcelerant.com%2Feffects-of-open-source-on-recruiting.html">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.appcelerant.com/effects-of-open-source-on-recruiting.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Developers and PHP – A Love and Hate Relationship?</title>
		<link>http://www.appcelerant.com/developers-and-php-%e2%80%93-a-love-and-hate-relationship.html</link>
		<comments>http://www.appcelerant.com/developers-and-php-%e2%80%93-a-love-and-hate-relationship.html#comments</comments>
		<pubDate>Wed, 17 Sep 2008 21:12:31 +0000</pubDate>
		<dc:creator>Jeff Haynie</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[zendcon php]]></category>

		<guid isPermaLink="false">http://www.appcelerant.com/?p=84</guid>
		<description><![CDATA[Appcelerator is attending ZendCon this week, talking with developers and vendors about great innovations within the PHP community. To break up the continuous cycle of keynotes and breakout sessions, we decided to capture a few conference attendees on video and find out what they really think about PHP.   You might be surprised to [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "Developers and PHP – A Love and Hate Relationship?", url: "http://www.appcelerant.com/developers-and-php-%e2%80%93-a-love-and-hate-relationship.html" });</script>]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://www.appcelerator.com">Appcelerator</a> is attending <a href="http://www.zendcon.com/ZendCon08">ZendCon</a> this week, talking with developers and vendors about great innovations within the PHP community. To break up the continuous cycle of keynotes and breakout sessions, we decided to capture a<a href="http://www.youtube.com/user/Appcelerator"> few conference attendees on video</a> and find out what they really think about PHP.   You might be surprised to hear some of the responses!</p>
<p>We have it all in our footage – PHP <a href="http://www.youtube.com/watch?v=cZXNQW8voXk">lovers</a> and <a href="http://www.youtube.com/watch?v=RDlJ5mXvA08">haters</a>, <a href="http://www.youtube.com/watch?v=17m66k53vZE">cool apps</a>, the <a href="http://www.youtube.com/watch?v=2aSytXt4BBQ">worst PHP gaffes</a> and the highs and lows of working with the scripting language. We even got attendees to confess their true feelings about cars, Disney characters, and Britney Spears.  Yes, you heard correctly.  Britney Spears.   Check out these uncensored ZendCon PHP developers on our <a href="http://www.youtube.com/user/Appcelerator">YouTube channel</a>. </p>
<p><a href="http://sharethis.com/item?&wp=2.8.4&amp;publisher=fb25d17b-38b5-47ed-9857-f171051e9899&amp;title=Developers+and+PHP+%E2%80%93+A+Love+and+Hate+Relationship%3F&amp;url=http%3A%2F%2Fwww.appcelerant.com%2Fdevelopers-and-php-%25e2%2580%2593-a-love-and-hate-relationship.html">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.appcelerant.com/developers-and-php-%e2%80%93-a-love-and-hate-relationship.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Get &#8220;Rich&#8221; Quick : RIA Prototyping</title>
		<link>http://www.appcelerant.com/get-rich-quick-ria-prototyping.html</link>
		<comments>http://www.appcelerant.com/get-rich-quick-ria-prototyping.html#comments</comments>
		<pubDate>Thu, 28 Aug 2008 18:20:48 +0000</pubDate>
		<dc:creator>Matthew Quinlan</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[prototyping]]></category>
		<category><![CDATA[ria]]></category>

		<guid isPermaLink="false">http://www.appcelerant.com/?p=74</guid>
		<description><![CDATA[It&#8217;s the GUI stupid!
Many years ago, I consulted for a large semi-conductor company during the early stages of a software project. They had a highly detailed and fairly rigid process for software projects that started with a complete requirements document based on an extremely verbose and granular template. As the project progressed and I saw [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "Get &#8220;Rich&#8221; Quick : RIA Prototyping", url: "http://www.appcelerant.com/get-rich-quick-ria-prototyping.html" });</script>]]></description>
			<content:encoded><![CDATA[<p></p><p><strong>It&#8217;s the GUI stupid!</strong></p>
<p>Many years ago, I consulted for a large semi-conductor company during the early stages of a software project. They had a highly detailed and fairly rigid process for software projects that started with a complete requirements document based on an extremely verbose and granular template. As the project progressed and I saw the size of the document balloon from 50 pages to more than 200 pages, I had the realization that this document would never be read by ANYONE from beginning to end. The business owners who were responsible for ensuring that the requirements fit their actual business needs were completely overwhelmed by the document&#8217;s size and complexity. Six months later the business users were given their shiny new software and they were disappointed that the software didn&#8217;t match their expectations.</p>
<p>In reality, the software was a very solid effort that met all of the requirements specified in the document. However, business users had no ability to read the requirements document and imagine what the user interface might look like for the requirements provided.  I remember feeling that the business owners didn&#8217;t know what they really wanted and feeling resentful of that fact.  In retrospect, I realize that almost nobody knows exactly what they want, until they see it.  Why? Because to a user, the interface IS the software. Concepts like data models, middleware, rules engines, LDAP, and SSL have no real meaning outside of us techies.</p>
<p>So how do we avoid this?  Is <a href="http://en.wikipedia.org/wiki/Agile_software_development">Agile Development</a> the answer?  Agile is definitely a step in the right direction.  It codifies the practices that had evolved in the most successful and most productive software development teams of the 1990s. However, we need more. We need to enable our development teams to prototype the user interface quickly and easily so that users can actually see (better yet, use) the software EARLY in the process. In web 1.0 this was a fairly straightforward effort of building static HTML wireframes.  The problem was that this work was largely throwaway b/c they had to be rebuilt as servlets, JSPs, ASPs, PHPs, etc.</p>
<p>As our web applications become more sophisticated this approach starts to break down even further. Today, rich internet applications include syndicated content, widgets, DOM manipulation, Ajax calls, and often a substantial amount of JavaScript. Static wireframes just cannot easily emulate this kind of rich user experience accurately.</p>
<p><strong>What If?</strong></p>
<p>What if you could build the user interface prototype in a matter of days or weeks without a single line of server-side code or even a datamodel? What if the business owner could not only play with this prototype, but also provide context specific feedback seamlessly while exploring the prototype? Finally, what if the prototype wasn&#8217;t a prototype at all, but was the actual user-interface of the final product (zero throwaway code)&#8230; even if you haven&#8217;t decided which server-side technology you want to use (Java, .Net, Ruby, PHP, Python, Perl)?</p>
<p>This is exactly how we develop software for our consulting customers today using the Appcelerator platform. We&#8217;ve been doing this for over a year now, but we haven&#8217;t really given it a name until recently. We call it &#8220;Interactive Use-Cases&#8221;. Essentially, we skip the entire functional requirements definition phase and move directly from use-cases to working prototype! This is only possible because of the advantages that the Appcelerator platform provides us. Let me explain.</p>
<p><strong>Technological Enablers</strong></p>
<p>First, Appcelerator&#8217;s widget library, <a href="http://doc.appcelerator.org/overview/web_expression_language/index.html">web expression language</a>, and <a href="http://doc.appcelerator.org/overview/ria_messaging_basics/index.html">message-oriented architecture</a> were designed to enable web developers to build UIs with the minimal amount of code (read: JavaScript) possible.  As an example, Ajaxian&#8217;s Dion Almaer posted a small interactive web page on <a href="http://almaer.com/blog/enjoying-the-observer-pattern-with-custom-events#comment-39349">his blog</a> and invited people to port it to their favorite JavaScript framework.  Compare the ViewSource of the <a href="http://google-ajax-examples.googlecode.com/svn/trunk/customevents/appcelerator.html">Appcelerator version</a> to those of the <a href="http://google-ajax-examples.googlecode.com/svn/trunk/customevents/index.html">other frameworks</a>.  More app + less code = better productivity.</p>
<p>Second, the fact that you are not generating your HTML from server-side scripts frees you from the wasted effort associated with building throwaway static wireframes.  Build applications as Ajax enabled .html files which dynamically pull data/content from the server and (re)render those sections of the page accordingly.</p>
<p>Third, our message-oriented architecture is ideal when prototyping because message subscribers in the browser do not care about the source of their messages (that&#8217;s the point of publish/subscribe architectures).  So build the entire user interface with the exact messaging code that they will need for production use.  But instead of building a datamodel, DAO objects, DTOs, business logic, and such to provide the actual service implementations, just add a single line to your webapp to include a single JavaScript file containing mock implementations of these backend services.  In 90% of the cases you can mock that service with a <a href="http://appcelerator.pastebin.com/f1c9bd53e">couple lines of JavaScript</a> that generates a JSON message with a mock payload.</p>
<p>My favorite part about this approach is that once you have gotten sign-off from the business owners, you can remove a single line from the application and all of the mock services have now been turned off.  And the server-side programmers have a complete contract of every service which needs to be developed along with test data.  Even better, they can choose to implement those services in any language they prefer because the UI is just producing/consuming JSON.</p>
<p>Fourth, thanks to a recent enhancement by <a href="http://www.appcelerator.org/profile?id=29">Andrew Zuercher</a>, we can easily collect user feedback on our user interface prototype by passing an additional URL parameter which highlights the border of any HTML control on mouseOver.  By CTRL-clicking on any highlighted element a feedback dialog box appears that includes the specific page and HTML control being commented on.  Users can see other users comments so that feedback effort isn&#8217;t duplicated.  UI elements that already have comments are indicated with red borders.</p>
<p><a href='http://www.appcelerant.com/wp-content/uploads/2008/08/annotate.png'><img src="http://www.appcelerant.com/wp-content/uploads/2008/08/annotate.png" alt="annotated web page screenshot" title="annotate" width="486" height="471" class="aligncenter size-full wp-image-75" /></a></p>
<p>Everyone knows that prototyping is a valuable exercise that improves the likelihood that the business users will be satisfied with the end-product.  However, the limitations of web technology have made it prohibitively expensive and time consuming for all but the most critical web projects&#8230;&#8230; until now.</p>
<p><a href="http://sharethis.com/item?&wp=2.8.4&amp;publisher=fb25d17b-38b5-47ed-9857-f171051e9899&amp;title=Get+%26%238220%3BRich%26%238221%3B+Quick+%3A+RIA+Prototyping&amp;url=http%3A%2F%2Fwww.appcelerant.com%2Fget-rich-quick-ria-prototyping.html">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.appcelerant.com/get-rich-quick-ria-prototyping.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>The Death of Offline Web Apps?</title>
		<link>http://www.appcelerant.com/the-death-of-offline-web-apps.html</link>
		<comments>http://www.appcelerant.com/the-death-of-offline-web-apps.html#comments</comments>
		<pubDate>Wed, 06 Aug 2008 20:08:28 +0000</pubDate>
		<dc:creator>Matthew Quinlan</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[offline]]></category>

		<guid isPermaLink="false">http://www.appcelerant.com/?p=69</guid>
		<description><![CDATA[I love my Google Reader (especially the VI hotkey navigation).  I really love the fact that I can take my RSS feeds offline with me when I&#8217;m about to jump on a plane.  However, what happens when the concept of being disconnected from the Internet disappears?
I tend to be a ridiculously early adopter [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "The Death of Offline Web Apps?", url: "http://www.appcelerant.com/the-death-of-offline-web-apps.html" });</script>]]></description>
			<content:encoded><![CDATA[<p></p><p>I love my Google Reader (especially the VI hotkey navigation).  I really love the fact that I can take my RSS feeds offline with me when I&#8217;m about to jump on a plane.  However, what happens when the concept of being disconnected from the Internet disappears?</p>
<p>I tend to be a ridiculously early adopter of technology and therefore end up with hopelessly outdated technology that costs 5x more than it should.  I have always thought that connectivity should be independent of wires &amp; location.  From <a href="http://www.amazon.com/OmniSky-Minstrel-Wireless-Modem-Palm/dp/B00004Y7T3">OmniSky</a> (for my Palm Pilot in 1999) to <a href="http://www.duxcw.com/digest/Reviews/Network/intel/anysum.htm">Intel Anypoint</a> (1.5 mbps baby) to <a href="http://www.epinions.com/content_19865964164">digital phone cards</a> (PocketPC) to <a href="http://www.pcmag.com/article2/0,1759,1650291,00.asp">EvDO cards</a>&#8230; there&#8217;s almost never a reason not to have an IP address except on an airplane, a submarine, in a <a href="http://en.wikipedia.org/wiki/Faraday_cage">faraday cage</a>, or in deep space.  Since I&#8217;m unlikely to encounter three of those situations it&#8217;s really about the ability to access the net at altitudes of 30,000ft.</p>
<p>I just read today that <a title="Delta goes WiFi" href="http://www.marketwatch.com/news/story/delta-become-only-major-us/story.aspx">Delta has announced it is going to provide WiFi on all domestic flights</a>.  And it seems <a href="http://www.usatoday.com/money/industries/travel/2007-12-06-jetblue-wifi-service_N.htm">JetBlue has been offering limited access since 2007</a>.</p>
<p>As competition forces the cost of mobile connectivity to decline, offline may be a stop-gap solution that eventually becomes a solution in search of a problem.  Now this doesn&#8217;t mean that some of the advancements that have been associated with offline will also disappear (local data storage, desktop integration, etc.).   They will continue to advance the ability of browser-based applications regardless of connectivity.  However, the idea that my user interface needs to be stored locally will soon seem quaint.</p>
<p>note: cross-posted at my <a href="http://mattquinlan.com">personal blog</a></p>
<p><a href="http://sharethis.com/item?&wp=2.8.4&amp;publisher=fb25d17b-38b5-47ed-9857-f171051e9899&amp;title=The+Death+of+Offline+Web+Apps%3F&amp;url=http%3A%2F%2Fwww.appcelerant.com%2Fthe-death-of-offline-web-apps.html">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.appcelerant.com/the-death-of-offline-web-apps.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Lipstick on CGI</title>
		<link>http://www.appcelerant.com/lipstick-on-cgi.html</link>
		<comments>http://www.appcelerant.com/lipstick-on-cgi.html#comments</comments>
		<pubDate>Thu, 05 Jun 2008 18:43:52 +0000</pubDate>
		<dc:creator>Matthew Quinlan</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[appcelerator]]></category>

		<guid isPermaLink="false">http://www.appcelerant.com/?p=58</guid>
		<description><![CDATA[It was 1997 and I hadn&#8217;t really embraced the web yet as a programmer.  While I had played with HTML, I was convinced that real developers wrote in C/C++ and PL-SQL.  HTML was for sissies.   One of my co-workers was building an online search engine for an e-commerce company and he [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "Lipstick on CGI", url: "http://www.appcelerant.com/lipstick-on-cgi.html" });</script>]]></description>
			<content:encoded><![CDATA[<p></p><p>It was 1997 and I hadn&#8217;t really embraced the web yet as a programmer.  While I had played with HTML, I was convinced that <strong>real</strong> developers wrote in C/C++ and <a href="http://en.wikipedia.org/wiki/PL/SQL">PL-SQL</a>.  HTML was for sissies.   One of my co-workers was building an online search engine for an e-commerce company and he introduced me to <a href="http://en.wikipedia.org/wiki/Common_Gateway_Interface">CGI</a> programming.   The idea of redirecting the incoming HTTP request to a script that generated HTML on the fly instead of regurgitating the contents of a file seemed immensely cool to me at the time.   Technology advanced and I followed with SSI, then servlets, then ASP, then JSP, then taglibs, then struts, then JSF, etc.</p>
<p>However, I never really questioned the basic premise that web applications are essentially a simple collection of scripts which dynamically generate HTML documents and share a server-side context (http session).   Afterall, all of the server-side web technologies I had used were based on the same fundamental concept that CGI had introduced back in 1995.   Most innovations in this area were just further abstractions built on top of this concept (e.g. <a href="http://en.wikipedia.org/wiki/JavaServer_Pages#JSP_Tag_Libraries">JSP custom taglibs</a>).    But abstraction is a double-edged sword.   It eliminates the need to understand everything going on under the covers.    However, each abstraction layer typically includes its own configuration (struts XML hell), quirks, and conventions.  Which results in the need for someone to define &#8220;best practices&#8221; based on their personal pain of figuring out where the friction points are between the layers of abstraction that live just above and just below it (e.g. <a href="http://en.wikipedia.org/wiki/Data_Transfer_Object">ValueObjects/DataTransferObjects</a>).</p>
<p>Building web applications has become much more complex than necessary and the the development community has responded with simplification efforts (think Ruby on Rails, annotations, configuration by exception, etc.).  Each of these efforts were a significant evolution of web application development, but none were revolutionary.  While undeniably valuable, they were still just lipstick on CGI.</p>
<p><strong>True Web Clients<br />
</strong></p>
<p>There is an opportunity today that really hasn&#8217;t existed until recently (outside of building GUIs completely inside a proprietary player like Flash).    <strong>Stop generating HTML on the server-side.</strong> Write rich web applications as standalone clients based on open standards such as HTML, CSS, and JavaScript.    Call it Client-Server 2.0 if you like, but without the baggage of software distribution, version management, and platform dependencies.  While JavaScript was the foundation of this revolution it was the introduction of CSS, DOM manipulation, and finally AJAX that allowed us to build truly standalone web clients.</p>
<p>So how do you go about building true web clients?  Until recently it was actually rather painful to do so.  You had to be a JavaScript guru and even then you typically were weaving together multiple 3rd party JavaScript libraries and frameworks to provide the necessary event handling, DOM manipulation, parsing, etc.  Appcelerator was designed specifically to simplify the development of web clients so that mere mortals can develop them (not just the PhDs @ Google).  Yes, you can use all of the Appcelerator widgets and even leverage the client messaging bus without giving up your HTML generation scripts (and many people do).  But once you&#8217;ve experienced the elegant simplicity of developing true standalone web clients that invoke services for business logic &amp; data access, you will never go back.</p>
<p>The shift is already underway.   The client operating system <strong>IS </strong>the browser.  See the rise of offline, single-site-browsers, and desktop web integration.  The clients call services and re-render themselves accordingly.  The only question remaining is&#8230; how long before <strong>you </strong>starting writing webapps as standalone web clients?</p>
<p>upcoming blogpost teaser : HTTP sessions are so 1998</p>
<p><a href="http://sharethis.com/item?&wp=2.8.4&amp;publisher=fb25d17b-38b5-47ed-9857-f171051e9899&amp;title=Lipstick+on+CGI&amp;url=http%3A%2F%2Fwww.appcelerant.com%2Flipstick-on-cgi.html">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.appcelerant.com/lipstick-on-cgi.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RIA + SOA: The Next Episode</title>
		<link>http://www.appcelerant.com/ria-soa-the-next-episode.html</link>
		<comments>http://www.appcelerant.com/ria-soa-the-next-episode.html#comments</comments>
		<pubDate>Mon, 10 Mar 2008 21:42:02 +0000</pubDate>
		<dc:creator>Nolan Wright</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[appcelerator]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[dhtml]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[ria]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[SOUI]]></category>
		<category><![CDATA[web1.0]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://www.appcelerant.com/ria-soa-the-next-episode.html</guid>
		<description><![CDATA[The world of web development is moving away from MVC-based web architectures and towards a client/server model that is probably best described as RIA + SOA, where RIA represents the rich user interface and SOA represents the services that it consumes.  There has been a lot of buzz around rich Web 2.0 applications, but [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "RIA + SOA: The Next Episode", url: "http://www.appcelerant.com/ria-soa-the-next-episode.html" });</script>]]></description>
			<content:encoded><![CDATA[<p></p><p>The world of web development is moving away from MVC-based web architectures and towards a client/server model that is probably best described as RIA + SOA, where RIA represents the rich user interface and SOA represents the services that it consumes.  There has been a lot of buzz around rich Web 2.0 applications, but they will not become mainstream until the next generation of web platforms emerge &#8211; fully integrated platforms that enable RIA + SOA.</p>
<h3>State of the Union</h3>
<p>Currently, in the standards-based world of HTML, CSS and Javascript, RIA developers have to assemble multiple third-party libraries and frameworks in order to build a rich user interface.  This “a la carte” approach to building RIAs places an unnecessary burden on the developer.  Instead of focusing on building applications, the developer must spend time finding, integrating, and versioning the various pieces of their RIA development platform.  The same holds true on the SOA side; developers are left to figure out how to create services and how to integrate them with their RIA front-ends.  Developers need a platform that addresses every aspect of building an application, so that they can focus on doing what they do best – build applications.  The question is: what should a next-generation RIA + SOA platform look like?  The best place to start is with the activities that are required to build an RIA + SOA-based application.  At a high-level these activities include:</p>
<p style="color: #870000; font-weight: bold; font-size: 16px">1. Design the “look” of the application</p>
<p>This is the general appearance of an application.  It includes things like: color, fonts, graphics, and a general page layout.  </p>
<p>Common toolsets: HTML, CSS and images </p>
<p style="color: #870000; font-weight: bold; font-size: 16px">2. Integrate widgets </p>
<p>Widgets encapsulate a set of common capabilities within a single component.  They typically contain both “look and feel” as well as a set of pre-defined dynamic behaviors.  They are a fundamental building block of an RIA.</p>
<p>Common toolsets: ExtJS, Dojo, Yahoo YUI and several other small widget projects</p>
<p style="color: #870000; font-weight: bold; font-size: 16px">3. Add dynamic behavior to the user interface </p>
<p>Creating dynamic behavior in the user interface involves two things:</p>
<ul style="margin-left: 20px">
<li style="margin-bottom: 10px"> Event handling </li>
<li style="margin-bottom: 10px">Document Object Model (DOM) Manipulation</li>
</ul>
<p>Event handling is the ability to know when a particular event occurs (e.g., a user clicks a button or a service response is received).  DOM Manipulation allows you to dynamically change the user interface based on the receipt of an event.</p>
<p>Common toolsets: Javascript libraries like JQuery, Prototype, and Scriptaculous</p>
<p style="color: #870000; font-weight: bold; font-size: 16px">4. Consume services</p>
<p>Consuming backend services is a key capability of an RIA.  It enables the creation of single page user interfaces that exchange application data with services. It also enables a clean separation between the user interface and the service tier.  The most common method for interacting with services is Ajax.</p>
<p>Common toolsets: Javascript libraries like JQuery and Prototype</p>
<p style="color: #870000; font-weight: bold; font-size: 16px">5. Create services</p>
<p>Services provide an interface to data and application business logic.  </p>
<p>Common toolsets: There are several frameworks available for creating services in your programming language of choice</p>
<p>Now that we have a sense of what is required to build RIA + SOA-based applications, we can take a look at how these activities should be integrated in order to provide the most value to developers.  The following sections outline the defining characteristics of a next-generation RIA + SOA platform. </p>
<h3>Support for HTML and CSS</h3>
<p>These two languages are perfectly suited for implementing the “look” of an application, plus they are familiar to most developers of web-based user interfaces.  There is no reason to recreate the wheel.</p>
<h3>Provide an Open Widget Framework</h3>
<p>As stated earlier, widgets are a fundamental building block of RIAs.  There are several widget toolkits available from the likes of Yahoo, Dojo, and ExtJS.  There are also several standalone widgets that have been created by smaller projects and individuals.  You can build RIAs using these widgets, but there are some catches:</p>
<ul style="margin-left: 20px">
<li style="margin-bottom: 10px">It’s unlikely that one widget offering is going to meet all of your needs</li>
<li style="margin-bottom: 10px">Integrating different third-party widgets may require custom code as well as an in depth understanding of how each widget works</li>
<li style="margin-bottom: 10px">Writing new widgets is challenging because you either have to write to the low-level API of your preferred widget toolkit, or you have to write your own from scratch</li>
<li style="margin-bottom: 10px">Some widget frameworks require developers to write a significant amount of Javascript just to use their widgets, which is problematic for those with little to no Javascript experience.</li>
</ul>
<p>In order to address the problems above, an RIA + SOA platform should provide an Open Widget Framework that has the following capabilities:</p>
<ul style="margin-left: 20px">
<li style="margin-bottom: 10px">Support integration of existing third-party widgets</li>
<li style="margin-bottom: 10px">Provide a simple API for creating new widgets</li>
<li style="margin-bottom: 10px">Enable widgets to be used via simple markup (no Javascript required)</li>
<li style="margin-bottom: 10px">Support a distribution model that makes it easy to submit, find and use new widgets.</li>
</ul>
<p>An Open Widget Framework will provide developers with one source for obtaining widgets and one simple way to integrate these widgets into their application.  If a particular widget is not available, it can be easily created using the Open Widget Framework API.  </p>
<p>Given the importance of widgets within RIA development and the fragmented nature of widgets today, an Open Widget Framework should be considered an essential part of any RIA + SOA platform.</p>
<h3>Provide an Integrated RIA Programming Model</h3>
<p>Developing RIAs requires significantly more user interface code than traditional web-based applications.  As a result, a next generation platform needs to provide an integrated RIA programming model that facilitates and simplifies the key user interface programming tasks.  These tasks include:</p>
<ul style="margin-left: 20px">
<li style="margin-bottom: 10px">Event handling</li>
<li style="margin-bottom: 10px">DOM manipulation</li>
<li style="margin-bottom: 10px">Service consumption (Ajax).</li>
</ul>
<p>Event handling, DOM manipulation and Ajax enable the “rich” in rich Internet application.  It doesn’t take much investigation to see that they are closely related. To illustrate this point, let’s look at the typical steps involved with an RIA login form submission:</p>
<ul style="margin-left: 20px">
<li style="margin-bottom: 10px">Login button is clicked (event handling)</li>
<li style="margin-bottom: 10px">Service request is sent (Ajax)</li>
<li style="margin-bottom: 10px">Some type of activity indicator is displayed (DOM Manipulation)</li>
<li style="margin-bottom: 10px">Service returns (Ajax)</li>
<li style="margin-bottom: 10px">Activity indicator is hidden (DOM Manipulation)</li>
<li style="margin-bottom: 10px">A Login “success” message is displayed (DOM Manipulation).</li>
</ul>
<p>Despite their close relationship, most frameworks and libraries provide only light integration between the three, leaving the developer to bridge the gap.  To illustrate this point, let’s look at some code.  In the example below, we will set the contents of one combo box when the value of a second combo box changes.  This example is written using JQuery:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="html4strict">$(function(){
  $(&quot;select#comboOne&quot;).change(function(){
    $.getJSON(&quot;/combo.php&quot;,{id: $(this).val(), ajax: 'true'}, function(j){
      var options = '';
      for (var i = 0; i <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;</span> j.length; i++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        options +<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'&lt;option value=&quot;'</span> + j<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.optionValue + <span style="color: #ff0000;">'&quot;&gt;</span>' + j[i].optionDisplay + '<span style="color: #009900;">&lt;/option&gt;</span>';
      }
      $(&quot;select#comboTwo&quot;).html(options);
    })
  })
})</span></pre></td></tr></table></div>

<p>Now, let’s look at how this could be accomplished using a fully integrated approach to event handling, DOM manipulation and Ajax.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="html4strict"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;select</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span>”comboOne” 
on<span style="color: #66cc66;">=</span>”change then r:load.combo2.request”<span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/select&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;select</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span>”comboTwo” 
on<span style="color: #66cc66;">=</span>”r:load.combo2.response then <span style="color: #000066;">value</span><span style="color: #66cc66;">&#91;</span>property<span style="color: #66cc66;">=</span><span style="color: #000066;">rows</span>,<span style="color: #000066;">text</span><span style="color: #66cc66;">=</span><span style="color: #000066;">text</span>,<span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #000066;">value</span><span style="color: #66cc66;">&#93;</span>”<span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/select&gt;</span></span></pre></td></tr></table></div>

<p>These two examples accomplish the same thing, but in very different ways.  The first example requires more code and it’s all in Javascript.  The second example uses a simple expression language to do the same thing.  Let’s take a closer look at the syntax.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html4strict">on=”change then r:load.combo2.request”</pre></td></tr></table></div>

<p>In this expression, the Ajax request message <tt>r:load.combo2.request</tt> will be sent when the <tt>&lt;select&gt;</tt> gets a “change” event – pretty simple. Now, let’s look at the second expression:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html4strict">on=”r:load.combo2.response then value[property=rows,text=text,value=value]”</pre></td></tr></table></div>

<p>When the Ajax response message <tt>r:load.combo2.response</tt> is received, the contents of the second combo box are set based on data in the response message.</p>
<p>Let’s take this example one step further by adding a visual queue when the response message is received.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="html4strict"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;select</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span>”comboTwo” 
on<span style="color: #66cc66;">=</span>”r:load.combo2.response then <span style="color: #000066;">value</span><span style="color: #66cc66;">&#91;</span>property<span style="color: #66cc66;">=</span><span style="color: #000066;">rows</span>,<span style="color: #000066;">text</span><span style="color: #66cc66;">=</span><span style="color: #000066;">text</span>,<span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #000066;">value</span><span style="color: #66cc66;">&#93;</span>
and effect<span style="color: #66cc66;">&#91;</span>Highlight<span style="color: #66cc66;">&#93;</span>”<span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/select&gt;</span></span></pre></td></tr></table></div>

<p>By adding and <tt>effect[Highlight]</tt> to our expression, we are able to  incorporate a subtle effect that lets the user know that the combo box values have changed.</p>
<p>These code examples demonstrate the power and simplicity of a fully integrated approach to event handling, DOM manipulation and Ajax.   Developers that have little to no Javascript experience will find it easy to learn an expression language like the one above.  It will enable them to get productive quickly, since they don’t have to climb a steep learning curve.  Of course, there are developers that are comfortable with Javascript and would prefer to use it.  As a result, an integrated RIA programming model should also support the use of Javascript, specifically in a way the supports the separation of behavior from markup.  This is commonly referred to as unobtrusive Javascript.  Let’s look at an example:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="html4strict"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;img</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span>”progress_image” <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span>”images<span style="color: #66cc66;">/</span>indicator.gif”<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
$(“progress_images”).on(“r:login.request then show”).on(“r:login.response then hide”);</pre></td></tr></table></div>

<p>In this example, the <tt>&lt;img&gt;</tt> markup is separate from the Javascript code that defines its behavior – i.e., “show” when the login request message is received and “hide” when the login response is received.  This type of programming model is good for developers that prefer to do their RIA programming in Javascript.</p>
<p>An Integrated RIA Programming model is a fundamental component of an RIA + SOA platform.  It provides developers with a single integrated mechanism for handling the major RIA programming activities.  The net result is that developers can build rich user interfaces faster and with significantly less code than is required today.</p>
<h3>Provide an Integrated Services Platform</h3>
<p>RIA only gets us halfway to our goal of building a rich application.  We still need to provide an answer for the SOA piece of RIA + SOA.  Unfortunately, the current crop of Web 2.0 toolkits and frameworks primarily focus on RIA; they provide little to no support for building services.   This is problematic because developers are, once again, left to bridge the gap, which makes application development and maintenance unnecessarily more time consuming and difficult than it should be.  </p>
<p>A next generation RIA + SOA platform must address this gap by providing an integrated services platform that provides the following:</p>
<ul style="margin-left: 20px">
<li style="margin-bottom: 10px">Support for creating services in any programming language</li>
<li style="margin-bottom: 10px">Seamless interoperability between the RIA and SOA tiers</li>
<li style="margin-bottom: 10px">Ability to consume local mock services .</li>
</ul>
<p>Historically, web-based frameworks have been built around a particular programming language, but in the world of RIA + SOA this practice seems outdated and unnecessary.  RIAs only need to exchange application data with services, so they should be programming language agnostic.  The only required link between an RIA and its SOA-based services should be a lightweight message-based contract.  This loose coupling between the RIA and SOA tiers opens the door to a integrated services platform that enables developers to use any programming language for service creation without impacting the RIA tier of the application.  </p>
<p>An integrated services platform should also provide seamless interoperability between the RIA and SOA tiers.  Specifically, it should handle service routing and data marshalling on behalf of the developer. Here’s an example of a simple integrated approach to building a service.  This particular example uses Java.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="java">@Service <span style="color: #66cc66;">&#40;</span>request = ‘login.<span style="color: #006600;">request</span>’, response =’login.<span style="color: #006600;">response</span>’<span style="color: #66cc66;">&#41;</span>
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #993333;">void</span> loginRequest <span style="color: #66cc66;">&#40;</span>Message req, Message resp<span style="color: #66cc66;">&#41;</span>
						<span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #aaaadd; font-weight: bold;">Exception</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #aaaadd; font-weight: bold;">String</span> username = req.<span style="color: #006600;">getData</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">getString</span><span style="color: #66cc66;">&#40;</span>“username”<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
	<span style="color: #aaaadd; font-weight: bold;">String</span> password = req.<span style="color: #006600;">getData</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">getString</span><span style="color: #66cc66;">&#40;</span>“password”<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
	User user = UserDAO.<span style="color: #006600;">login</span><span style="color: #66cc66;">&#40;</span>username,password<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>user <span style="color: #66cc66;">!</span>=<span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#123;</span>
	          response.<span style="color: #006600;">getData</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">put</span><span style="color: #66cc66;">&#40;</span>“success”,<span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
	          response.<span style="color: #006600;">getData</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">put</span><span style="color: #66cc66;">&#40;</span>“user”,user<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
	          <span style="color: #000000; font-weight: bold;">return</span><span style="color: #66cc66;">;</span>
        <span style="color: #66cc66;">&#125;</span>
        response.<span style="color: #006600;">getData</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">put</span><span style="color: #66cc66;">&#40;</span>“success”,<span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>In the example above, there are two things to notice.  First, a plain Java object is turned into a service by simply adding a “Service” annotation to a Java method.  This annotation contains both the service request and service response message that this method handles, which makes routing configuration easy.  Second, working with service request and response data is simple and straightforward.  In the example, the entire User object is placed into the response message.  The service platform handles the data marshalling.  The result is that developer can focus on writing service logic instead of writing glue code, which ultimately results in faster development with less code.</p>
<p>Finally, if the contract between the RIA and its services is message-based, then it becomes possible to create local mock services.  Local mock services respond to remote requests but they exist locally within the RIA.  This is a powerful capability because it opens the door to creating fully functional RIA prototypes without writing a single line of service code.  These local mock services can be placed in a single file and removed once user interface development is complete.  Let’s look at an example.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="xml"><span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- Progress indicator --&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;img</span> <span style="color: #000066;">src</span>=”images/indicator.gif” <span style="color: #000066;">style</span>=”display:none
<span style="color: #000066;">on</span>=”r:login.request then show or r:login.response then hide”<span style="font-weight: bold; color: black;">/&gt;</span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- Login form --&gt;</span></span>
Username: <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;input</span> <span style="color: #000066;">type</span>=text” <span style="color: #000066;">fieldset</span>=”login” <span style="color: #000066;">id</span>=”username”<span style="font-weight: bold; color: black;">/&gt;</span></span>
Password: <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;input</span> <span style="color: #000066;">type</span>=”password” <span style="color: #000066;">fieldset</span>=”login” <span style="color: #000066;">id</span>=”password”<span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;input</span> <span style="color: #000066;">type</span>=”button” <span style="color: #000066;">value</span>=”Login” 
<span style="color: #000066;">on</span>=”click then r:login.request”<span style="font-weight: bold; color: black;">/&gt;</span></span></pre></td></tr></table></div>

<div style="text-align:center;font-size:14px;font-weight:bold">Login Form</div>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;app:script</span> <span style="color: #000066;">on</span>=”r:login.request then execute after 1s”<span style="font-weight: bold; color: black;">&gt;</span></span>
	$MQ(‘r:login.response’,{‘success’:true,’username’:’foo’});
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/app:script<span style="font-weight: bold; color: black;">&gt;</span></span></span></pre></td></tr></table></div>

<div style="text-align:center;margin-bottom:15px;font-size:14px;font-weight:bold">Mock Service</div>
<p>In the example above, we have a login form that generates the service request <tt>r:login.request</tt>. We also have an image that will show when <tt>r:login.request</tt> is received and hide when <tt>r:login.response</tt> is received.   The second part of the example is the mock service.  The mock service listens for the <tt>r:login.request</tt> service request and responds with a <tt>r:login.response</tt> message after one second in order to simulate service latency.  The login form has no knowledge of the service location; it simply responds to messages.  This simple example demonstrates how an entire RIA prototype can be built without writing any service code.  This prototype would be 100% reusable, and it has the added benefit of enabling developers to define the service contracts in advance of service creation.  The result is that service creation is greatly simplified because service developers not only have a fully functional prototype as a reference; they have a complete set of service interfaces.</p>
<h3>Conclusion</h3>
<p>Developers are currently caught in the middle of a fundamental shift in web application development.  We are moving away from the server-side MVC frameworks of Web 1.0 and towards a client/server architecture for the web, or more specifically RIA + SOA.  As a result of this shift, developers have been left to piece together their web development platform for rich web applications.  Of course, change creates opportunity.  The opportunity in this case is to build a next generation web platform that provides end-to-end support for building Web 2.0 applications.  At Appcelerator, we saw this shift coming well over a year ago.  Our response was to build the Appcelerator Platform; a platform built from the ground up to support RIA + SOA.  The examples used in this article are based on Appcelerator.  Of course, many different approaches will be taken to create the next generation of web platforms, but while the specific implementations may differ the general characteristics should remain the same.</p>
<div class="techtags">Tech Tags: <a href="http://technorati.com/tag/ajax," rel="tag" class="techtag">ajax,</a> <a href="http://technorati.com/tag/appcelerator," rel="tag" class="techtag">appcelerator,</a> <a href="http://technorati.com/tag/architecture," rel="tag" class="techtag">architecture,</a> <a href="http://technorati.com/tag/design," rel="tag" class="techtag">design,</a> <a href="http://technorati.com/tag/dhtml," rel="tag" class="techtag">dhtml,</a> <a href="http://technorati.com/tag/mvc," rel="tag" class="techtag">mvc,</a> <a href="http://technorati.com/tag/ria," rel="tag" class="techtag">RIA,</a> <a href="http://technorati.com/tag/soa," rel="tag" class="techtag">SOA,</a> <a href="http://technorati.com/tag/soui," rel="tag" class="techtag">soui,</a> <a href="http://technorati.com/tag/web1.0," rel="tag" class="techtag">web1.0,</a> <a href="http://technorati.com/tag/web2.0" rel="tag" class="techtag">web2.0</a></div>
<p><a href="http://sharethis.com/item?&wp=2.8.4&amp;publisher=fb25d17b-38b5-47ed-9857-f171051e9899&amp;title=RIA+%2B+SOA%3A+The+Next+Episode&amp;url=http%3A%2F%2Fwww.appcelerant.com%2Fria-soa-the-next-episode.html">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.appcelerant.com/ria-soa-the-next-episode.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Implementing an Appcelerator Plugin</title>
		<link>http://www.appcelerant.com/implementing-an-appcelerator-plugin.html</link>
		<comments>http://www.appcelerant.com/implementing-an-appcelerator-plugin.html#comments</comments>
		<pubDate>Tue, 04 Mar 2008 11:24:58 +0000</pubDate>
		<dc:creator>Andrew Zuercher</dc:creator>
				<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Example]]></category>
		<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://www.appcelerant.com/implementing-an-appcelerator-plugin.html</guid>
		<description><![CDATA[Purpose
The Appcelerator framework allows for the extension of the build and deployment process so that you can add components and modify the behavior of your service implementations.  It is quite powerful and not only restricted to services, plugins for example could span across to the modification of applications and the entire build and deployment [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "Implementing an Appcelerator Plugin", url: "http://www.appcelerant.com/implementing-an-appcelerator-plugin.html" });</script>]]></description>
			<content:encoded><![CDATA[<p></p><h3>Purpose</h3>
<p>The Appcelerator framework allows for the extension of the build and deployment process so that you can add components and modify the behavior of your service implementations.  It is quite powerful and not only restricted to services, plugins for example could span across to the modification of applications and the entire build and deployment process for that matter.  For simplicity, this article will identify how to create a new component added to our java service for monitoring performance.</p>
<h3>Install Appcelerator</h3>
<p>I&#8217;ve assumed that you&#8217;ve successfully downloaded and installed Appcelerator from <a href="http://www.appcelerator.org/products">http://www.appcelerator.org/products</a>.  Once you&#8217;ve gone through the installer you can get the java service</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html4strict">  app install:service java</pre></td></tr></table></div>

<p>You may want to get an existing plugin (I needed the java:spring plugin to implement my plugin):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html4strict">  app install:plugin java:spring</pre></td></tr></table></div>

<h3>Plugin Creation</h3>
<p>Lets assume that our plugin is going to be called java:perf, to create the plugin project:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="html4strict">  cd $HOME/workspace
  app create:plugin . java:perf</pre></td></tr></table></div>

<p>This will create a sub directory named java_perf, now you will want to create a proper license entry in your build.yml for example check out <a href="http://svn.appcelerator.org/appcelerator_plugins/java_perf/trunk/build.yml">build.yml</a>.  You now have the opportunity to modify the entry points in your <a href="http://svn.appcelerator.org/appcelerator_plugins/java_perf/trunk/src/java_perf.rb">java_perf.rb</a>.  I personally wanted to setup my install script so that:</p>
<ul>
<li> it dynamically builds the jar when we add the plugin to a project</li>
<li> modifies the spring.xml to include the bean entries for my component</li>
</ul>
<p>All of this is in before_add_plugin(event) callback.  If you want to see where this is called, check out <a href="http://svn.appcelerator.org/appcelerator_sdk/trunk/components/runtime/src/cmdline/commands/add_plugin.rb">add_plugin.rb</a>.  Once my coding is complete (added my source files to java_perf/src), I created the plugin distribution:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html4strict">rake zip</pre></td></tr></table></div>

<h3>Install the plugin</h3>
<p>As you noticed, I haven&#8217;t covered debugging the plugin just yet, this is because I want to first set up the plugin for installation and then work with it in my install directory.  Lets install it to the local machine:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html4strict">app install:plugin java_perf.zip</pre></td></tr></table></div>

<h3>Add the plugin to my project</h3>
<p>I thought that I&#8217;d create a blank java project real quick</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="html4strict">cd workspace
app create:project . myproject java</pre></td></tr></table></div>

<p>now we can add the spring plugin and our new java:perf plugin to our project</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="html4strict">cd myproject
app add:plugin java:spring
app add:plugin java:perf</pre></td></tr></table></div>

<p>You can now directly modify the java_perf.rb file in your install directory</p>
<ul>
<li> windows: c:/Program Files/Appcelerator/releases/plugin/java_perf/1.0</li>
<li> unix: /usr/local/Appcelerator/releases/plugin/java_perf/1.0</li>
<li> mac os: /Library/Appcelerator/releases/plugin/java_perf/1.0</li>
</ul>
<p>I suggest that you continue to modify the java_perf.rb this way to debug it and then finalize by copying back over to $HOME/workspace/java_perf</p>
<h3>Next Steps</h3>
<p>As a final parting you can release your new plugin so that others may be able to leverage it</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="html4strict">cd $HOME/workspace/java_perf
app release java_perf.zip</pre></td></tr></table></div>

<p>-andrew</p>
<p>this article is cross posted at:<br />
<a href="http://zuerchtech.com/2008/3/4/implementing-an-appcelerator-plugin">http://zuerchtech.com/2008/3/4/implementing-an-appcelerator-plugin</a></p>
<p><a href="http://sharethis.com/item?&wp=2.8.4&amp;publisher=fb25d17b-38b5-47ed-9857-f171051e9899&amp;title=Implementing+an+Appcelerator+Plugin&amp;url=http%3A%2F%2Fwww.appcelerant.com%2Fimplementing-an-appcelerator-plugin.html">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.appcelerant.com/implementing-an-appcelerator-plugin.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Effectively Implementing Appcelerator RIAs and Services</title>
		<link>http://www.appcelerant.com/effectively-implementing-appcelerator-rias-and-services.html</link>
		<comments>http://www.appcelerant.com/effectively-implementing-appcelerator-rias-and-services.html#comments</comments>
		<pubDate>Tue, 26 Feb 2008 06:53:47 +0000</pubDate>
		<dc:creator>Andrew Zuercher</dc:creator>
				<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Example]]></category>
		<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://www.appcelerant.com/effectively-implementing-appcelerator-rias-and-services.html</guid>
		<description><![CDATA[Purpose
If you are venturing to implement a Rich Internet Application (RIA) with Appcelerator, then there are features about the framework that I&#8217;m really geared up about that help you implement your solution effectively.  When used together these items enable the agile creation of solutions in a shorter time that integrate nicely with services in [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "Effectively Implementing Appcelerator RIAs and Services", url: "http://www.appcelerant.com/effectively-implementing-appcelerator-rias-and-services.html" });</script>]]></description>
			<content:encoded><![CDATA[<p></p><h3>Purpose</h3>
<p>If you are venturing to implement a Rich Internet Application (RIA) with Appcelerator, then there are features about the framework that I&#8217;m really geared up about that help you implement your solution effectively.  When used together these items enable the agile creation of solutions in a shorter time that integrate nicely with services in an existing architecture and provide a richer user experience for clients.</p>
<h3>Achieving Re-use</h3>
<p>There are a bunch of ways to do this, personally I leverage app:content files judiciously.  You can provide args in the definition of your content files so that you can use the same content file over again.  Some things to keep in mind:</p>
<ul>
<li>reference the args as #{argname} in your element ids, any variables, and make sure that functions you call take this into account (possibly make them stateless)</li>
<li>the order in which the content file is loaded to make sure that listeners are properly setup to respond to messages</li>
</ul>
<p>here is an example app:content reference</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;app:content</span> <span style="color: #000066;">lazy</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">on</span>=<span style="color: #ff0000;">&quot;mainstate[person] then show else hide&quot;</span> 
  <span style="color: #000066;">args</span>=<span style="color: #ff0000;">&quot;{'prefix':'person'}&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/app:content<span style="font-weight: bold; color: black;">&gt;</span></span></span></pre></td></tr></table></div>

<p>here is the content.html file</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="html4strict"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#{prefix}header&quot;</span> ...
<span style="color: #000000; font-weight: bold;">&lt;/div&gt;</span></span></pre></td></tr></table></div>

<p>I know that this may be abstract, but the point is that you can use the arg &#8220;prefix&#8221; to reuse the file and provide alternative behavior based on it.</p>
<h3>Mocking Services</h3>
<p>You can mock out server side services extremely easily with the framework.  This is extremely useful whether your goal is:</p>
<ul>
<li>Visual Use Cases: implementing a prototype that results in 100% useable application code</li>
<li>Working offline: no need to run a web server at all, you can directly run off of a simple file</li>
</ul>
<p>Once you have this in place, you have a well defined contract in place which makes knocking out the service implementation a snap.</p>
<h3>No restart</h3>
<p>If you are just working on your application (no service work), you can directly make changes to your application without requiring rebuilding and redeploying your application.  In java I typically work directly in my tomcat deploy directory and have an ant task to pull the web files into my workspace.  With our next version of the framework coming out, this will be even easier with our support for Jetty coming and the Ruby based command line tool.  In the meantime, the following is useful in your java project:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="xml">ant pullweb</pre></td></tr></table></div>

<p>Make sure that you have your deploy.dir setup in your $HOME/.ant.properties for example:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="xml">deploy.dir=/Applications/apache-tomcat-6.0.14/webapps</pre></td></tr></table></div>

<p>With our Ruby implementation for example, this is even easier (running webbrick directly in your workspace).</p>
<h3>Great Support for Model Objects</h3>
<p>I&#8217;ve touched a bit on this in a previous post on <a href="http://www.appcelerant.com/json-serialization-with-appcelerator-java-services.html"><span class="caps">JSON</span> serialization with Appcelerator java services</a>.  To summarize the framework enables</p>
<ul>
<li>Hibernate persistence: ModelObjects can easily be used with our Hibernate integration</li>
<li><span class="caps">JSON</span> serialization: Serializing and deserialing complex objects is a snap</li>
</ul>
<h3>Slick support for forms</h3>
<p>In case you haven&#8217;t looked, you dont need to include a form tag anywhere in the application: simply add a fieldset attribute to your input elements and put something like this</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;input</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;age&quot;</span> <span style="color: #000066;">fieldset</span>=<span style="color: #ff0000;">&quot;save_person&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;input</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;name&quot;</span> <span style="color: #000066;">fieldset</span>=<span style="color: #ff0000;">&quot;save_person&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;input</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Create Person&quot;</span> <span style="color: #000066;">fieldset</span>=<span style="color: #ff0000;">&quot;save_person&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
  on=&quot;click then r:create.person.request&quot; type=&quot;button&quot;/&gt;</pre></td></tr></table></div>

<p>This will create a message of type r:create.person.request with the payload being all your input elements with fieldset of &#8220;save_person&#8221; ex:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="javascript"><span style="color: #66cc66;">&#123;</span><span style="color: #3366CC;">'name'</span>:<span style="color: #3366CC;">'jim'</span>,<span style="color: #3366CC;">'age'</span>:<span style="color: #3366CC;">'35'</span><span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>To me, this is very eloquent solution to leveraging form input elements with a messaging architecture.</p>
<h3>Easy to use UI widgets</h3>
<p>I love some of the widgets that are at your fingertips.  Some of the ones that i use the most</p>
<ul>
<li>app:panel: slick styling</li>
<li>app:datatable: great way to show rows of data</li>
<li>app:chart: fantastic visual effects to bring life to data</li>
</ul>
<p>All these widgets have a very terse usage that is very intuitive.  For example, using this set, I was able to knock out a realtime dashboard application in 3 evenings.</p>
<h3>Service Platform Options</h3>
<p>Pitching the right framework is something that varies from project to project.  For example, possibly your client wants to leverage an existing java infrastructure and is sold on its robustness for scaling enterprise applications, while on the other side possibly you want to take advantage of using a Rails controller and <span class="caps">ORM</span>/Active Record implementation for rapid development.  On the same level you also have the option for implementing services to customers that deliver in a .Net solution architecture.  Many other platforms also exist (python, <span class="caps">PHP</span>) enabling the opportunity to plug into those services as well.</p>
<p>The app:get non-visual widget also makes pre-existing services accessible as well and since Messaging is at the heart of the implementation, plugging into an <span class="caps">ESB</span> or pure <span class="caps">MOM</span> framework is perfectly setup as well.</p>
<h3>Wrap Up</h3>
<p>In this article 7 key tips have been covered</p>
<ul>
<li>re-use</li>
<li>mock services</li>
<li>no restart</li>
<li>model objects</li>
<li>messaging &#38; forms</li>
<li>UI widgets</li>
<li>platform options</li>
</ul>
<p>Although there are more items that have not been covered here, these are the ones that appeal personally to me and have noticed a huge gain in doing much more with less effort.</p>
<p>
this article cross-posted at <a href="http://blog.zuerchtech.com/2008/02/26/effectively-implementing-appcelerator-rias-and-services/">http://blog.zuerchtech.com/2008/02/26/effectively-implementing-appcelerator-rias-and-services/</a></p>
<p><a href="http://sharethis.com/item?&wp=2.8.4&amp;publisher=fb25d17b-38b5-47ed-9857-f171051e9899&amp;title=Effectively+Implementing+Appcelerator+RIAs+and+Services&amp;url=http%3A%2F%2Fwww.appcelerant.com%2Feffectively-implementing-appcelerator-rias-and-services.html">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.appcelerant.com/effectively-implementing-appcelerator-rias-and-services.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
