<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-2870112671300253509</atom:id><lastBuildDate>Mon, 26 Oct 2009 18:06:47 +0000</lastBuildDate><title>Do It on the Desktop</title><description>THE OPENSPAN DEVELOPMENT BLOG</description><link>http://doitonthedesktop.blogspot.com/</link><managingEditor>noreply@blogger.com (Damon Lockwood)</managingEditor><generator>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/DoItOnTheDesktop" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2870112671300253509.post-3243875843444925264</guid><pubDate>Mon, 13 Jul 2009 18:55:00 +0000</pubDate><atom:updated>2009-07-14T14:20:25.081-04:00</atom:updated><title>How OpenSpan Could Support the Google Chrome OS (and Linux in General)</title><description>Last week I mentioned that I would follow-up my original post on the Google Chrome OS with a post on how OpenSpan &lt;em&gt;could&lt;/em&gt; support the Google Chrome OS (and Linux in general). I emphasize &lt;em&gt;could&lt;/em&gt;, because we currently have no plans to support the Google Chrome OS or Linux. Thus, this post is really just informed speculation on how our technology could be applied to Linux.&lt;br /&gt;&lt;br /&gt;&lt;span style="FLOAT:LEFT; MARGIN-RIGHT: 10px"&gt;&lt;a href="http://3.bp.blogspot.com/_f_me7LYm8dE/SlvVL18iOLI/AAAAAAAAA6o/PQnFSmSW35Y/s1600-h/JavaStack.gif"&gt;&lt;img style="MARGIN-RIGHT: 10px;" id="BLOGGER_PHOTO_ID_5358110581123594418" alt="" src="http://3.bp.blogspot.com/_f_me7LYm8dE/SlvVL18iOLI/AAAAAAAAA6o/PQnFSmSW35Y/s200/JavaStack.gif" border="0" /&gt;&lt;/a&gt;&lt;center&gt;Diagram 1&lt;/center&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_f_me7LYm8dE/SlvVMUwkSrI/AAAAAAAAA64/itCRwN8w6z0/s1600-h/JavaStack%2BSystems.gif"&gt;&lt;img style="MARGIN-RIGHT: 10px;" id="BLOGGER_PHOTO_ID_5358110589394897586" alt="" src="http://3.bp.blogspot.com/_f_me7LYm8dE/SlvVMUwkSrI/AAAAAAAAA64/itCRwN8w6z0/s200/JavaStack%2BSystems.gif" border="0" /&gt;&lt;/a&gt;&lt;center&gt;Diagram 2&lt;/center&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_f_me7LYm8dE/SlvVMFv-e1I/AAAAAAAAA6w/KLmYjfXBKLE/s1600-h/JavaStack%2BLinux.gif"&gt;&lt;img style="MARGIN-RIGHT: 10px;" id="BLOGGER_PHOTO_ID_5358110585365887826" alt="" src="http://4.bp.blogspot.com/_f_me7LYm8dE/SlvVMFv-e1I/AAAAAAAAA6w/KLmYjfXBKLE/s200/JavaStack%2BLinux.gif" border="0" /&gt;&lt;/a&gt;&lt;center&gt;Diagram 3&lt;/center&gt;&lt;/span&gt;Typically, when we talk about OpenSpan, we focus on our Windows translator, Scout, as the base layer which everything builds upon. In fact, we often say "OpenSpan sits in between the application and Windows". We then talk about how we use the Scout layer to detect when additional technologies are loaded into an application so we can load translators to expose those technologies. For example, to explain how we support Java, we might whiteboard something like Diagram 1.&lt;br /&gt;&lt;br /&gt;However, Diagram 1 isn't really correct. There's actually another layer below Windows, the instrumentation layer, responsible for hooking x86-64 byte code. Of course, once you're dealing with byte code, you're dealing with the processor, not the OS. Thus, our hooking library can hook functions on both Windows &lt;em&gt;and&lt;/em&gt; Linux systems. When we add the instrumentation layer, our Java stack looks like Diagram 2.&lt;br /&gt;&lt;br /&gt;So what would it look like if we added Linux to the mix? You might think that adding Linux would mean two different stacks, one on top of Windows, another on top Linux. However, this isn't the case. For technologies that run on both Windows and Linux, the stacks would actually reconverge at that layer. Diagram 3 shows what our Java stack looks like with Linux.&lt;br /&gt;&lt;br /&gt;Of course, there's only a few UI frameworks that work on both Windows and Linux (see list &lt;a href="http://itaibh.blogspot.com/2009/04/quick-review-of-different-ui-frameworks.html"&gt;here&lt;/a&gt;), most importantly Java and HTML. Unfortunately, HTML is a markup language rather than a binary specification so we have to adapt to each browser rather than HTML itself. However, we could still create a common set of HTML element objects that interact with each browser implementation through an abstraction layer. It gets even more interesting if you start thinking about server technologies. &lt;br /&gt;&lt;br /&gt;To summarize, above the OS layer, most multi-platform technologies will reconverge on a common set of classes. Thus, although we will need to write a Linux layer, we will not need to write a new Java layer or two separate FireFox layers. Don't get me wrong, supporting Linux would still require a significant degree of effort. However, it is a manageable amount of effort because we can build on the layers we already support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2870112671300253509-3243875843444925264?l=doitonthedesktop.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://doitonthedesktop.blogspot.com/2009/07/how-openspan-could-support-google.html</link><author>noreply@blogger.com (Damon Lockwood)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_f_me7LYm8dE/SlvVL18iOLI/AAAAAAAAA6o/PQnFSmSW35Y/s72-c/JavaStack.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2870112671300253509.post-8348741669951679155</guid><pubDate>Wed, 08 Jul 2009 15:28:00 +0000</pubDate><atom:updated>2009-07-08T13:15:09.902-04:00</atom:updated><title>Google Chrome OS</title><description>Today, Google announced on their &lt;a href="http://googleblog.blogspot.com/2009/07/introducing-google-chrome-os.html"&gt;blog&lt;/a&gt; that they are working on a OS based on their Chrome browser and Linux. The &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;blogosphere&lt;/span&gt;&lt;/span&gt; has been expecting this &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;announcement&lt;/span&gt;&lt;/span&gt; for a couple of years now. It's been pretty obvious that Google was positioning itself to compete against all of Microsoft's core products, adding first Google Apps to compete with Office and then Google Chrome to compete against Internet Explorer. A Google OS is the final piece, taking on Windows.&lt;br /&gt;&lt;br /&gt;I find it amusing the excitement that a Google OS generates. It seems to speak more to a dislike of Microsoft than to an excitement about Google. After all, if Google is successful, it will be in a more dominant position than Microsoft ever was, controlling the operating system, &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;productivity&lt;/span&gt;&lt;/span&gt; &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;applications&lt;/span&gt;&lt;/span&gt;, email and search (which effectively controls the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;Internet&lt;/span&gt;). That doesn't sound like a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;particularly&lt;/span&gt;&lt;/span&gt; desirable outcome. We all know monopolies tend to stagnate. After all, it took &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;FireFox&lt;/span&gt; to drive Microsoft to improve Internet Explorer, Java to drive Microsoft to scrap COM and now Google Apps to drive Microsoft to update Office. I would hate to see Google replace Microsoft as another monopoly.&lt;br /&gt;&lt;br /&gt;On the other hand, operating systems are a bit of a special case. Having a single dominant operating system leads to innovation at the next layer. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;OpenSpan&lt;/span&gt;&lt;/span&gt; only has to develop for Windows currently, which lowers our costs and allows us to focus more effectively. Standards are supposed to alleviate this problem, but standards are equally problematic. I was a web developer when Netscape and Internet Explorer both rolled out their own &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_10"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;implementations&lt;/span&gt;&lt;/span&gt; of HTML 4.0. Having to develop cross-browser scripting code was an absolute pain in the ass. I've had similar experiences dealing with different Java server &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_11"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;environments&lt;/span&gt;&lt;/span&gt;, each with their own little quirks. "Write once, run anywhere," usually means "Write once, debug everywhere." Moreover, standards tend to be produced slowly and are very rarely perfect. Browser and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;JVM&lt;/span&gt;&lt;/span&gt; creators are notorious for jumping the gun and rolling out versions that are compliant with an interim standard, but not the final standard. They are also notorious for rolling out innovations that are not compatible with other browser or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;JVM&lt;/span&gt;&lt;/span&gt; &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_14"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;implementations&lt;/span&gt;&lt;/span&gt;. Developers are constantly presented with the choice of targeting the lowest common denominator and sacrificing &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_15"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;functionality&lt;/span&gt;&lt;/span&gt;, targeting a specific &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_16"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;implementation&lt;/span&gt;&lt;/span&gt; and sacrificing market share, or targeting multiple &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_17"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;implementations&lt;/span&gt;&lt;/span&gt; and sacrificing time and money.&lt;br /&gt;&lt;br /&gt;Of course, Google will argue that they will not be dominant or &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_18"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;monopolistic&lt;/span&gt;&lt;/span&gt;, because the Chrome OS is designed to bring web &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_19"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;applications&lt;/span&gt;&lt;/span&gt; to the desktop. Here's &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;Google's&lt;/span&gt;&lt;/span&gt; description of the Chrome OS &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_21"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;architecture&lt;/span&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"The software &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_22"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;architecture&lt;/span&gt;&lt;/span&gt; is simple — Google Chrome running within a new windowing system on top of a Linux kernel. For application developers, the web is the platform. All web-based &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_23"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;applications&lt;/span&gt;&lt;/span&gt; will &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_24"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;automatically&lt;/span&gt;&lt;/span&gt; work and new &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_25"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;applications&lt;/span&gt;&lt;/span&gt; can be written using your favorite web &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_26"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;technologies&lt;/span&gt;&lt;/span&gt;."&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;Google's&lt;/span&gt;&lt;/span&gt; statement reminds me of the Palm &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;webOS&lt;/span&gt; (on the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;Pre&lt;/span&gt;&lt;/span&gt;), which allows you to build softphone apps that use web &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_29"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;technologies&lt;/span&gt;&lt;/span&gt;. These local apps are built with HTML and javascript, but they still rely on webOS services to interact with the local system. Is this how the Google Chrome OS will work? Or will the Chrome OS only allow users to interact with &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_30"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;applications&lt;/span&gt;&lt;/span&gt; in the cloud, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;ie&lt;/span&gt;&lt;/span&gt;. no local storage, etc.? Most likely, the Chrome OS will do both, and some &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_32"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;applications&lt;/span&gt;&lt;/span&gt; will be compatible with Windows, Mac and Linux and some will not.&lt;br /&gt;&lt;br /&gt;If Google wants to demonstrate a commitment to open standards, it could roll out a Chrome OS &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;virtualization&lt;/span&gt;&lt;/span&gt; layer to run &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_34"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;applications&lt;/span&gt;&lt;/span&gt; on Windows. This would actually be a pretty smart strategy, extending the reach of the OS while deflecting potential criticism. Likewise, to gain widespread adoption, providing a Windows &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;virtualization&lt;/span&gt;&lt;/span&gt; layer to run Windows applications on the Chrome OS will be required. Ultimately, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;virtualization&lt;/span&gt;&lt;/span&gt; may make much of this mute, &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_37"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;particularly&lt;/span&gt;&lt;/span&gt; if we move from machine &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;virtualization&lt;/span&gt;&lt;/span&gt; to OS &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;virtualization&lt;/span&gt;&lt;/span&gt; (thus eliminating the need for OS licenses). It will also be interesting to see if Google open sources the entire Chrome OS. The Chrome browser is mostly open source (as Chromium), although Google does add some small &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_40"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;functionality&lt;/span&gt;&lt;/span&gt; (&lt;a href="http://blog.chromium.org/2008/10/google-chrome-chromium-and-google.html"&gt;mainly branding&lt;/a&gt;) on top of the open source &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_41"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;implementation&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The most fascinating aspect of this will be Microsoft's eventual response if Google is successful. Right now, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;Google's&lt;/span&gt;&lt;/span&gt; search revenue funds free &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_43"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;applications&lt;/span&gt;&lt;/span&gt; like Google Apps, Chrome and the Chrome OS. Google is going to need to make money off of these eventually, as I'm guessing most people don't want advertising on their desktop. In the meantime, however, being free is a really big competitive advantage for Google. Will Microsoft eventually be forced to make Windows free as well? Will Microsoft have to move more &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_44"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;aggressively&lt;/span&gt;&lt;/span&gt; to a cloud model to compete? Whatever happens, Google has succeeded in making the desktop market interesting for the first time in a long time, and it hasn't even released anything yet.&lt;br /&gt;&lt;br /&gt;Today or tomorrow I'll follow up this post with some thoughts on how the changing OS market impacts OpenSpan and provide some insights on how our architecture is already positioned for the post-Windows world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2870112671300253509-8348741669951679155?l=doitonthedesktop.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://doitonthedesktop.blogspot.com/2009/07/google-chrome-os.html</link><author>noreply@blogger.com (Damon Lockwood)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2870112671300253509.post-849294289196144096</guid><pubDate>Mon, 29 Jun 2009 00:06:00 +0000</pubDate><atom:updated>2009-06-30T15:57:16.010-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">integration</category><category domain="http://www.blogger.com/atom/ns#">desktop</category><category domain="http://www.blogger.com/atom/ns#">history</category><category domain="http://www.blogger.com/atom/ns#">future</category><category domain="http://www.blogger.com/atom/ns#">openspan</category><title>Accessible and Reliable</title><description>Recently, Eric asked me to speak at one of our company meetings about the future of the OpenSpan platform. He didn't want me to speak about releases or features, but rather about the platform as a whole. What is our vision for the OpenSpan platform?&lt;br /&gt;&lt;br /&gt;This is actually a topic I think a lot about. For every feature we design and every release we plan, I ask the question: "How will this push the platform forward?" One of the things I think we've done very well at OpenSpan is to stay true to the principles that led us to create OpenSpan in the first place. When Stephen and I first started planning the platform we each brought two sets of distinct experiences to the table. &lt;br /&gt;&lt;br /&gt;Stephen had spent the past several years creating visual programming environments. He believed strongly that the barrier that prevented more business analysts from programming was not the concepts of programming but rather the syntax of programming. Ultimately, many of the concepts programmers use everyday, conditions and loops in particular, are familiar to every advanced Excel or Access user. Other concepts, such as types, casts, threads and objects are either unnecessary for many tasks or presented in such a way as to be impenetrable to the lay person. Stephen was committed to providing an environment where business users could develop or participate in the development of automations.&lt;br /&gt;&lt;br /&gt;I had spent the past few years creating custom desktop automation solutions for enterprise customers with diverse application requirements. I had become painstakingly familiar with the available APIs: COM libraries for Lotus Notes, Internet Explorer, Office, Siebel and others; MSAA and windows functions for Win32 applications; HLLAPI, EHLLAPI, etc. for mainframe emulators. I had also become painfully familiar with the limitations of these APIs: narrow or incomplete APIs; little or no support for events; frustratingly inconsistent implementations of supposedly standard APIs. My experiences had convinced me that there was a better way to automate these applications.&lt;br /&gt;&lt;br /&gt;In our very first face to face conversation, Stephen and I decided two things: OpenSpan would be &lt;em&gt;accessible&lt;/em&gt; to both developers and non-developers and OpenSpan would be completely &lt;em&gt;reliable&lt;/em&gt;. If you clicked a button with OpenSpan, it would click &lt;em&gt;every&lt;/em&gt; time. &lt;br /&gt;&lt;br /&gt;I would be lying if I claimed that we knew that these principles would lead us to our current automation engine and injection library. Some ideas like controls, targets and match rules evolved quickly. Other ideas like asynchronous links and keys evolved in response to customer requirements. Whatever happened, though, we stayed true to our principles. When we reached the limits of message hooks and accessibility interfaces, we scrapped them and wrote an injection and hooking library from the ground up. When we encountered a control we didn't support, we reverse engineered the platform to get at the real object. When a public interface didn't supply the events we needed, we made our own with some well placed hooks.&lt;br /&gt;&lt;br /&gt;Over time, some new principles evolved:&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;A button is a button is a button.&lt;/em&gt; In other words, hide the platform implementation details. Every control in OpenSpan should act the same regardless of the actual platform.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;Never hide functionality.&lt;/em&gt; If a platform provides functionality that another platform does not provide, expose it. A great example of this is HTML controls. They follow the same pattern as other OpenSpan controls, but add extra properties to manipulate the inner HTML, set attributes, etc.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;Always talk to the object.&lt;/em&gt; Pretty quickly it became apparent that every time we tried to take a shortcut, it burned us. GDI hooking. Sucks. MSAA. Sucks. Message hooks. Suck. There's always something to tweak or modify or re-implement for each environment. The only API you can rely on is the one the original developer of the application used. So what if it's not exposed? Sure, it takes more time initially, but we only need to do it once and then it works every time. I'm very proud of the fact that OpenSpan implementations never need engineers on site to develop integrations. If there is a control we don't support, we write a translator and publish it for all of our customers. One and done.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;Know everything about the object.&lt;/em&gt; It's not enough to talk to the object. We know when an object is created. We know when an object is destroyed. We intercept events before the object receives them. 'Nuff said.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;There is no such thing as too advanced.&lt;/em&gt; Early on we had a debate about threading. Should we hide threading from our users? Should the platform make threading decisions for them? Ultimately, we decided not to hide threading because doing so would inevitably limit our users. We made threading accessible by making it easy to visualize. Do people screw themselves up with threading? Sure, but people burn down their house with turkey fryers every year too. That doesn't mean fried turkey doesn't taste good.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;Developers do not always want to drag and drop.&lt;/em&gt; This one is pretty obvious. Even though we want the platform to be accessible to non-developers, we want it to be just as accessible to developers. For developers, sometimes it's just easier to write code. And when it is easier, there's nothing more frustrating than not being able to. From the very beginning, we made sure that developers could write C# and VB .NET scripts and use their own .NET components in automations.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;strong&gt;So what is our vision for the OpenSpan platform?&lt;/strong&gt; &lt;br /&gt;OpenSpan was built from the ground up to be a accessible and reliable desktop automation platform. Those two simple words, accessible and reliable, have directly guided the evolution of our most valuable IP: automation and injection. Our vision is to extend those two technologies into new areas. We are actively working on new ways to expose them to developers including our upcoming Visual Studio plug-in, Lotus Expeditor container and translator SDK. We are also working to apply these technologies in new environments. In the future, we will move beyond the desktop to provide automation and injection on the server. When we do, you can be sure it will be just as accessible and reliable as our current platform.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2870112671300253509-849294289196144096?l=doitonthedesktop.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://doitonthedesktop.blogspot.com/2009/06/accessible-and-reliable.html</link><author>noreply@blogger.com (Damon Lockwood)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2870112671300253509.post-3759122012439289899</guid><pubDate>Fri, 26 Jun 2009 19:46:00 +0000</pubDate><atom:updated>2009-06-26T17:02:59.225-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">4.1</category><category domain="http://www.blogger.com/atom/ns#">integration</category><category domain="http://www.blogger.com/atom/ns#">inside out</category><category domain="http://www.blogger.com/atom/ns#">windows</category><title>Inside Out: Synchronous Click</title><description>In 4.1 we introduced a new set of methods: PerformSynchronousClick, PerformSynchronousDoubleClick and PerformSynchronousRightClick. These methods are only available in our windows adapter currently, but will be extended to other technology stacks in the future. These new methods complement our existing PerformClick, PerformDoubleClick and PerformRightClick. So why do we need synchronous versions of these methods? And why are the existing methods not synchronous? What does synchronous mean in this context anyway?&lt;br /&gt;&lt;br /&gt;To understand these functions, let's take a step back and talk about the Windows message loop. All Windows programs (at least those with a user interface) feature some variation of the following:&lt;br /&gt;&lt;pre&gt;MSG msg;&lt;br /&gt;while( GetMessage( &amp;msg, NULL, 0, 0 ) != 0)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;TranslateMessage(&amp;msg); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DispatchMessage(&amp;msg); &lt;br /&gt;}&lt;/pre&gt;This simple code snippet is the prototypical Windows message loop. Essentially, GetMessage asks Windows for a message and waits. When Windows has a message (such as a keyboard or mouse message), GetMessage returns. The caller then passes the message to TranslateMessage (which turns keyboard messages into char messages), and then DispatchMessage (which passes the message to the actual destination window). &lt;br /&gt;&lt;br /&gt;However, not all messages are returned by GetMessage. Only posted messages (input messsages and messages posted using PostMessage) are returned by GetMessage. So what happens to sent messages (messages sent using SendMessage or one of its variants)? These messages are dispatched synchronously to the destination window by GetMessage &lt;em&gt;before&lt;/em&gt; it returns. The sequence looks like this:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Enter GetMessage.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Dispatch all sent messages to the destination windows.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Get the next posted message and fill the msg structure.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Exit GetMessage.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;In truth, it gets a little more complicated than this, particularly when you're dealing with another application's message loop. Applications can and do add all sorts of additional processing to the message loop to do special input filtering, show modal dialogs, etc. Moreover, simulating even the simplest click can involve over twenty messages, some sent, some posted, depending on the styles of the destination window. &lt;br /&gt;&lt;br /&gt;Unfortunately, directly sending messages to the destination window will not yield the correct behavior because if the application does any special message processing in the message loop we will have bypassed it entirely. Moreover, we never know when one of the twenty messages we send will result in a long running application process that we don't want to wait for. For these reasons, prior to 4.1, we did not provide any synchronous click functions at all. We filled the message queue and let'er rip.&lt;br /&gt;&lt;br /&gt;For most scenarios, this works fine. OpenSpan always waits for new controls to be created using our implicit WaitForCreate methods so there are very few instances where we need to wait for the actual result of a click. However, one of those situations involves our prototypical demo application: calculator. Using the standard click methods, the following automation will return 0 or 4 rather than the desired 8. With the information above can you understand why? &lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_f_me7LYm8dE/SkUznYCkDEI/AAAAAAAAA2w/4U4zg0fKKSY/s1600-h/PerformClick.jpg"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 165px;" src="http://1.bp.blogspot.com/_f_me7LYm8dE/SkUznYCkDEI/AAAAAAAAA2w/4U4zg0fKKSY/s400/PerformClick.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5351740483760819266" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That's right, each step of the automation doesn't wait for the previous step to complete. Thus, the automation gets the text before calculator has updated the text field with the final result. The new synchronous click methods do wait for all of the click messages to be processed. Thus, the automation below will return 8 every time. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_f_me7LYm8dE/SkUz1Jfew2I/AAAAAAAAA3A/Q7NbrjDEL60/s1600-h/PerformSynchronousClick.jpg"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 127px;" src="http://2.bp.blogspot.com/_f_me7LYm8dE/SkUz1Jfew2I/AAAAAAAAA3A/Q7NbrjDEL60/s400/PerformSynchronousClick.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5351740720373744482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;But what if clicking a button creates a modal dialog? Will OpenSpan wait for the modal dialog to be dismissed by the user before continuing? What if there is no user? What if I want to dismiss the dialog in my automation? Oh noesss!&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Simmer down. The short answer is that we do not wait for the modal dialog to be dismissed. Modal dialogs are nothing more than a nested GetMessage loop inside the outer GetMessage loop. Usually the sequence looks something like this:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;GetMessage returns a mouse up message.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;DispatchMessage passes the mouse up message to a window.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The window procedure creates the modal dialog and shows it.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The window procedure calls GetMessage and enters a new message loop to process messages posted to the modal dialog.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The user dismisses the modal dialog.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The windows procedure exits the message loop and returns.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;DispatchMessage returns and the outer message loop resumes.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;OpenSpan simply waits until step 4, when GetMessage is called &lt;em&gt;again&lt;/em&gt; after the mouse up message and returns. Perceptive readers with knowledge of hooking may have guessed how we do this, but for everyone else, it's sufficient to say that we ensure that each time an application calls GetMessage (or any of its variants such as PeekMessage) the next simulated message is always returned. Some other time, maybe I'll talk about how we ensure that OpenSpan messages receive priority over other messages and are always processed in order. Until then, I'll let everyone guess in the comments (everyone except OpenSpan employees, that would be cheating) and give the correct answer a free "Do It on the Desktop" t-shirt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2870112671300253509-3759122012439289899?l=doitonthedesktop.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://doitonthedesktop.blogspot.com/2009/06/inside-out-synchronous-click.html</link><author>noreply@blogger.com (Damon Lockwood)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_f_me7LYm8dE/SkUznYCkDEI/AAAAAAAAA2w/4U4zg0fKKSY/s72-c/PerformClick.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2870112671300253509.post-6945914854879491377</guid><pubDate>Wed, 17 Jun 2009 19:26:00 +0000</pubDate><atom:updated>2009-06-26T16:58:42.792-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">4.1</category><category domain="http://www.blogger.com/atom/ns#">automation</category><category domain="http://www.blogger.com/atom/ns#">openspan</category><category domain="http://www.blogger.com/atom/ns#">feature spotlight</category><title>4.1 Feature Spotlight: Automation Stack</title><description>It's that time again! As our 4.1 release nears completion, it's time to start posting about our new features. One of the new features we're testing currently is a new automation stack implementation. As our platform has evolved, we have begun to use our automation engine in new and more complicated environments. Previously, most of our environments were single-threaded &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;automations&lt;/span&gt; of applications on the user desktop. Now, our platform is being used on the server to automate back-office requests, process messages and expose applications as web services. In this new environment, it quickly became clearly that our automation engine needed a proper stack to ensure that our &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;automations&lt;/span&gt; remained thread safe.&lt;br /&gt;&lt;br /&gt;If you're not familiar with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;OpenSpan&lt;/span&gt;, one of your first questions might be how the heck don't you already have a stack? To explain that, I need to go under the hood for a little bit. Looking at the automation your first instinct would be to assume that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;OpenSpan&lt;/span&gt; is a visual programming language that generates source code. For example, the automation below could be expressed in a C# class as:&lt;br /&gt;&lt;pre&gt;private string &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;varString&lt;/span&gt;;&lt;br /&gt;private void Setup()&lt;br /&gt;{&lt;br /&gt;   &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;btnSubmit&lt;/span&gt;.Click += delegate&lt;br /&gt;   {&lt;br /&gt;      &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;varString&lt;/span&gt; = &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;txtPhone&lt;/span&gt;.Text;&lt;br /&gt;      webBrowser.Navigate(txtUrl.Text);&lt;br /&gt;   };&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_f_me7LYm8dE/SjphEzFOVII/AAAAAAAAA1g/SrCCeXB8HLk/s1600-h/AutomationStack+-+Automation1.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5348694242515375234" style="MARGIN: 0px 10px 10px 0px; WIDTH: 400px; CURSOR: hand; HEIGHT: 124px" alt="" src="http://2.bp.blogspot.com/_f_me7LYm8dE/SjphEzFOVII/AAAAAAAAA1g/SrCCeXB8HLk/s400/AutomationStack+-+Automation1.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Pretty straightforward, right? How about this automation? In this case we've made one of the links asynchronous indicating that the next step should be performed on a new thread.&lt;br /&gt;&lt;pre&gt;private string &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;varString&lt;/span&gt;;&lt;br /&gt;private void Setup()&lt;br /&gt;{&lt;br /&gt;   &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;btnSubmit&lt;/span&gt;.Click += delegate&lt;br /&gt;   {&lt;br /&gt;      &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;varString&lt;/span&gt; = &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;txtPhone&lt;/span&gt;.Text;&lt;br /&gt;      &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;NavigateDelegate&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;navDel&lt;/span&gt; = delegate(string &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;url&lt;/span&gt;)&lt;br /&gt;      {&lt;br /&gt;         &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;webBrowser&lt;/span&gt;.Navigate(&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;url&lt;/span&gt;);&lt;br /&gt;      };&lt;br /&gt;      navDel.BeginInvoke(txtUrl.Text, null, null);&lt;br /&gt;   };&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_f_me7LYm8dE/SjphE1gmcVI/AAAAAAAAA1o/8YW2g-9-TtU/s1600-h/AutomationStack+-+Automation2.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5348694243167072594" style="MARGIN: 0px 10px 10px 0px; WIDTH: 400px; CURSOR: hand; HEIGHT: 128px" alt="" src="http://2.bp.blogspot.com/_f_me7LYm8dE/SjphE1gmcVI/AAAAAAAAA1o/8YW2g-9-TtU/s400/AutomationStack+-+Automation2.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Now it's starting to get more complicated. Every time we need to execute an asynchronous link we would need to generate a delegate type. I'm using anonymous methods which makes it easier, but it's still pretty difficult. How about this automation? We have two execution threads from different events converging on a single block. Easy to express in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;OpenSpan&lt;/span&gt;, but we would need to use another method or delegate in C#.&lt;br /&gt;&lt;pre&gt;private string &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;varString&lt;/span&gt;;&lt;br /&gt;private void Setup()&lt;br /&gt;{&lt;br /&gt;   &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;btnSubmit&lt;/span&gt;.Click += delegate { &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;NextStep&lt;/span&gt;(); };&lt;br /&gt;   &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;webForm&lt;/span&gt;.Submitting += delegate(object sender, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;CancelEventArgs&lt;/span&gt; e)&lt;br /&gt;   {&lt;br /&gt;      &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;NextStep&lt;/span&gt;();&lt;br /&gt;   };&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;NextStep&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;   &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;varString&lt;/span&gt; = &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;txtPhone&lt;/span&gt;.Text;&lt;br /&gt;   &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;NavigateDelegate&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;navDel&lt;/span&gt; = delegate(string &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;url&lt;/span&gt;)&lt;br /&gt;   {&lt;br /&gt;      &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;webBrowser&lt;/span&gt;.Navigate(&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;url&lt;/span&gt;);&lt;br /&gt;   };&lt;br /&gt;   navDel.BeginInvoke(txtUrl.Text, null, null);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_f_me7LYm8dE/SjphFGOH93I/AAAAAAAAA1w/hZNU5ZqTpv8/s1600-h/AutomationStack+-+Automation3.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5348694247652980594" style="MARGIN: 0px 10px 10px 0px; WIDTH: 400px; CURSOR: hand; HEIGHT: 177px" alt="" src="http://4.bp.blogspot.com/_f_me7LYm8dE/SjphFGOH93I/AAAAAAAAA1w/hZNU5ZqTpv8/s400/AutomationStack+-+Automation3.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Even more complicated, and I haven't even added entry points to the automation. So what can we conclude from this exercise? As you might have guessed, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;OpenSpan&lt;/span&gt; does not generate source code. Instead, we model execution flow using a serialized object graph. This gives us greater flexibility to express logical concepts such as branches, joins, etc. without the limitations of traditional syntax. However, because we do not generate code we are unable to rely on the existing thread stack to manage our local variables for us. Thus, prior to 4.1, we simply didn't have a stack at all.&lt;br /&gt;&lt;br /&gt;So, how does the new stack work? For the most part, it works like the normal thread stack we all know and love. When an automation is entered, all of the local variables and components are allocated and pushed onto the automation stack. So far so good, right? But what about those pesky asynchronous links? In &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;OpenSpan&lt;/span&gt; it's perfectly legal to have two links on different threads in the same automation updating variables.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_f_me7LYm8dE/SjpkM0Q3JoI/AAAAAAAAA2A/5BwebeiiXJI/s1600-h/AutomationStack+-+Automation4.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5348697678806460034" style="MARGIN: 0px 10px 10px 0px; WIDTH: 400px; CURSOR: hand; HEIGHT: 249px" alt="" src="http://3.bp.blogspot.com/_f_me7LYm8dE/SjpkM0Q3JoI/AAAAAAAAA2A/5BwebeiiXJI/s400/AutomationStack+-+Automation4.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;So what should we do here? In a traditional thread stack model, each asynchronous link gets it's own stack. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;OpenSpan&lt;/span&gt;, however, makes creating new threads absurdly easy. Thus, it's easy to create a number of parallel threads to accomplish tasks such as updating three or four application simultaneously. Should we allocate new variables and components every time we execute a new asynchronous link? Should we initialize them to their original defaults or should we initialize them to their current values?&lt;br /&gt;&lt;br /&gt;As you probably guessed, the correct answer is none of the above. The new automation stack is not a thread stack. Local components and variables are allocated on a per automation basis not on a per thread basis. Thus, each of those asynchronous links in the example above are actually updating the same variable. This approach preserves the ease of threading &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;OpenSpan&lt;/span&gt; traditionally provides, while adding the additional safety of stack-based variables.&lt;br /&gt;&lt;br /&gt;Now that I've explained how the new automation stack works, I'll cover some of the common questions I've been asked about this feature.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What if I want my variables to be available to all &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;automations&lt;/span&gt;?&lt;/strong&gt;&lt;br /&gt;No problem. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;OpenSpan&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;automations&lt;/span&gt; now have a global and a local tray. Components in the global tray behave just like they did in previous versions of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;OpenSpan&lt;/span&gt;. They can be updated from any automation at any time. Components in the local tray can only be used on that automation and are not exposed to other &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;automations&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;When are local and global components created?&lt;/strong&gt;&lt;br /&gt;Global components are created when the project is started and can be used in any automation. Local components are only created when an automation is run. Local components can only be used in the automation that contains them.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;When are local and global components destroyed?&lt;/strong&gt;&lt;br /&gt;Global components are destroyed when the project is stopped. Local components are destroyed when &lt;em&gt;all the threads in the automation have completed.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;When should I use a local component?&lt;/strong&gt;&lt;br /&gt;Local components are appropriate when the component in question does not need to be accessed from other &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;automations&lt;/span&gt; or when an automation can be run simultaneously on multiple threads. Local components are recreated every time an automation is run and thus will not maintain state across multiple runs. For instance, you could not create a local variable to keep track of the number of times an automation is run. Every time the automation runs the counter variable would be recreated and initialized to zero.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What happens when I upgrade my old &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;automations&lt;/span&gt;?&lt;/strong&gt;&lt;br /&gt;Variables and components from old &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;automations&lt;/span&gt; will automatically be placed in the global tray during the upgrade process. Thus, your old &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;automations&lt;/span&gt; will continue to function as they did before. To take advantage of the automation stack, you can easily make any global components local by right-click and selected the "Make Local" menu item.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2870112671300253509-6945914854879491377?l=doitonthedesktop.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://doitonthedesktop.blogspot.com/2009/04/41-feature-spotlight-automation-stack.html</link><author>noreply@blogger.com (Damon Lockwood)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_f_me7LYm8dE/SjphEzFOVII/AAAAAAAAA1g/SrCCeXB8HLk/s72-c/AutomationStack+-+Automation1.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2870112671300253509.post-2175319929558403235</guid><pubDate>Mon, 24 Mar 2008 00:14:00 +0000</pubDate><atom:updated>2008-03-26T10:56:28.727-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">3.2</category><category domain="http://www.blogger.com/atom/ns#">desktop service enablement</category><category domain="http://www.blogger.com/atom/ns#">desktop</category><category domain="http://www.blogger.com/atom/ns#">soa</category><title>Desktop Service Enablement: What's the Point?</title><description>As many of you know, OpenSpan began making a big push into SOA technologies last year. We even came up with a new marketing slogan: “OpenSpan the last mile of SOA.” While we’ve always had the capacity to consume web services, we wanted to add the ability to expose our automations as services. This culminated in the announcement last week of the &lt;a href="http://www.openspan.com/AboutUs/PR-080317.asp"&gt;OpenSpan Platform SOA Desktop Edition&lt;/a&gt;, which allows you to create an automation within or across applications and then expose that automation as a service deployed on the desktop (we call this desktop service enablement). While many of our customers are very excited about this new capability, I have been asked by others “that’s cool but what’s the point?"&lt;br /&gt;&lt;br /&gt;I have to admit this reaction makes me want to jump up and down screaming: “What’s the point! What’s the point! Are you kidding! This isn’t just cool! This is totally freaking awesome!”&lt;br /&gt;&lt;br /&gt;But… after taking a deep breath, I realize that this is really our fault for not explaining ourselves clearly. As anyone who’s read my blog knows, I think the software industry has treated the desktop environment like some provincial backwater for a quite a while now. Sure you need it to keep your empire running but you sure don’t want to go there if you can avoid it. Even though most of us spend most of our working lives in the Windows environment, the desktop is just the place everyone’s applications happen to end up. All of the cool stuff happens on the server.&lt;br /&gt;&lt;br /&gt;Gradually, that opinion seems to be changing. ClickOnce, JNLP, WPF, Adobe Flex and other emerging desktop technologies are using the web as a delivery mechanism while using the power of the desktop to create rich interactive applications for users. Even Web 2.0 and AJAX are examples of this trend. The server delivers the HTML and JavaScript for the site once. After the initial delivery, all of the presentation and interaction logic runs on the desktop, only calling the server when new data is required. However, one thing hasn’t changed, once these applications get to the desktop they are still running in silos, usually isolated from the rest of the desktop for security purposes and unable to interact with the desktop environment.&lt;br /&gt;&lt;br /&gt;OpenSpan desktop service enablement is the platform that allows these applications to integrate with the rest of the desktop. With OpenSpan services exposed at the desktop, these applications can now call services on the local machine just like they would their own backend services. What if your AJAX portal could now display not just data from your backend, but from your soft phone running on the desktop, the host system with your billing data, and your Java email application? What if your users could click a link in the portal and generate calendar invitation in Outlook? What if they could click another link and start an automated billing process?&lt;br /&gt;&lt;br /&gt;OpenSpan desktop service enablement allows you to integrate any server delivered application with the rest of your desktop. Now, instead of using OpenSpan windows forms, you can create a user interface using the technology of your choice but still use OpenSpan to pull and push data, invoke automations and respond to events. Instead of being a “dumb” application that OpenSpan automates and monitors, your application can be a “smart” application that interacts and controls OpenSpan. That’s not just cool, that’s totally freaking awesome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2870112671300253509-2175319929558403235?l=doitonthedesktop.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://doitonthedesktop.blogspot.com/2008/03/desktop-service-enablement-whats-point.html</link><author>noreply@blogger.com (Damon Lockwood)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2870112671300253509.post-2199758656547281194</guid><pubDate>Tue, 18 Mar 2008 22:19:00 +0000</pubDate><atom:updated>2008-03-26T11:00:20.499-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">3.2</category><category domain="http://www.blogger.com/atom/ns#">debugging</category><category domain="http://www.blogger.com/atom/ns#">openspan</category><category domain="http://www.blogger.com/atom/ns#">feature spotlight</category><title>3.2 Feature Spotlight: Debugging</title><description>Over the next few weeks I’ll be writing some articles to spotlight new features in our 3.2 release. For many of our users, the most exciting new feature is debugging. For the first time, you now have the ability to debug OpenSpan automations in real time using paradigms familiar to users of Visual Studio, Eclipse and other IDEs such as breakpoints, step functions, and watch, call stack and thread windows.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Breakpoints&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The essence of debugging is giving the developer the ability to stop execution and examine the state of an application. Stopping execution is referred to as breaking. By breaking execution a developer can find flaws in his logic, scenarios he did not anticipate, or invalid data. The most convenient way to break execution is a breakpoint. A breakpoint is simply a way of telling an application to “stop when you get here.” When the application is run, the debugger will break execution when the breakpoint is reached.&lt;br /&gt;&lt;br /&gt;To set a breakpoint in an OpenSpan automation, simply highlight a link, right click and select “Toggle Breakpoint.” A red dot will now appear on the link indicating that a breakpoint has been set. If you right click on an existing breakpoint, you can select “Disable” to temporarily prevent the debugger from breaking when the breakpoint is reached, or “Delete” to remove the breakpoint entirely.&lt;br /&gt;&lt;br /&gt;When a breakpoint is reached within an automation, the executing link will become a dashed, animated line. The blocks on either side of the link will also be outlined. The executed block will have a solid blue outline whereas the executing block will have a dotted blue outline.&lt;br /&gt;You can view all of the breakpoints you have set within a project in the “Breakpoints” window. The Breakpoints window lists each breakpoint by automation. You can double-click on a breakpoint to go to that automation. You can also enable or disable a breakpoint using the checkbox next to it. If you right-click on an automation, you can also enable, disable or delete all breakpoints within that automation.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step Functions&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Once a breakpoint has been reached, you can begin “stepping” through an automation. By using the step functions, “Step Over” or “Step Into”, you can walk through your logic at your own pace. The “Step Over” function moves the automation to the next yellow execution link. The “Step Into” function moves the automation to the next blue data link, or if there are no blue data links, to the next yellow execution link. Once you have finished stepping through your automation, you can select “Continue” to resume execution until your next breakpoint is reached. The “Step Over”, “Step Into” and “Continue” options are available within the “Debug” menu and toolbar, but most developers simply use the F10, F11 and F5 keys respectively.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Watch Windows&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;When debugging, you can view the value of any property by hovering over its data port in the automation. If you want to “watch” how a property value changes while you step through your automation, you can right-click on the property and select “Add Watch.” The property will now be displayed in the “Watch Window.” Anytime the property changes, the watch window will update to reflect the new value. The watch window can display properties utilized in any automation, even ones that are not open or executing. OpenSpan studio also provides a special type of watch window called the “Locals” window. The “Locals” window will automatically display all of the properties in the currently executing automation.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Call Stack and Threads Windows&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In addition to the “Watch” and “Locals” windows, OpenSpan Studio provides the “Call Stack” and “Threads” windows to help debug automations. The “Call Stack” window shows the previously executed blocks within an automation. This allows you to see what path was executed within your automation to get to your breakpoint. The “Threads” window shows all of the currently executing automation threads. This allows you to debug complicated multi-thread scenarios within your project.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Future Directions&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;With the 3.2 release, OpenSpan has for the first time provided automation developers with integrated debugging. We are already discussing additional debugging features for our future releases such as runtime match rule debugging. Let me know what other debugging features you would like to see.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2870112671300253509-2199758656547281194?l=doitonthedesktop.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://doitonthedesktop.blogspot.com/2008/03/32-feature-spotlight-debugging.html</link><author>noreply@blogger.com (Damon Lockwood)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2870112671300253509.post-1907826464551553734</guid><pubDate>Tue, 18 Mar 2008 17:05:00 +0000</pubDate><atom:updated>2008-03-26T11:01:42.528-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">server</category><category domain="http://www.blogger.com/atom/ns#">integration</category><category domain="http://www.blogger.com/atom/ns#">openspan</category><category domain="http://www.blogger.com/atom/ns#">client</category><title>Server Side or Client Side</title><description>One of the questions we frequently get asked is "When should I use client-side integration instead of server-side integration?" Typically, we provide a list of scenarios where client-side integration is the &lt;strong&gt;only&lt;/strong&gt; viable option:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;You're planning to deprecate the application and don't want to spend money on it anymore.&lt;/li&gt;&lt;li&gt;You didn't write the application, but it doesn't have an integration layer or it's integration layer doesn't provide access to the functionality you need.&lt;/li&gt;&lt;li&gt;You wrote the application, but you don't have anyone with the skillset to modify it or you don't have the source code.&lt;/li&gt;&lt;li&gt;The application doesn't have a backend. It's client-side only.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Today, however, I'd like to make an argument I don't think we make enough. For many scenarios, client-side integration is the &lt;strong&gt;best&lt;/strong&gt; option, even when viable server-side options exist.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;When? &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;When you're trying to make your users more productive.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Because you're spending your money making what they do easier. &lt;/p&gt;&lt;p&gt;You're not spending your money exposing integration points for user oriented tasks. You're not spending your money writing a new user interface that wraps or embeds older functionality. You are automating tasks. You are eliminating errors. You are making your user experience better.&lt;/p&gt;&lt;p&gt;In our industry we are accustomed to thinking that there is only one way to solve user productivity problems: a new user interface. Typically, this means jamming as much functionality as possible into a single window using mashups, portlets, frames, tabs, etc. Now you're users don't have to switch between different windows to do their job. &lt;/p&gt;&lt;p&gt;But was that really the problem? Instead of multiple windows, they now have everything in one place, either smashed together or separated into tabs or frames. They now have a new user interface to learn rather than the one they were accustomed to. Moreover, you're application developers are now spending their time creating portlets, web services, etc. rather than adding new functionality. &lt;/p&gt;&lt;p&gt;But what if the user interface you already have is the best one for that particular business function. It was designed for that specific function. It has been through multiple improvement cycles. It does what you need it to do. Were you really unhappy with the user interface or were you unhappy that you have to switch back and forth when you copy and paste? Or that your workflow requires you to look up the user in three different applications? Or that it takes too long to place an order because the wizard was designed for the public website?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Why are there still so many host systems in the enterprise when windows alternatives have existed for thirty years? &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Because their faster than windows systems so your most productive, expert users don't want to let go of them.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Why are there so many windows systems in the enterprise when web alternatives have existed for 10 years? &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Because their user interfaces are more rich than web systems so your most productive, expert users don't want to let go of them.&lt;/p&gt;&lt;p&gt;When you're trying to make your users more productive, server-side integration is a sledgehammer when you just need a hammer. Your server-side architects and developers should focus on the big integration problems: synchronizing data, backend transactions, exposing web services for your partners. User productivity is a different kind of problem that requires a different kind of solution.&lt;/p&gt;&lt;p&gt;OpenSpan allows you to improve user productivity without changing all of your applications. It allows your users to be more productive without having to be trained on an entirely new system. It allows your users to do what they always did, but faster and with fewer errors. It allows your application developers to focus on new features instead of integration. It not just the &lt;strong&gt;only &lt;/strong&gt;solution, it's the &lt;strong&gt;best&lt;/strong&gt; solution.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2870112671300253509-1907826464551553734?l=doitonthedesktop.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://doitonthedesktop.blogspot.com/2008/03/server-side-or-client-side.html</link><author>noreply@blogger.com (Damon Lockwood)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2870112671300253509.post-7114715537562394112</guid><pubDate>Wed, 27 Feb 2008 02:00:00 +0000</pubDate><atom:updated>2008-03-26T11:01:56.544-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">desktop</category><category domain="http://www.blogger.com/atom/ns#">history</category><category domain="http://www.blogger.com/atom/ns#">openspan</category><title>Why "Do It on the Desktop?"</title><description>When we first started OpenSpan we didn't really have any marketing. When it came time to produce some glossies, we all sat around the table trying to come up with a good catch phrase. We kicked around things like "Empowering Your Enterprise Applications" and "A Remote Control for Your Enterprise Applications." Sometime during that discussion I suggested "Do It on the Desktop." It was short, funny and memorable. Plus, it would make a great trade show t-shirt. Mostly, however, it summed up our philosophy really well.&lt;br /&gt;&lt;br /&gt;Unlike most of our competitors, our technology started on the desktop and was designed for the desktop. From the beginning we did more than just automate applications. We added functionality. We modified behavior. We responded to events. We saw the desktop as the forgotten foundation of the enterprise. Every knowledge worker spends most of their day in front of a screen, moving windows around, entering data, cutting and pasting. We knew we could make those users more productive if we just made their applications work together.&lt;br /&gt;&lt;br /&gt;In the end, we didn't make "Do It on the Desktop" our catch phrase. Since then we've gotten a marketing department and they've come up with some great catch phrases like "The Last Mile of SOA" and "The New Enterprise Desktop." For the technology organization, however, our catch phrase will always be "Do It on the Desktop." I'm still hoping for some t-shirts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2870112671300253509-7114715537562394112?l=doitonthedesktop.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://doitonthedesktop.blogspot.com/2008/02/why-do-it-on-desktop.html</link><author>noreply@blogger.com (Damon Lockwood)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2870112671300253509.post-7962957271874247094</guid><pubDate>Mon, 25 Feb 2008 22:49:00 +0000</pubDate><atom:updated>2008-03-18T18:19:26.871-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">openspan</category><title>Welcome!</title><description>Welcome to the new OpenSpan Development blog. My name is Damon Lockwood and I am the Vice President of Product Development and one of the founders of OpenSpan. In this blog, I'll be covering all things related to our technology including new features, upcoming releases, best practices and future directions. From time to time, I'll include guest contributions from other members of our team.&lt;br /&gt;&lt;br /&gt;I'm really hoping this can be a forum to share information and get feedback about OpenSpan. So let me know what you want to hear about!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2870112671300253509-7962957271874247094?l=doitonthedesktop.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://doitonthedesktop.blogspot.com/2008/02/welcome.html</link><author>noreply@blogger.com (Damon Lockwood)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item></channel></rss>
