<?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>Any set of characters</title>
	<atom:link href="http://blogs.herod.net/steven/feed" rel="self" type="application/rss+xml" />
	<link>http://blogs.herod.net/steven</link>
	<description>More ramblings of another IT Architect type...</description>
	<lastBuildDate>Tue, 24 Aug 2010 01:35:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Top Android annoyances.</title>
		<link>http://blogs.herod.net/steven/archives/402</link>
		<comments>http://blogs.herod.net/steven/archives/402#comments</comments>
		<pubDate>Sun, 22 Aug 2010 11:28:48 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blogs.herod.net/steven/?p=402</guid>
		<description><![CDATA[HTC Desire / Android annoyances Keyboard drives me nuts with mistyping, even with swype Can&#8217;t accurately position cursor with touch Can&#8217;t swipe to delete email Can&#8217;t double touch to scroll web pages to the top SMS app doesn&#8217;t go back to main message list when I press back button SD card sometimes &#8216;mysteriously&#8217; gets mounted as read [...]]]></description>
			<content:encoded><![CDATA[<div>HTC Desire / Android annoyances</div>
<ol>
<li>Keyboard drives me nuts with mistyping, even with swype</li>
<li>Can&#8217;t accurately position cursor with touch</li>
<li>Can&#8217;t swipe to delete email</li>
<li>Can&#8217;t double touch to scroll web pages to the top</li>
<li>SMS app doesn&#8217;t go back to main message list when I press back button</li>
<li>SD card sometimes &#8216;mysteriously&#8217; gets mounted as read only, meaning I can&#8217;t take photos/video without restarting phone.</li>
<li>When out of battery, it starts to &#8216;shut down&#8217;, but never does, just has the &#8216;shutting down&#8217; message forever&#8230;. until last gasp of battery</li>
<li>Occasionally very slow to respond to touch events</li>
<li>Runs out of disk space very quickly (all apps on internal storage), when it does, it will silently fail to check email until this error is corrected.</li>
<li>Can&#8217;t search gmail inbox without a data connection.</li>
<li>Uses *alot* of data, regularly using 1GB a data a month, when on iPhone used &lt; 500MB</li>
<li>Google sync goes batshit occasionally, gets in a endless sync mode (see point 10)</li>
<li>Gmail inbox won&#8217;t sync changed to Gmail reliably.</li>
<li>Active Sync with work Exchange is not reliable, often won&#8217;t check mail until app is killed and restarted.</li>
<li>Zooming on web pages is sometimes problematic, zooming out when you pinch in</li>
<li>Syncing music is a PITA, even with Doubletwist, which wins the award for being both slow and giving little feedback on sync progress.</li>
<li>Won&#8217;t natively tether with my mac.</li>
<li>Only tethers over cable, not bluetooth.</li>
<li>Worse battery life than my iPhone 3G, esp overnight with data turned off, expect to use 1/3 battery.</li>
<li>Screen hard to read in daylight</li>
<li>No Froyo / 2.2 update for months after official release</li>
<li>Music player doesn&#8217;t stop playing when you start watching a video (like on iPhone), sometimes not during calls.</li>
<li>Proximity sensor is PITA when bluetooth is enabled, can&#8217;t &#8216;approach&#8217; the phone from the left hand side without the screen blacking out.</li>
<li>Limited access to accessories (power charges, cases etc).</li>
<li>Doesn&#8217;t support a HTTP Proxy when on WiFi (won&#8217;t work at work then).</li>
<li>Doesn&#8217;t support a fixed IP address when on WiFi (My home network has issues with DHCP working reliably)</li>
<li>Updating apps sometimes fail, leaving invalid shortcuts on desktop.</li>
<li>After installing an app (Locale), my Manage Applications area crashes every time you try to run it.</li>
<li>Voice search is hilariously inaccurate</li>
</ol>
<p>Good things</p>
<ol>
<li>Notifications system</li>
<li>Chat is a viable application thanks to background tasks</li>
<li>Phone still mostly usable when syncing</li>
<li>Fast to use</li>
<li>Some good quality applications</li>
<li>Back button.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blogs.herod.net/steven/archives/402/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Rimuhosting Support</title>
		<link>http://blogs.herod.net/steven/archives/400</link>
		<comments>http://blogs.herod.net/steven/archives/400#comments</comments>
		<pubDate>Thu, 19 Aug 2010 02:39:22 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blogs.herod.net/steven/?p=400</guid>
		<description><![CDATA[Recently Rimuhosting remarked they were having a quiet day, so I raised an issue asking for a good weekend away suggestion near Wollongong (my home town). I got this response within a few minutes&#8230;. Heya Thanks for your query regarding holiday locations. First of all, i would advise against going to such places as Wollongong. [...]]]></description>
			<content:encoded><![CDATA[<p>Recently Rimuhosting remarked they were having a quiet day, so I raised an issue asking for a good weekend away suggestion near Wollongong (my home town).</p>
<p>I got this response within a few minutes&#8230;. <img src='http://blogs.herod.net/steven/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Heya</p>
<p>Thanks for your query regarding holiday locations. First of all, i would advise against going to such places as Wollongong. Its a dangerous place and contains a lot of Australians. Australians have a history of coming from primarily prisoners so we generally equate them with 3rd world type people.<br />
According to the locals in wollongong they cant even make up their mind what the town name means ( http://en.wikipedia.org/wiki/Wollongong,_New_South_Wales )</p>
<p>Ideally you should take your holiday somewhere more like a tropical island, somewhere like New Zealand! Of course you would wait to make sure you enjoy the upper class people of the country so staying away from the main centers is a must, head for the smaller townships.<br />
Since you are a computer geek, and would seek similar company I would suggest Cambridge is the place to be, i can arrange a tour guide complete with tour of the Rimuhosting offices and optional curry.<br />
Included is free internet usage, plenty of coffee and free accommodation.</p>
<p>Let us know if you would be happy to arrange this and we will go ahead sorting that out right away.</p>
<p>Regards,<br />
Liz Quilty<br />
Rimuhosting.com</p>
<p>http://twitter.com/RHLiz</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.herod.net/steven/archives/400/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Android on the Telstra Desire.  First impressions.</title>
		<link>http://blogs.herod.net/steven/archives/396</link>
		<comments>http://blogs.herod.net/steven/archives/396#comments</comments>
		<pubDate>Sat, 22 May 2010 12:46:56 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blogs.herod.net/steven/?p=396</guid>
		<description><![CDATA[I thought I&#8217;d just drop down my thoughts on moving from the iPhone 3G on Optus to a HTC Desire running Android on Telstra. These are rough thoughts, I hope to refine them over the next few days. I&#8217;d like to note, this is my first impressions based on no googling to resolve any issues, [...]]]></description>
			<content:encoded><![CDATA[<p>I thought I&#8217;d just drop down my thoughts on moving from the iPhone 3G on Optus to a HTC Desire running Android on Telstra.  These are rough thoughts, I hope to refine them over the next few days.</p>
<p>I&#8217;d like to note, this is my first impressions based on no googling to resolve any issues, or even reading the instructions.  I&#8217;m going by &#8216;feel&#8217;.</p>
<p>Hardware</p>
<p>It&#8217;s feels like a substantial bit of quality kit and actually feels &#8216;soft&#8217; to the touch, buttons are in the usual place, far more of them than the iPhone.  And its fast, very fast (compared to the 3G)</p>
<p>Software</p>
<p>This is the first time i&#8217;ve spent with an Android phone, and this one is running HTC&#8217;s Sense UI.  To be frank, I&#8217;m not sure what the difference is between Android &#8216;standard&#8217; and what HTC Sense adds, but what I had read before purchasing had mentioned then HTC Sense was an improvement over the default Android behaviour.  If that&#8217;s true &#8211; well, the gap between iPhone and Android is bigger than I thought.</p>
<p>Text entry</p>
<p>Entering text on the virtual keypad is pretty straightforward, I can&#8217;t say the buzzing on keystroke adds much, but the suggestion of multiple options for various words is an improvement over the iPhone, esp since one of the suggestions is what you actually typed, an absence of which on the iPhone was a petty annoyance of mine.</p>
<p>Sadly, the iPhones ability to position the cursor by touching the text and then using pressure and the magnifying glass to get it in the right spot is missing, instead you have to use the optical track pad to move the cursor around &#8216;old style&#8217;.  Annoyingly my muscle memory makes me touch the text, resulting in a full screen context menu popping up.  </p>
<p>Gestures</p>
<p>Some gestures from the iPhone carry over, pinching and zooming for instance, others however are lost, swiping to delete an email message or tapping the top of the browser window to fast scroll to the top.  The later is an issue for me, long web pages must be &#8216;swiped and swiped&#8217; to reach the top.</p>
<p>Performance</p>
<p>The phone is fast, very, very fast.  Apps start almost instantly and web pages render almost as fast.  I can&#8217;t fault it.</p>
<p>Telstra</p>
<p>Telstra brings its best asset to the party with the NextG network, its truly a revelation to me having come from Optus.  I&#8217;ve made next to no calls on the phone, but the data is always available and always fast, staggeringly fast in some cases.  YouTube loads without buffering, apps download and install, maps (and so on and so on).  Being able to load the Bananaman intro from *normal* YouTube at a small cafe in Otford without a moments buffering&#8230;. well, unexpected after 2 years on the Optus network.</p>
<p>But Telstra adds its own annoyances, the BigPond team may have let you out of their walled garden, but they want you back, and so appear to add several apps to the phone, some of which duplicate what HTC have added &#8211; most of the apps turn out to be simply links back into the Telstra 3G web portal, and annoyingly, they don&#8217;t work when you are on WiFi &#8211; the Navigation app being a classic example of Telstra fail.  Whilst its a &#8216;real app&#8217;, from Gamin, it only works when on NextG, and throws errors/crashes when started on WiFi.  You also have to subscribe to a monthly plan to continue using it.  Which is typical of the Telstra nickel and dime approach.</p>
<p>Applications</p>
<p>The phone comes with 3 mail applications, 2 navigation applications and many other duplicates, it seems Google have the Android standards, HTC throws in their &#8216;value add&#8217;, and Telstra rounds out the pack with its own.  Many of them don&#8217;t seem to be able to be removed.   The Android market contains Android version of my fav iPhone apps: Dropbox, Evernote, Twitter for Android, Foursquare.  But its also seems to have its fair share of crap &#8211; alot of the &#8216;top sellers&#8217; seems surprisingly amaturish.  Oh, and you better have your credit card handy for any purchases.</p>
<p>Android</p>
<p>To be honest, I had higher expectations.  The notification system and background apps really shine through &#8211; it&#8217;s a big improvement over the iPhone.  But you can&#8217;t seem to quit applications &#8211; ever.   Apparently Android manages this for you, but when you&#8217;ve got HTC Peep and Twitter for iPhone both running and telling you you have (The same) tweets, the flaw in this logic becomes apparent.   Since I can&#8217;t seem to uninstall the HTC app, I&#8217;ve resorted to deleting my username/password from it.  Hopefully it&#8217;ll get the idea and stop annoying me.</p>
<p>I pity non-technical users of the phone.   The applications list under settings offers such installed items as &#8220;com.google.android&#8230;.&#8221; and &#8220;Calendar&#8221; and &#8220;Calendar Storage&#8221;, or &#8220;Shared service provider&#8221;.   It&#8217;s probably a bit too much of the internals exposed.  And no, you can&#8217;t seem to uninstall the shovelware that HTC and Telstra have burdened you with.</p>
<p>Overall.</p>
<p>Its fast device that seems quite well made, the Telstra network seems, so far, to be much faster and more reliable than Optus but for me, the let down is Android which feels like  iPhone OS on cocaine.</p>
<p>Let&#8217;s see if the true glory shines through over the next few days.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.herod.net/steven/archives/396/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How much Architecture do you need?</title>
		<link>http://blogs.herod.net/steven/archives/392</link>
		<comments>http://blogs.herod.net/steven/archives/392#comments</comments>
		<pubDate>Thu, 05 Nov 2009 10:04:01 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blogs.herod.net/steven/archives/392</guid>
		<description><![CDATA[Recently a conversation came up on the Illegal Arguement converasation about &#8216;how much architecture is needed&#8217;, and I responded in a post on their mailing list.  This blog entry is an elaboration on that post. In my opinion, that depends on your organisational context. Some of the Architecture documentation I&#8217;ve constructed in my professional life [...]]]></description>
			<content:encoded><![CDATA[<p style="color:#008;text-align:right;" align="left">Recently a conversation came up on the Illegal Arguement converasation about &#8216;how much architecture is needed&#8217;, and I responded in a post on their mailing list.  This blog entry is an elaboration on that post.</p>
<p>In my opinion, that depends on your organisational context. </p>
<p>Some of the Architecture documentation I&#8217;ve constructed in my professional life has been in the kind of environment which is all about butt covering and decision justification, sadly the  communication of concepts to a team of developers is of secondary concern.  </p>
<p>In some cases, an external party would be included to do an Architecture Review on a design prior to approval.  Generally this was motivated by a visible failure in the past and there was a political concern that needed to be mitigated.  In short, it was an expensive form of box ticking.  </p>
<p>As an outcome, the reviewed documents needed to be  detailed and contain lots of redundant information and statements of what most would believe was the blatently obvious.  Further more, they needed to be structured around an industry best practise.  Not because it was the necessary thing, but because it was the expected thing.</p>
<p>By their nature these kind of documents were also completed well ahead of software construction, usually at business case stage and with technologies and frameworks picked like you might select a breakfast cereal (From <br />reading &#8216;the back of the box&#8217;).   A depressing way of doing things, but unavoidable given time and circumstance.</p>
<p>So whats the answer?</p>
<p>Personally, I feel its all  proportional to how much contact you have with the implementers of the solution and the strength of that relationship. In the environment I&#8217;m referring to above, I was  distant from them, in fact, on some of the projects, I wasn&#8217;t involved in delivery at all. Just the intial documents and pre-project meetings. </p>
<p>If thats your situation then there is no substitute for detail.  You needed to be explicit and obvious as the contractor who turned up yesterday is likely going implement the project &#8216;their way&#8217; and it seems, people can come up with no end of variation from what rational thought might expect.</p>
<p>Further more if you are in a hostile environment, full of politics  and a low acceptance for any perceived failure (i.e. an &#8216;Enterprise&#8217;) then you are in for a hard time and you better get used to TOGAF, Zachmann, UML and your favorite design patterns book.</p>
<p>But, if you are directly involved in the delivery and a good relationship with the implementors, then I believe the required documentation should be  &#8216;not much&#8217;, you might even suffice maybe a list of bullet points and a few high level diagrams and suppliment it a constant stream of guiding conversations during the delivery process.</p></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.herod.net/steven/archives/392/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>XML &#8211; its not bad, it&#8217;s just used that way.</title>
		<link>http://blogs.herod.net/steven/archives/390</link>
		<comments>http://blogs.herod.net/steven/archives/390#comments</comments>
		<pubDate>Wed, 28 Oct 2009 21:45:15 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blogs.herod.net/steven/archives/390</guid>
		<description><![CDATA[It&#8217;s pretty popular these days to kick XML, all the cool kids are doing it and they don&#8217;t seem to discriminate between its &#8216;good&#8217; purposes and &#8216;bad&#8217; uses. The general comment seems to be: &#34;XML is bad m&#8217;kay?&#34; Well, I disagree. Sure, its a crappy programming language, a verbose wire protocol, its got a stack [...]]]></description>
			<content:encoded><![CDATA[<p style="color:#008;text-align:right;" align="left">It&#8217;s pretty popular these days to kick XML, all the cool kids are doing it and they don&#8217;t seem to discriminate between its &#8216;good&#8217; purposes and &#8216;bad&#8217; uses.</p>
<p>The general comment seems to be: &quot;XML is bad m&#8217;kay?&quot;</p>
<p>Well, I disagree. </p>
<p>Sure, its a crappy programming language, a verbose wire protocol, its got a stack of super complicated standards and it&#8217;s been perverted into doing things you only find in the darker parts of the net, but it&#8217;s pretty good at one thing: <strong>Representing structured documents.</strong></p>
<p>You know, what it actually was designed for.</p>
<p>So if you want to store (and/or exchange) Invoices, Insurance Policies, Application Forms, basically anything where structure is essential but variation inherent &#8211; XML is going to be your best friend.</p>
<p>But, its not all smooth sailing and over the  years of doing Business to Business XML based messaging across the Retail, Supply Chain, Transport and Insurance industries I&#8217;ve learned a few things:</p>
<p><strong>Things not to worry about</strong></p>
<p>Put concerns about performance and tooling to one side &#8211; performance isn&#8217;t an issue (most of the time) and no matter what you choose, all the tooling still sucks (sadly).  Learn to work with it <img src='http://blogs.herod.net/steven/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Things you should worry about</strong></p>
<p><strong>Don&#8217;t neglect your information design</strong></p>
<p>Too often tools like XML Spy give people the impression that Schema design is a task that can be undertaken without to much thought.  (And in some cases, that can be true). </p>
<p>But its not true for any document of any complexity, and just as you shouldn&#8217;t let random developers make uncontrolled additions to your domain model or database schema, you must protect your schemas with <strong>governance and review processes</strong>. </p>
<p>If you can get a single person to be your &quot;Schema Lord&quot;, do it.</p>
<p><strong>Version control  your schema from the get go</strong></p>
<p>You haven&#8217;t got it right and it will have to change.  Count it in from the beginning</p>
<p>Personally, I like the month/year style of dating the XSD files (myschema_092009.xsd).  And remember, you only need to change versions if its a breaking change.</p>
<p><strong>All industry &#8216;standards&#8217; suck</strong></p>
<p>In my world, suck is defined as designed by committee.  As such they will be large, complicated and likely to be  so abstract they do not relate to your problem. </p>
<p>Tooling often chokes on them as well, with all those imports and custom types, you often will hit breakages in your tooling.  Don&#8217;t trust it until you see it working yourself.</p>
<p>Further more, with the standards being so big their is a very strong chance that all parties will not have the same implementation of the &#8216;standard. </p>
<p>Approach adoption of industry &#8216;standards&#8217; with a pinch of salt and box of asprin &#8211; and be ready to cater for differences between implementations with any of your trading partners.</p>
<p><strong>XML schema validation is only the beginning of your validation requirements</strong></p>
<p>XML schema validation only validates a limited number of things, its not covering all of your problems.  Further more, most schema validation feedback is total garbage &#8211; you can&#8217;t show it to an end user, and you likely can&#8217;t even send it to a technical party. Keep this in mind.</p>
<p><strong>You might need to deal with stuff that doesn&#8217;t validate</strong></p>
<p>Got that fancy schema? Lots of mandatory elements because you want to be super awesome? Great.  I need to save the document as &#8216;draft&#8217; &#8211; its a form that the user hasn&#8217;t finished filling in yet.</p>
<p>Ah, that tooling you&#8217;ve got where the first thing it does is validate the schema, yeah, it breaks now&#8230;.</p>
<p><strong>The people you deal with, might not &#8216;get it&#8217;.</strong></p>
<p>There are a lot of people out there for whom XML is just a bunch of &lt;  and &gt; signs and nothing else.  CDATA? Validation?  Attributes?  Root elements?  Encoding? meh, its not important. </p>
<p>So before you design your super format, check that the other party knows the basics and isn&#8217;t just treating XML asa  CSV format with lots of extra crud in it.</p>
<p>Sadly, your righteous indignation over their inability to conform to &quot;the right way&quot; may be morally correct, but it tends not to convince others, especially if they are paying the bills.</p>
<p><strong>Conclusion</strong></p>
<p>This is all pretty off the cuff stuff on my part, if you feel the need to have me elaborate, leave a comment <img src='http://blogs.herod.net/steven/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.herod.net/steven/archives/390/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Personal Ethics</title>
		<link>http://blogs.herod.net/steven/archives/387</link>
		<comments>http://blogs.herod.net/steven/archives/387#comments</comments>
		<pubDate>Wed, 28 Oct 2009 08:53:27 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://blogs.herod.net/steven/archives/387</guid>
		<description><![CDATA[I received a document today from a colleague relating to a project we&#8217;re undertaking over the next few months. The document had been prepared by my predecessor, somebody I haven&#8217;t met and have only heard about second hand. I opened the document and my first impression was it was pretty robust and detailed piece of [...]]]></description>
			<content:encoded><![CDATA[<p style="color:#008;text-align:right;" align="left">I received a document today from a colleague relating to a project we&#8217;re undertaking over the next few months.</p>
<p>The document had been prepared by my predecessor, somebody I haven&#8217;t met and have only heard about second hand.</p>
<p>I opened the document and my first impression was it was pretty robust and detailed piece of work.  It was quite well executed and full of some very specific advice about deploying SharePoint; particularly in a virtualized environment.</p>
<p>However, the more I read the more I noticed it&#8217;s unusual tone.   It seem a little to effusive and upbeat and its choice of tense in a few locations seemed to jar with the overall nature of the document.</p>
<p>It also contained a significant number of disclaimers, more than I&#8217;d ever seen in an internal document, and certainly more than I would expect given the nature of the organisation I&#8217;m currently working with.</p>
<p>So I decided to extract a few sentences and run them through Google.</p>
<p>And what did I find&#8230;.</p>
<p>Of the eleven or so pages in the document, I&#8217;d say around 6 pages, the bulk of the text, were lifted directly, and without modification, from Microsoft documents about SharePoint.</p>
<p>No attribution, no references, no footnotes.  All of it claimed as original work.</p>
<p>In my opinion, a clear case of plagiarism.</p>
<p>Am I surprised?  Not entirely, I&#8217;ve been around long enough to see and hear about some pretty odd behaviors by people. </p>
<p>But it still leaves me incredulous that someone would risk their job and the professional reputation in such away.</p>
<p>Was it lazyness?  Was it a cover for lack of knowledge?  Was it lack of time?  Lack of motivation?</p>
<p>I&#8217;ll never know.  </p>
<p>But on the plus side, I&#8217;ve discovered some useful Microsoft documents about SharePoint <img src='http://blogs.herod.net/steven/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.herod.net/steven/archives/387/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MOSS 2007 ECS (Excel Calculation Services) and Java (JAX-WS)</title>
		<link>http://blogs.herod.net/steven/archives/374</link>
		<comments>http://blogs.herod.net/steven/archives/374#comments</comments>
		<pubDate>Wed, 05 Aug 2009 01:43:47 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blogs.herod.net/steven/?p=374</guid>
		<description><![CDATA[What the?? For those unfamiliar, the Enterprise Edition of Microsoft Office Sharepoint Server (MOSS) has an embedded MS-Excel engine which allows you to host Excel Spreadsheets on MOSS and have it be a hosted calculation engine, using an Excel Spreadsheet as its driving logic.  Further more, this excel spreadsheet can be exposed to the network [...]]]></description>
			<content:encoded><![CDATA[<h1>What the??</h1>
<p>For those unfamiliar, the Enterprise Edition of Microsoft Office Sharepoint Server (MOSS) has an embedded MS-Excel engine which allows you to host Excel Spreadsheets on MOSS and have it be a hosted calculation engine, using an Excel Spreadsheet as its driving logic.  Further more, this excel spreadsheet can be exposed to the network over a SOAP based web service.</p>
<p>This permits you to access business logic stored within Excel from a traditional Java based web application.  An important concept if you are working with legacy formula&#8217;s or have a relatively low value problem that doesn&#8217;t wish to incur the cost of duplicating business logic in Java.</p>
<p>(Of course, this sidesteps the considerable cost (in some cases) of MOSS.  Best you check with your organisations MS agreement to see what it&#8217;s going to cost).</p>
<p>There are an number of ingredients in the process.</p>
<ol>
<li> You&#8217;ll need Sharepoint setup and configured</li>
<li>You&#8217;ll need to configure up Excel Calculation Services on sharepoint</li>
<li>You&#8217;ll need to clean up your spreadsheet to make it ECS compatible</li>
<li>You&#8217;ll need to construct a Java client for talking to the Spreadsheet.</li>
</ol>
<h1>Getting  Sharepoint running.</h1>
<p>For my work, I took evaluation copies of</p>
<ul>
<li>VMWare</li>
<li>MOSS 2007 Enterprise CAL  (See <a rel="nofollow" href="http://office.microsoft.com/search/redir.aspx?AssetID=XT102011901033&amp;CTT=5&amp;Origin=HA101978031033" onclick="pageTracker._trackPageview('/outgoing/office.microsoft.com/search/redir.aspx?AssetID=XT102011901033_amp_CTT=5_amp_Origin=HA101978031033&amp;referer=');">this product comparison</a> spreadsheet and the Business  intelligence tab within it).</li>
<li>MS Windows Server 2008</li>
</ul>
<p>And I followed the instructions located here:</p>
<p><a rel="nofollow" href="http://blogs.msdn.com/andreww/archive/2009/04/21/excel-services-setup-and-getting-started.aspx" onclick="pageTracker._trackPageview('/outgoing/blogs.msdn.com/andreww/archive/2009/04/21/excel-services-setup-and-getting-started.aspx?referer=');">http://blogs.msdn.com/andreww/archive/2009/04/21/excel-services-setup-and-getting-started.aspx</a></p>
<p>The only additional rule to make the system work from outside was a change to  the Windows Firewall to permit incoming TCP connections to the port that the  Sharepoint website gets created on.</p>
<h1><a name="ExcelCalculationServicesandJava-CleaninguptheExcelSpreadsheet"></a>Cleaning  up the Excel Spreadsheet</h1>
<p>Excel Calculation Services is not compatible with all the features that are  in MS Excel spreadsheets, specifically</p>
<ul>
<li>Sheet protection</li>
<li>Data Validation</li>
<li>Comments</li>
<li>Shapes (Images, arrows, text boxes)</li>
<li>VBA (Macros)</li>
</ul>
<p>You need to clean up the spreadsheet prior to loading it, and verify that  your cleaning has been successful by &#8220;Viewing the file in Web Browser&#8221;.</p>
<p>To clean up the spreadsheet, you need to</p>
<ol>
<li>Unprotect all worksheets in the spreadsheet.</li>
<li><a title="Adding a macro to Excel" href="http://blogs.herod.net/steven/macro-for-deleting-a-objects-from-a-ms-excel-spreadsheet">Add this macro to the  file</a>, and run it to clean up comments and shapes</li>
<li>Select all cells in any worksheet with data validation (drop boxes!) and  delete the data validation.</li>
<li>Save as a normal excel Spreadsheet (not the Macro enabled version) this  cleans up the VBA you used to delete the other objects.</li>
</ol>
<p>To publish the spreadsheet, select that stupid microsoft circle, then select  &#8216;Publish&#8217; and &#8216;Excel Web Services&#8217; then pick the server details.</p>
<p>After it is published, it should open a web browser in web view, If it  is successfully rendered in HTML, then it is ready for access over the web  service.</p>
<h1><a name="ExcelCalculationServicesandJava-TheJavaClient"></a>The Java  Client</h1>
<p>My test client were created using using Netbeans 6.7 and its JAX-WS support, basically  it consists of</p>
<ol>
<li>Consuming the WSDL for the Excel Data Services within netbeans (<a rel="nofollow" href="http://blogs.msdn.com/andreww/archive/2009/05/20/excel-services-getting-started-pt4-web-service-apis.aspx" onclick="pageTracker._trackPageview('/outgoing/blogs.msdn.com/andreww/archive/2009/05/20/excel-services-getting-started-pt4-web-service-apis.aspx?referer=');">background information here</a> and <a rel="nofollow" href="http://msdn.microsoft.com/en-us/library/ms579185.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/ms579185.aspx?referer=');">MS  reference info here</a>) and generating code</li>
<li><a rel="nofollow" href="http://biemond.blogspot.com/2009/04/jax-ws-web-service-proxy-client-and.html" onclick="pageTracker._trackPageview('/outgoing/biemond.blogspot.com/2009/04/jax-ws-web-service-proxy-client-and.html?referer=');">Modifying your client</a> to use the appropriate NTLM  authentication details.</li>
</ol>
<p>Inserting the calls to each web service  (right click in the main method, and  select &#8220;Insert code&#8221; then &#8220;Call webservices operation&#8221; and then pick your  call.</p>
<p>The basic steps you need to follow are:</p>
<ol>
<li>Open the workbook and obtain a session ID</li>
<li>Add 1 to n values to either numbered cells (setCellA), or named cells  (setCellA1) <strong>OR more efficiently, call setRangeA1 and muck around with  Arrays.</strong></li>
<li>Call calculate on the worksheet</li>
<li>Close the worksheet.</li>
</ol>
<p>And that&#8217;s it!</p>
<p>Here is some sample code</p>
<p>Below is the minimal case using ranges.</p>
<pre class="brush: java">

public static void main(String[] args) {
MyAuthenticator myAuth = new MyAuthenticator(&quot;dontfreakout\\administrator&quot;, &quot;mr31#UE&quot;);
Authenticator.setDefault(myAuth);

String sessionId = &quot;&quot;;

try { // Call Web Service Operation
com.microsoft.schemas.office.excel.server.webservices.ExcelService service = new com.microsoft.schemas.office.excel.server.webservices.ExcelService();
com.microsoft.schemas.office.excel.server.webservices.ExcelServiceSoap port = service.getExcelServiceSoap12();
// TODO initialize WS operation arguments here
java.lang.String workbookPath = &quot;http://win-0v6f2x2aun4:32089/sites/phoenix2/Rating%20engine/Phoenix%20Strata.xlsx&quot;;
java.lang.String uiCultureName = &quot;&quot;;
java.lang.String dataCultureName = &quot;&quot;;
javax.xml.ws.Holder&lt;java.lang.String&gt; openWorkbookResult = new javax.xml.ws.Holder&lt;java.lang.String&gt;();
javax.xml.ws.Holder&lt;com.microsoft.schemas.office.excel.server.webservices.ArrayOfStatus&gt; status = new javax.xml.ws.Holder&lt;com.microsoft.schemas.office.excel.server.webservices.ArrayOfStatus&gt;();
port.openWorkbook(workbookPath, uiCultureName, dataCultureName, openWorkbookResult, status);

sessionId = openWorkbookResult.value;
} catch (Exception ex) {
// TODO handle custom exceptions here
}

try { // Call Web Service Operation
com.microsoft.schemas.office.excel.server.webservices.ExcelService service = new com.microsoft.schemas.office.excel.server.webservices.ExcelService();
com.microsoft.schemas.office.excel.server.webservices.ExcelServiceSoap port = service.getExcelServiceSoap12();
// TODO initialize WS operation arguments here
java.lang.String sheetName = &quot;Phoenix&quot;;
java.lang.String rangeName = &quot;INPUTS&quot;;
com.microsoft.schemas.office.excel.server.webservices.ArrayOfAnyType rangeValues = new com.microsoft.schemas.office.excel.server.webservices.ArrayOfAnyType();

/*  Now we set all the values in the range by adding them to the list, basically its a top down table.
*/
rangeValues.getAnyType().add(&quot;01/01/2009&quot;);
rangeValues.getAnyType().add(&quot;31/12/2009&quot;);
rangeValues.getAnyType().add(&quot;My Policy Number&quot;);
rangeValues.getAnyType().add(&quot;Strata number&quot;);
rangeValues.getAnyType().add(&quot;3000&quot;);
rangeValues.getAnyType().add(&quot;20000000&quot;);
rangeValues.getAnyType().add(&quot;Non Brick&quot;);
rangeValues.getAnyType().add(&quot;20&quot;);
rangeValues.getAnyType().add(&quot;2&quot;);
rangeValues.getAnyType().add(&quot;YES&quot;);
rangeValues.getAnyType().add(&quot;15000000&quot;);
rangeValues.getAnyType().add(&quot;0&quot;);
rangeValues.getAnyType().add(&quot;2000&quot;);
rangeValues.getAnyType().add(&quot;1&quot;);
rangeValues.getAnyType().add(&quot;2&quot;);
rangeValues.getAnyType().add(&quot;10000000&quot;);
rangeValues.getAnyType().add(&quot;2&quot;);
rangeValues.getAnyType().add(&quot;4000000&quot;);
com.microsoft.schemas.office.excel.server.webservices.ArrayOfStatus result = port.setRangeA1(sessionId, sheetName, rangeName, rangeValues);
System.out.println(&quot;Result = &quot; + result);
} catch (Exception ex) {
// TODO handle custom exceptions here
}

/*
* You also now need to explicitly call calc on the spreadsheet, so your updates now have an outcome.
*/
try { // Call Web Service Operation
com.microsoft.schemas.office.excel.server.webservices.ExcelService service = new com.microsoft.schemas.office.excel.server.webservices.ExcelService();
com.microsoft.schemas.office.excel.server.webservices.ExcelServiceSoap port = service.getExcelServiceSoap12();
// TODO initialize WS operation arguments here
com.microsoft.schemas.office.excel.server.webservices.CalculateType calculateType = null;
// TODO process result here
com.microsoft.schemas.office.excel.server.webservices.ArrayOfStatus result = port.calculateWorkbook(sessionId, calculateType);
System.out.println(&quot;Result = &quot; + result);
} catch (Exception ex) {
// TODO handle custom exceptions here
}

try { // Call Web Service Operation
com.microsoft.schemas.office.excel.server.webservices.ExcelService service = new com.microsoft.schemas.office.excel.server.webservices.ExcelService();
com.microsoft.schemas.office.excel.server.webservices.ExcelServiceSoap port = service.getExcelServiceSoap12();
// TODO initialize WS operation arguments here
java.lang.String sheetName = &quot;Phoenix&quot;;
java.lang.String rangeName = &quot;ALL_TOTALS&quot;;
boolean formatted = false;
javax.xml.ws.Holder&lt;com.microsoft.schemas.office.excel.server.webservices.ArrayOfAnyType&gt; getRangeA1Result = new javax.xml.ws.Holder&lt;com.microsoft.schemas.office.excel.server.webservices.ArrayOfAnyType&gt;();
javax.xml.ws.Holder&lt;com.microsoft.schemas.office.excel.server.webservices.ArrayOfStatus&gt; status = new javax.xml.ws.Holder&lt;com.microsoft.schemas.office.excel.server.webservices.ArrayOfStatus&gt;();
port.getRangeA1(sessionId, sheetName, rangeName, formatted, getRangeA1Result, status);

/*  It gets funky here as we are handling of a two dimensional array response (as the totals result is a 2d grid)
*
*  It&#039;s top to down, left to right
*/

Iterator i = getRangeA1Result.value.getAnyType().iterator();
while (i.hasNext()) {

Iterator j = ((ArrayOfAnyType)i.next()).getAnyType().iterator();
while (j.hasNext()) {
System.out.println(j.next());
}
}
System.out.println(&quot;Finished&quot;);
} catch (Exception ex) {
ex.printStackTrace();
}

}
</pre>
<p>Below is the minimal case setting cells one by one, you&#8217;ll need the  supporting libraries of course and the code generated, best to open the  project.</p>
<pre class="brush: java">

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package sharepointtest1;

import java.net.Authenticator;

/**
*
* @author sherod
*/
public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {

/*
* This is a custom authenticator to override what java does on your machine by default.
* What it does, by default, is pass the authenticated windows user who is running the program
* when it is challenged by sharepoint for NTLM credentials.
*
* Adding a custom authenticator here allows you to inject different credentials, to cheat, I&#039;ve justed the
* administrator details for the Virtual machine, they have admin rights to Sharepoint.
*/
MyAuthenticator myAuth = new MyAuthenticator(&quot;dontfreakout\\administrator&quot;, &quot;password&quot;);
Authenticator.setDefault(myAuth);

String sessionId = &quot;&quot;;

/* Open the workbook.  Note the path to the location of the workbook inside sharepoint
* also note the way we get back the sessionId, you&#039;ll need this to maintain state for the subsequent webservices calls
*/

try { // Call Web Service Operation
com.microsoft.schemas.office.excel.server.webservices.ExcelService service = new com.microsoft.schemas.office.excel.server.webservices.ExcelService();
com.microsoft.schemas.office.excel.server.webservices.ExcelServiceSoap port = service.getExcelServiceSoap12();
// TODO initialize WS operation arguments here
java.lang.String workbookPath = &quot;http://win-0v6f2x2aun4:32089/sites/testsite/Test%20library/Simple%20spreadsheet.xlsb&quot;;
java.lang.String uiCultureName = &quot;&quot;;
java.lang.String dataCultureName = &quot;&quot;;
javax.xml.ws.Holder&lt;java.lang.String&gt; openWorkbookResult = new javax.xml.ws.Holder&lt;java.lang.String&gt;();
javax.xml.ws.Holder&lt;com.microsoft.schemas.office.excel.server.webservices.ArrayOfStatus&gt; status = new javax.xml.ws.Holder&lt;com.microsoft.schemas.office.excel.server.webservices.ArrayOfStatus&gt;();
port.openWorkbook(workbookPath, uiCultureName, dataCultureName, openWorkbookResult, status);

sessionId = openWorkbookResult.value;
} catch (Exception ex) {
// TODO handle custom exceptions here
}

System.out.println(&quot;Session ID?:&quot; + sessionId);

/* Now we make the setCellA1 call to place values into the spreadsheet.
* Note this is using the named ranges approach, note the name of the Sheet1 and the range.
*
* You could also use setCell, and use x/y coordinates.
*/

try { // Call Web Service Operation
com.microsoft.schemas.office.excel.server.webservices.ExcelService service = new com.microsoft.schemas.office.excel.server.webservices.ExcelService();
com.microsoft.schemas.office.excel.server.webservices.ExcelServiceSoap port = service.getExcelServiceSoap12();
// TODO initialize WS operation arguments here
java.lang.String sheetName = &quot;Sheet1&quot;;
java.lang.String rangeName = &quot;Sales&quot;;
java.lang.Object cellValue = new Integer(1000000);
// TODO process result here
com.microsoft.schemas.office.excel.server.webservices.ArrayOfStatus result = port.setCellA1(sessionId, sheetName, rangeName, cellValue);
System.out.println(&quot;Result = &quot;+result);
} catch (Exception ex) {
// TODO handle custom exceptions here
}

try { // Call Web Service Operation
com.microsoft.schemas.office.excel.server.webservices.ExcelService service = new com.microsoft.schemas.office.excel.server.webservices.ExcelService();
com.microsoft.schemas.office.excel.server.webservices.ExcelServiceSoap port = service.getExcelServiceSoap12();
// TODO initialize WS operation arguments here
java.lang.String sheetName = &quot;Sheet1&quot;;
java.lang.String rangeName = &quot;Costs&quot;;
java.lang.Object cellValue = new Integer(860000);
// TODO process result here
com.microsoft.schemas.office.excel.server.webservices.ArrayOfStatus result = port.setCellA1(sessionId, sheetName, rangeName, cellValue);
System.out.println(&quot;Result = &quot;+result);
} catch (Exception ex) {
// TODO handle custom exceptions here
}

/*
* You also now need to explicitly call calc on the spreadsheet, so your updates now have an outcome.
*/
try { // Call Web Service Operation
com.microsoft.schemas.office.excel.server.webservices.ExcelService service = new com.microsoft.schemas.office.excel.server.webservices.ExcelService();
com.microsoft.schemas.office.excel.server.webservices.ExcelServiceSoap port = service.getExcelServiceSoap12();
// TODO initialize WS operation arguments here
com.microsoft.schemas.office.excel.server.webservices.CalculateType calculateType = null;
// TODO process result here
com.microsoft.schemas.office.excel.server.webservices.ArrayOfStatus result = port.calculateWorkbook(sessionId, calculateType);
System.out.println(&quot;Result = &quot;+result);
} catch (Exception ex) {
// TODO handle custom exceptions here
}

/*
* Now read the result, from a named cell.  In this case, we use its excel generated name of C4 (not like the cell settings
*/
try { // Call Web Service Operation
com.microsoft.schemas.office.excel.server.webservices.ExcelService service = new com.microsoft.schemas.office.excel.server.webservices.ExcelService();
com.microsoft.schemas.office.excel.server.webservices.ExcelServiceSoap port = service.getExcelServiceSoap12();
// TODO initialize WS operation arguments here
java.lang.String sheetName = &quot;Sheet1&quot;;
java.lang.String rangeName = &quot;C4&quot;;
boolean formatted = false;
javax.xml.ws.Holder&lt;java.lang.Object&gt; getCellA1Result = new javax.xml.ws.Holder&lt;java.lang.Object&gt;();
javax.xml.ws.Holder&lt;com.microsoft.schemas.office.excel.server.webservices.ArrayOfStatus&gt; status = new javax.xml.ws.Holder&lt;com.microsoft.schemas.office.excel.server.webservices.ArrayOfStatus&gt;();
port.getCellA1(sessionId, sheetName, rangeName, formatted, getCellA1Result, status);

System.out.println(&quot;\n******\nResult:&quot; + getCellA1Result.value + &quot;\n********&quot;);
} catch (Exception ex) {
// TODO handle custom exceptions here
}

/*
* And Close
*/
try { // Call Web Service Operation
com.microsoft.schemas.office.excel.server.webservices.ExcelService service = new com.microsoft.schemas.office.excel.server.webservices.ExcelService();
com.microsoft.schemas.office.excel.server.webservices.ExcelServiceSoap port = service.getExcelServiceSoap12();
// TODO initialize WS operation arguments here
// TODO process result here
com.microsoft.schemas.office.excel.server.webservices.ArrayOfStatus result = port.closeWorkbook(sessionId);
System.out.println(&quot;Closed workbook&quot;);
} catch (Exception ex) {
// TODO handle custom exceptions here
}

}
}
</pre>
<div style="border-width: 1px;">
<div>
<pre>
And here is the WSDL that MOSS generates (you should use the one your site has generated, not this one!)
<pre class="brush: xml">
&lt;wsdl:definitions xmlns:soap=&quot;http://schemas.xmlsoap.org/wsdl/soap/&quot; 

xmlns:tm=&quot;http://microsoft.com/wsdl/mime/textMatching/&quot; 

xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xmlns:mime=&quot;http://schemas.xmlsoap.org/wsdl/mime/&quot; 

xmlns:tns=&quot;http://schemas.microsoft.com/office/excel/server/webservices&quot; 

xmlns:s=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns:soap12=&quot;http://schemas.xmlsoap.org/wsdl/soap12/&quot; 

xmlns:http=&quot;http://schemas.xmlsoap.org/wsdl/http/&quot; 

targetNamespace=&quot;http://schemas.microsoft.com/office/excel/server/webservices&quot; 

xmlns:wsdl=&quot;http://schemas.xmlsoap.org/wsdl/&quot;&gt;
 &lt;wsdl:types&gt;
 &lt;s:schema elementFormDefault=&quot;qualified&quot; 

targetNamespace=&quot;http://schemas.microsoft.com/office/excel/server/webservices&quot;&gt;
 &lt;s:element name=&quot;GetApiVersion&quot;&gt;
 &lt;s:complexType /&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;GetApiVersionResponse&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;GetApiVersionResult&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:complexType name=&quot;ArrayOfStatus&quot;&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;unbounded&quot; name=&quot;Status&quot; nillable=&quot;true&quot; type=&quot;tns:Status&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;s:complexType name=&quot;Status&quot;&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;Name&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;Severity&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;Message&quot; type=&quot;s:string&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;s:element name=&quot;OpenWorkbook&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;workbookPath&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;uiCultureName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;dataCultureName&quot; type=&quot;s:string&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;OpenWorkbookResponse&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;OpenWorkbookResult&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;CloseWorkbook&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;CloseWorkbookResponse&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;Refresh&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;connectionName&quot; type=&quot;s:string&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;RefreshResponse&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;Calculate&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sheetName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;rangeCoordinates&quot; type=&quot;tns:RangeCoordinates&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:complexType name=&quot;RangeCoordinates&quot;&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;Row&quot; type=&quot;s:int&quot; /&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;Column&quot; type=&quot;s:int&quot; /&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;Height&quot; type=&quot;s:int&quot; /&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;Width&quot; type=&quot;s:int&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;s:element name=&quot;CalculateResponse&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;CalculateA1&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sheetName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;rangeName&quot; type=&quot;s:string&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;CalculateA1Response&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;GetRange&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sheetName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;rangeCoordinates&quot; type=&quot;tns:RangeCoordinates&quot; /&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;formatted&quot; type=&quot;s:boolean&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;GetRangeResponse&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;GetRangeResult&quot; type=&quot;tns:ArrayOfAnyType&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:complexType name=&quot;ArrayOfAnyType&quot;&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;unbounded&quot; name=&quot;anyType&quot; nillable=&quot;true&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;s:complexType name=&quot;TypeExporter&quot;&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;CellError&quot; type=&quot;tns:CellError&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;s:simpleType name=&quot;CellError&quot;&gt;
 &lt;s:restriction base=&quot;s:string&quot;&gt;
 &lt;s:enumeration value=&quot;Div0&quot; /&gt;
 &lt;s:enumeration value=&quot;NA&quot; /&gt;
 &lt;s:enumeration value=&quot;Name&quot; /&gt;
 &lt;s:enumeration value=&quot;Null&quot; /&gt;
 &lt;s:enumeration value=&quot;Num&quot; /&gt;
 &lt;s:enumeration value=&quot;Ref&quot; /&gt;
 &lt;s:enumeration value=&quot;Value&quot; /&gt;
 &lt;/s:restriction&gt;
 &lt;/s:simpleType&gt;
 &lt;s:element name=&quot;GetRangeA1&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sheetName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;rangeName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;formatted&quot; type=&quot;s:boolean&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;GetRangeA1Response&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;GetRangeA1Result&quot; type=&quot;tns:ArrayOfAnyType&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;GetCell&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sheetName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;row&quot; type=&quot;s:int&quot; /&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;column&quot; type=&quot;s:int&quot; /&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;formatted&quot; type=&quot;s:boolean&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;GetCellResponse&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;GetCellResult&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;GetCellA1&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sheetName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;rangeName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;formatted&quot; type=&quot;s:boolean&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;GetCellA1Response&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;GetCellA1Result&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;SetRange&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sheetName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;rangeCoordinates&quot; type=&quot;tns:RangeCoordinates&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;rangeValues&quot; type=&quot;tns:ArrayOfAnyType&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;SetRangeResponse&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;SetRangeA1&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sheetName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;rangeName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;rangeValues&quot; type=&quot;tns:ArrayOfAnyType&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;SetRangeA1Response&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;SetCell&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sheetName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;row&quot; type=&quot;s:int&quot; /&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;column&quot; type=&quot;s:int&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;cellValue&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;SetCellResponse&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;SetCellA1&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sheetName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;rangeName&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;cellValue&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;SetCellA1Response&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;CalculateWorkbook&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;calculateType&quot; type=&quot;tns:CalculateType&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:simpleType name=&quot;CalculateType&quot;&gt;
 &lt;s:restriction base=&quot;s:string&quot;&gt;
 &lt;s:enumeration value=&quot;Recalculate&quot; /&gt;
 &lt;s:enumeration value=&quot;CalculateFull&quot; /&gt;
 &lt;/s:restriction&gt;
 &lt;/s:simpleType&gt;
 &lt;s:element name=&quot;CalculateWorkbookResponse&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;GetSessionInformation&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;GetSessionInformationResponse&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;serverVersion&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;uiCultureNameUsed&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;dataCultureNameUsed&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;CancelRequest&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;CancelRequestResponse&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:element name=&quot;GetWorkbook&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;sessionId&quot; type=&quot;s:string&quot; /&gt;
 &lt;s:element minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; name=&quot;workbookType&quot; type=&quot;tns:WorkbookType&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;s:simpleType name=&quot;WorkbookType&quot;&gt;
 &lt;s:restriction base=&quot;s:string&quot;&gt;
 &lt;s:enumeration value=&quot;FullWorkbook&quot; /&gt;
 &lt;s:enumeration value=&quot;FullSnapshot&quot; /&gt;
 &lt;s:enumeration value=&quot;PublishedItemsSnapshot&quot; /&gt;
 &lt;/s:restriction&gt;
 &lt;/s:simpleType&gt;
 &lt;s:element name=&quot;GetWorkbookResponse&quot;&gt;
 &lt;s:complexType&gt;
 &lt;s:sequence&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;GetWorkbookResult&quot; type=&quot;s:base64Binary&quot; /&gt;
 &lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;status&quot; type=&quot;tns:ArrayOfStatus&quot; /&gt;
 &lt;/s:sequence&gt;
 &lt;/s:complexType&gt;
 &lt;/s:element&gt;
 &lt;/s:schema&gt;
 &lt;/wsdl:types&gt;
 &lt;wsdl:message name=&quot;GetApiVersionSoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:GetApiVersion&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;GetApiVersionSoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:GetApiVersionResponse&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;OpenWorkbookSoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:OpenWorkbook&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;OpenWorkbookSoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:OpenWorkbookResponse&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;CloseWorkbookSoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:CloseWorkbook&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;CloseWorkbookSoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:CloseWorkbookResponse&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;RefreshSoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:Refresh&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;RefreshSoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:RefreshResponse&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;CalculateSoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:Calculate&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;CalculateSoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:CalculateResponse&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;CalculateA1SoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:CalculateA1&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;CalculateA1SoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:CalculateA1Response&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;GetRangeSoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:GetRange&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;GetRangeSoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:GetRangeResponse&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;GetRangeA1SoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:GetRangeA1&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;GetRangeA1SoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:GetRangeA1Response&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;GetCellSoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:GetCell&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;GetCellSoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:GetCellResponse&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;GetCellA1SoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:GetCellA1&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;GetCellA1SoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:GetCellA1Response&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;SetRangeSoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:SetRange&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;SetRangeSoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:SetRangeResponse&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;SetRangeA1SoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:SetRangeA1&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;SetRangeA1SoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:SetRangeA1Response&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;SetCellSoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:SetCell&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;SetCellSoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:SetCellResponse&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;SetCellA1SoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:SetCellA1&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;SetCellA1SoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:SetCellA1Response&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;CalculateWorkbookSoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:CalculateWorkbook&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;CalculateWorkbookSoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:CalculateWorkbookResponse&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;GetSessionInformationSoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:GetSessionInformation&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;GetSessionInformationSoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:GetSessionInformationResponse&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;CancelRequestSoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:CancelRequest&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;CancelRequestSoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:CancelRequestResponse&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;GetWorkbookSoapIn&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:GetWorkbook&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:message name=&quot;GetWorkbookSoapOut&quot;&gt;
 &lt;wsdl:part name=&quot;parameters&quot; element=&quot;tns:GetWorkbookResponse&quot; /&gt;
 &lt;/wsdl:message&gt;
 &lt;wsdl:portType name=&quot;ExcelServiceSoap&quot;&gt;
 &lt;wsdl:operation name=&quot;GetApiVersion&quot;&gt;
 &lt;wsdl:input message=&quot;tns:GetApiVersionSoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:GetApiVersionSoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;OpenWorkbook&quot;&gt;
 &lt;wsdl:input message=&quot;tns:OpenWorkbookSoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:OpenWorkbookSoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;CloseWorkbook&quot;&gt;
 &lt;wsdl:input message=&quot;tns:CloseWorkbookSoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:CloseWorkbookSoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;Refresh&quot;&gt;
 &lt;wsdl:input message=&quot;tns:RefreshSoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:RefreshSoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;Calculate&quot;&gt;
 &lt;wsdl:input message=&quot;tns:CalculateSoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:CalculateSoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;CalculateA1&quot;&gt;
 &lt;wsdl:input message=&quot;tns:CalculateA1SoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:CalculateA1SoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetRange&quot;&gt;
 &lt;wsdl:input message=&quot;tns:GetRangeSoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:GetRangeSoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetRangeA1&quot;&gt;
 &lt;wsdl:input message=&quot;tns:GetRangeA1SoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:GetRangeA1SoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetCell&quot;&gt;
 &lt;wsdl:input message=&quot;tns:GetCellSoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:GetCellSoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetCellA1&quot;&gt;
 &lt;wsdl:input message=&quot;tns:GetCellA1SoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:GetCellA1SoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;SetRange&quot;&gt;
 &lt;wsdl:input message=&quot;tns:SetRangeSoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:SetRangeSoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;SetRangeA1&quot;&gt;
 &lt;wsdl:input message=&quot;tns:SetRangeA1SoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:SetRangeA1SoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;SetCell&quot;&gt;
 &lt;wsdl:input message=&quot;tns:SetCellSoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:SetCellSoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;SetCellA1&quot;&gt;
 &lt;wsdl:input message=&quot;tns:SetCellA1SoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:SetCellA1SoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;CalculateWorkbook&quot;&gt;
 &lt;wsdl:input message=&quot;tns:CalculateWorkbookSoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:CalculateWorkbookSoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetSessionInformation&quot;&gt;
 &lt;wsdl:input message=&quot;tns:GetSessionInformationSoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:GetSessionInformationSoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;CancelRequest&quot;&gt;
 &lt;wsdl:input message=&quot;tns:CancelRequestSoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:CancelRequestSoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetWorkbook&quot;&gt;
 &lt;wsdl:input message=&quot;tns:GetWorkbookSoapIn&quot; /&gt;
 &lt;wsdl:output message=&quot;tns:GetWorkbookSoapOut&quot; /&gt;
 &lt;/wsdl:operation&gt;
 &lt;/wsdl:portType&gt;
 &lt;wsdl:binding name=&quot;ExcelServiceSoap&quot; type=&quot;tns:ExcelServiceSoap&quot;&gt;
 &lt;soap:binding transport=&quot;http://schemas.xmlsoap.org/soap/http&quot; /&gt;
 &lt;wsdl:operation name=&quot;GetApiVersion&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/GetApiVersion&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;OpenWorkbook&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/OpenWorkbook&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;CloseWorkbook&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/CloseWorkbook&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;Refresh&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/Refresh&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;Calculate&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/Calculate&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;CalculateA1&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/CalculateA1&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetRange&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/GetRange&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetRangeA1&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/GetRangeA1&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetCell&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/GetCell&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetCellA1&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/GetCellA1&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;SetRange&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/SetRange&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;SetRangeA1&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/SetRangeA1&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;SetCell&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/SetCell&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;SetCellA1&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/SetCellA1&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;CalculateWorkbook&quot;&gt;
 &lt;soap:operation 

soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/CalculateWorkbook&quot; style=&quot;document&quot; 

/&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetSessionInformation&quot;&gt;
 &lt;soap:operation 

soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/GetSessionInformation&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;CancelRequest&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/CancelRequest&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetWorkbook&quot;&gt;
 &lt;soap:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/GetWorkbook&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;/wsdl:binding&gt;
 &lt;wsdl:binding name=&quot;ExcelServiceSoap12&quot; type=&quot;tns:ExcelServiceSoap&quot;&gt;
 &lt;soap12:binding transport=&quot;http://schemas.xmlsoap.org/soap/http&quot; /&gt;
 &lt;wsdl:operation name=&quot;GetApiVersion&quot;&gt;
 &lt;soap12:operation 

soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/GetApiVersion&quot; style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;OpenWorkbook&quot;&gt;
 &lt;soap12:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/OpenWorkbook&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;CloseWorkbook&quot;&gt;
 &lt;soap12:operation 

soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/CloseWorkbook&quot; style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;Refresh&quot;&gt;
 &lt;soap12:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/Refresh&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;Calculate&quot;&gt;
 &lt;soap12:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/Calculate&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;CalculateA1&quot;&gt;
 &lt;soap12:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/CalculateA1&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetRange&quot;&gt;
 &lt;soap12:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/GetRange&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetRangeA1&quot;&gt;
 &lt;soap12:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/GetRangeA1&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetCell&quot;&gt;
 &lt;soap12:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/GetCell&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetCellA1&quot;&gt;
 &lt;soap12:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/GetCellA1&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;SetRange&quot;&gt;
 &lt;soap12:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/SetRange&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;SetRangeA1&quot;&gt;
 &lt;soap12:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/SetRangeA1&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;SetCell&quot;&gt;
 &lt;soap12:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/SetCell&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;SetCellA1&quot;&gt;
 &lt;soap12:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/SetCellA1&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;CalculateWorkbook&quot;&gt;
 &lt;soap12:operation 

soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/CalculateWorkbook&quot; style=&quot;document&quot; 

/&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetSessionInformation&quot;&gt;
 &lt;soap12:operation 

soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/GetSessionInformation&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;CancelRequest&quot;&gt;
 &lt;soap12:operation 

soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/CancelRequest&quot; style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;wsdl:operation name=&quot;GetWorkbook&quot;&gt;
 &lt;soap12:operation soapAction=&quot;http://schemas.microsoft.com/office/excel/server/webservices/GetWorkbook&quot; 

style=&quot;document&quot; /&gt;
 &lt;wsdl:input&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:input&gt;
 &lt;wsdl:output&gt;
 &lt;soap12:body use=&quot;literal&quot; /&gt;
 &lt;/wsdl:output&gt;
 &lt;/wsdl:operation&gt;
 &lt;/wsdl:binding&gt;
 &lt;wsdl:service name=&quot;ExcelService&quot;&gt;
 &lt;wsdl:port name=&quot;ExcelServiceSoap&quot; binding=&quot;tns:ExcelServiceSoap&quot;&gt;
 &lt;soap:address location=&quot;http://win-0v6f2x2aun4:32089/sites/testsite/_vti_bin/ExcelService.asmx&quot; /&gt;
 &lt;/wsdl:port&gt;
 &lt;wsdl:port name=&quot;ExcelServiceSoap12&quot; binding=&quot;tns:ExcelServiceSoap12&quot;&gt;
 &lt;soap12:address location=&quot;http://win-0v6f2x2aun4:32089/sites/testsite/_vti_bin/ExcelService.asmx&quot; /&gt;
 &lt;/wsdl:port&gt;
 &lt;/wsdl:service&gt;
&lt;/wsdl:definitions&gt;
</pre>
</pre>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blogs.herod.net/steven/archives/374/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The National Broadband Network &#8211; my thoughts (#nbn)</title>
		<link>http://blogs.herod.net/steven/archives/367</link>
		<comments>http://blogs.herod.net/steven/archives/367#comments</comments>
		<pubDate>Wed, 08 Apr 2009 07:08:49 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blogs.herod.net/steven/?p=367</guid>
		<description><![CDATA[The Australian Federal Government has announced a $43 billion, 8 year plan to roll out fiber optic broadband to 90% of Australians, offering speeds up to 100Mbps to the homes and business of those within reach of the roll out. I think by any measure this is a significant event and one that will benefit Australia&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>The Australian Federal Government has announced a $43 billion, 8 year plan to roll out fiber optic broadband to 90% of Australians, offering speeds up to 100Mbps to the homes and business of those within reach of the roll out.</p>
<p>I think by any measure this is a significant event and one that will benefit Australia&#8217;s economy, it&#8217;s environment and social fabric.  The plan however, has its detractors, and to my mind, some of the criticism borders on the bizzare.</p>
<p>Here are some of the arguments I&#8217;ve heard in the past 48 hours:</p>
<p><strong>1. Australia is too large for it to be economically viable.</strong></p>
<p>Australia is undoubtably a vast country, but when you consider we seem to have been successful in rolling out and sustaining roads, plumbing, power cables and copper phone networks over similar distances one wonders why there is a perceived difference with a few centimeters width of fibre optic cable..  I view fiber to the home as pretty much the same kind of basic utility &#8211; and compared to running railway track cross 2000KM of rivers, desert and mountains it should be significantly less impact, cost and effort.</p>
<p><strong>2. It will be too expensive for people to use.</strong></p>
<p>Prices quoted are in the order of $80/$90 per month &#8211; and yes, for many people, that&#8217;s alot of money, but I think it needs to be put into context, most users of home telephony pay similar amounts for line rental and very basic ADSL (and this network would supplant both).  Additionally, a mere 10 years ago I paid up to $5 an hour for internet access!  Finally, $80 a month is approximate to the charges levied for NextG wireless net from Telstra &#8211; the main alternative suggested to rolling out fiber.</p>
<p><strong>3. Wireless is cheaper / faster option</strong></p>
<p>Not for mere mortals.  Additionally wireless may be theoretically fast, but my experience with wireless broadband is highly variable &#8211; and members of my family regularly have to roam their house looking for a good reception spot.  Speeds rarely reach the theoretical maximums quoted in press releases.  It may get faster, but 5x faster and with always on, trust with your life reliability?  I remain unconvinced.</p>
<p><strong>4. We don&#8217;t need it.</strong></p>
<p>This is the category I least understand.  This one seems to be from people who email once a week or who think the Internet is solely for Facebook.  Maybe its hard for people to imagine the kind of things this kind of bandwidth enables, but off the top of my head, here are some of the things the network would support:</p>
<ul>
<li>Widespread telecommuting.  100Mbps is LAN speeds, this will make telecommuting a viable occurrence for not just the few, but any kind of information worker.  This could have a significant impact on greenhouse gas emissions and the centralized nature of our cities.</li>
<li>High Definition video communication (and crystal clear voice).  No more distorted telephone calls, less travel and fewer flights, closer connections with distant work mates, business partners, family and friends.</li>
<li>Pervasive Tele-medicine, Real time, high resolution medical imaging and remote diagnosis.</li>
<li>Video on Demand, The availability of subscriber specific IP TV will blow open digital media consumption.</li>
<li>The end of physical delivery of electronic goods (and subsequent transport, packaging, storage and cost).</li>
</ul>
<p>It must be recognized that most of these  things can be done now (and are being done), but often with specialized equipment and sometimes at great expense. What this network makes possible is that these services will become utterly pervasive &#8211; and it is this pervasiveness where the impact lies.  <strong>When everybody is connected it will change the way Australia work, plays and communicates </strong>- and this will be as significant to our economy, our cities, our lives and our society as the advent of electricity.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.herod.net/steven/archives/367/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Why the Wiki </title>
		<link>http://blogs.herod.net/steven/archives/364</link>
		<comments>http://blogs.herod.net/steven/archives/364#comments</comments>
		<pubDate>Wed, 01 Apr 2009 22:35:28 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blogs.herod.net/steven/?p=364</guid>
		<description><![CDATA[I wrote this for a colleague, but here it is for the world.  (At least I think I wrote it &#8211; it was a long time ago!) Why the Wiki? Typical challenges It has always been a significant issue for large groups of people to successfully handle the creation, classification and discoverable storage of information. [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>I wrote this for a colleague, but here it is for the world.  (At least I think I wrote it &#8211; it was a long time ago!)</p></blockquote>
<h1>Why the Wiki?</h1>
<h2><a name="WhytheWiki-Typicalchallenges"></a>Typical challenges</h2>
<p>It has always been a significant issue for large groups of  people to successfully handle the creation, classification and discoverable  storage of information.</p>
<p>The barriers for to creating information  are many:</p>
<ul>
<li>Getting staff to spontaneously document day to day procedures and outcomes  is often difficult.</li>
<li>Staff are often frustrated by overly ornate requirements when creating  information and feel efforts are wasted because their work cannot later be found  by their peers.</li>
<li>Most people don&#8217;t have the time or the confidence to repeatedly publicize  their work to peers or to distribute the information outside of their  organisational area.</li>
<li>What is created is often hidden in directories which are not widely known or  frequently accessed.<br />
Information creation can be <strong>compelled</strong> by procedure and <strong>regulated</strong> by process and thus it can become more likely  to be created and managed.<br />
However, as organisational structure  and personnel change over time, large quantities of valuable formal  documentation are lost in forgotten locations and the organisation is condemned  to re-learn, or re-document.</li>
</ul>
<h2></h2>
<h2>Typical <em>response</em></h2>
<p>The classic method of organising documentation is to use a  hierarchical structure based on a shared location using common office  productivity tools such as MS Word or MS Excel.<br />
Hierarchical  structures provide a mechanism by which large quantities of information can be  structured into categories, with each branch offers a greater specialisation of  its parent.</p>
<p>It can be argued that this structure however is more a  function of the tools at hand since nested directory structures are a  fundamental component of personal computing data management. It is no surprise  then that this mechanism has become the dominant method for information storage.</p>
<p>The weakness of this approach is thus:</p>
<ul>
<li>Not all information fits solely within a single category,</li>
<li>Categories require the development of an ontology, and its communication and  training.</li>
<li>The same category names are rarely shared by many parties</li>
</ul>
<h2></h2>
<h2>An alternative response</h2>
<p>In contrast to hierarchical directory structures is the concept  of hyper linking, a method popularised in the World Wide Web.</p>
<p>The  value of hyperlinking, when combined with a co-operative web creation  environment results in a Wiki. A Wiki, (meaning Hawaiian for &#8216;Quickly&#8217;) has been  described as:</p>
<p>&#8220;A solution that values information creation and  cooperation over control and categorisation&#8221;</p>
<p>Wiki&#8217;s offer several  advantages over traditional methods of creating and managing information.</p>
<ul>
<li>The wiki allows arbitrary relationships between information.
<ul>
<li>A wiki page can be linked to any other wiki page, website or file system  resource, allowing associates to be made between topics.</li>
</ul>
</li>
<li>All content on the the Wiki is version controlled.
<ul>
<li>All wiki content, both wiki pages and attachments are version controlled,  allowing you to see the when, who and what of change. Version control also  allows the roll back of unwanted change and the recovery of deleted information</li>
</ul>
</li>
<li>All content on the wiki is time-stamped
<ul>
<li>All changes to the wiki are time-stamped, so the exact time of change is  known.</li>
</ul>
</li>
<li>All content is associated with specific authors.
<ul>
<li>If configured to do so, all content is associated with an authenticated  owner.</li>
</ul>
</li>
<li>The wiki is searchable
<ul>
<li>All content, including attachments, is regularly indexed by the wiki&#8217;s  inbuilt search engine, allowing relevant content to be discovered by search.</li>
</ul>
</li>
<li>The wiki can be restricted
<ul>
<li>The creation and viewing of information can be restricted down to the page  label specific groups or individuals and by the categories of creation, editing  and deletion</li>
</ul>
</li>
<li>The wiki can store any arbitrary file as an attachment
<ul>
<li>Some content is not suitable to be transcribed into something as basic as  Wiki page, such data can be attached to the page by file upload</li>
</ul>
</li>
<li>The wiki is web accessible
<ul>
<li>The wiki is accessible in a web browser and does not require (nor have) a  desktop client.</li>
</ul>
</li>
<li>The wiki can be reorganised.
<ul>
<li>Because of the nature of the wiki, barrier to re-organisation is low, with  pages able to be relocated when needs and structure change.</li>
</ul>
</li>
<li>The wiki notifies its users of change.
<ul>
<li>The wiki publicizes change, allowing users visiting to see new and changed  information</li>
</ul>
</li>
<li>The wiki allows you to monitor your content
<ul>
<li>The wiki allows you to establish a watch on content and receive email  notification if it changes.</li>
</ul>
</li>
<li>The wiki can assess the frequency of use
<ul>
<li>The wiki has basic inbuilt statistics that allow you to gauge the frequency  of use of information.<br />
With all these benefits in mind, Wiki&#8217;s do  have some advantages.<br />
Limitations of the wiki</li>
</ul>
</li>
<li>The wiki does not offer complex word processing functionality
<ul>
<li>The Wiki is not an appropriate choice for longer (&gt; 1 page) or complex,  formal documents.</li>
</ul>
</li>
<li>A successful Wiki&#8217;s is as much a point of view as a tool.
<ul>
<li>Successful use of a Wiki is associated with staff understanding the point of  view of &#8216;impulsive&#8217; documentation creation.</li>
</ul>
</li>
<li>Wiki&#8217;s can appear alarming to those unfamiliar with the concept.
<ul>
<li>Most organisational approaches to information emphasis control and  restriction over freedom of action, it can be confronting to some that the  Wiki&#8217;s default point of view is to allow anyone to create or edit (and this  often causes the audit and version control capabilities to be overlooked)</li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blogs.herod.net/steven/archives/364/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IBM to buy Sun, what about Dell?</title>
		<link>http://blogs.herod.net/steven/archives/357</link>
		<comments>http://blogs.herod.net/steven/archives/357#comments</comments>
		<pubDate>Wed, 18 Mar 2009 21:27:19 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blogs.herod.net/steven/?p=357</guid>
		<description><![CDATA[So, the WSJ is reporting that IBM is in talks to acquire Sun Microsystems for 6.5 billion (a considerable premium on its market valuation). Some analysis of the news labeled this story red herring, put out there by Sun to get the scare on the real buyer, I tend to agree. Besides securing Java I [...]]]></description>
			<content:encoded><![CDATA[<p>So, the WSJ is reporting that IBM is in talks to acquire Sun Microsystems for 6.5 billion (a considerable premium on its market valuation).</p>
<p><span>Some analysis of the news labeled this story red herring, put out there by Sun to get the scare on the real buyer, I tend to agree.</span></p>
<p><span>Besides securing Java I don’t understand what IBM gets out of buying Sun.</span></p>
<p><span>IBM would be buying a company who’s stack of software/hardware goes head to head with most of IBM’s existing and well established brands. I can’t see this gives IBM anything but a headache and could confuse IBM customers.</span></p>
<p><span>For IBM, it would be come an issue of ‘How can you push your high end enterprise hardware/software and its pricing structure against a FOSS stack from your new subsidiary’.  Any FUD (Fear, Uncertainty and Doubt) they could spread about Sun’s viability and software capability is immediately compromised and they run the real risk of cannibalizing their own sales across a lot of areas.</span></p>
<p><span>The second possibility it that its an acquisition focussed on killing off Sun for competitive reasons.  Assuming the regulator has no issue with that (which seems unlikely), then its tacit acknowledgement that Sun strategy is working.  If its working well enough that IBM is wanting to spend $6.5 billion to stop it, why would Sun sell out? </span></p>
<p><span>Finally, IBM could be moving to secure Java.  This may only sound practical to Java development community, but with its own JVM and the JDK open sourced most of what I see IBM can bring is their checkbook.  In general spirit, the community is walking, if not running away, from the kind of software ecosystem IBM represents (Eclipse not withstanding) &#8211; and surely they could provide that influence a lot cheaper than the cost of acquiring Sun.</span></p>
<p><strong>What about Dell?</strong></p>
<p><span>A commenter on one article noted that the real buyer could be Dell and on first glance this seems like a more plausible idea.</span></p>
<p><span>Dell is one of the only big names in the desktop/server business which doesn’t have a high end enterprise arm or a software infrastructure stack (the only one I can think of is Lenovo, who I assume still partners strongly with IBM).</span></p>
<p><span>Dell is likely already have a presence in the data centers and offices of Sun’s customers via their Laptop/Desktop/Intel servers. </span></p>
<p><span>Dell gets the opportunity to sell services across the whole of the data center rack with an enterprise server line + processor architecture, a storage array business, an operating system that can take an organization from the desktop to the cloud and a software stack running the gamut from Operating System to Word Processing (And perhaps in emerging markets like China, this matters). </span></p>
<p><span>Sun gets access to a volume sales channel and commodity Intel hardware &#8211; something that their software stack could thrive on.</span></p>
<p><span>Does that seem more logical to you?</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.herod.net/steven/archives/357/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
