Perhaps it has been because I've been out of the loop for a bit, but I've discovered a curious thing lately. Internet Explorer is getting, well ... old, and maybe more than a little decrepit. Kind of like what happens when a large and stately mansion which hasn't been occupied for a while begins to gray, with windows broken here and there, the lush gardens turned weed-strewn and seedy. It slips away from being the palace on the hill to being a high class fixer-upper for someone with more money than sense.
This observation was brought to my attention because I was in the process of putting together a web-based XML editor for a client. I took it as axiomatic that if you wanted to do anything beyond displaying web pages, the only real choice out there was Internet Explorer. Yet after an unfortunate encounter with a virus from a spoofed zip file (actually a PIF ... is there any reason whatsoever why we still need PIFs for anything?) sent from the virused computer of a student of mine, my Internet Explorer didn't work quite right anymore. I couldn't get it to open up new window instances. That was great for pop-ups, admittedly, until I realized that the pop-ups were showing up in memory (with all that nasty viral Javascript code still working its malicious mischief), the windows were just not being displayed.
Before I knew it, something was sitting there on my socket queue, ruining the ability to serve anything complex (even JPEG images would only download to 50% before freezing). Then I tried to REMOVE Internet Explorer. Did you know that you can remove Mozilla, Netscape, Opera, just about every web browser out there ... except for the one that ships with Microsoft. What you get when you attempt to remove it through the "accepted" channels is a sort of Ur browser that's still there, accessible every time you type in a URL from a folder window.
After this, I attempted to reinstall IE, only to be informed that I couldn't install anything on top of the current version, which was apparently internally listed as being several dozen generations in the future. In the end, I spent a day backing up everything from my hard drive, reformatted and installed the latest version of Windows, vowing to be very circumspect around Internet Explorer.
One of my current business clients has a Content Management System that was built, periodically, by people with different visions and different levels of skill, and while it is serviceable enough, it has become a nightmare to maintain. Consequently, I was brought in to re-engineer it. CMS systems are simple in design and maddeningly complex in execution, but they represent a good area for XML people to tackle at least once in their career. One thing I decided to do with it was to revamp the editor and make it more useful for actually working with the markup language that they used. I could have used a stand-alone client, but given the variety of platforms that users were deployed to, I decided to go the web browser route.
My goal was to produce a user interface that has basic similarities to my current favorite XML editor, Oxygen (http://www.oxygenxml.com/). I had first encounted Oxygen when I was playing around with Eclipse, and soon became enamored of it. You can easily assign schemas or DTDs to XML to get full intellisense functionality, you could customize the XSLT engine so that it could easily use third party tools such as Saxon (something that was VERY useful for working with XSLT 2.0), it has a first-class debugger, and it is quite reasonably priced ($79, last I checked). Moreover, it integrates cleanly with Oxygen, and is the first XML tool of any quality that works as well in Linux as it does in Windows.
With that as a model, I set about to create similar function in a browser. My client came back to me approving the design, with the caveat that about a dozen of his writers who would be using the system were using Macintosh laptops, and could I make sure that it would work for them. That complicated the picture a bit. When it was introduced, Internet Explorer for the Macintosh was one of the best browsers out there ... in 1997. Seven years later, its not even close, and most of the functionality that I wanted to have - client side XSLT, web service request pipes, and so forth, didn't even exist there.
Safari, for the Macintosh, is becoming a first class browser, but its still very much a work in progress, with the necessary features for complex application development still at least months if not years in the future. Thus, I started doing some web searching, and noticed a curious thing. Every time I looked for a particular feature on non-IE browsers, onebrowse kept popping up. CSS 2.0 and partial 3.0 compliance, XmlHttpRequest, XSLT, XPath, nodal replacement, DOM support ... ubiquity of platform ... full support for PNGs ... text range support ... hmmmmmmmmm ...
Suppose that you had once been a major player, then you got clobbered by the new kid on the block, forced to watch as everything you'd built up got picked over by creditors until you had wandered into the bad part of town as a ghostlyhas-been. A bottle in one hand, you were on the verge of drinking yourself into oblivion when a kid comes along with his friends, stares at you, and says "You were somebody once, weren't you?"
They help you back onto your feet, get you sobered up and you learn to play by a new set of rules, until the day that you walk back into the stadium owned by that once-New Kid and say "Payback time."
Not Your Father's Mozilla
So it's the the plotline of any number of schmaltzy movies. This could still very well serve as the story of Mozilla, and its younger sibling Firefox. AOL, temporarily bloated with Internet bubble money, managed to buy up media giant Time Warner, and after that picked up the ailing Netscape, pummelled by Microsoft in the browser wars. AOL/Time Warner then preceded to effectively abandon the Netscape browser, firing most of the Netscape Navigator team and then releasing it to what was no dout conceived as oblivion - a team of largely unsupported open source geeks, who were willing to work on it in their spare time.
Picked up from the gutter, the underlying, eight year old Mozilla engine was effectively stripped to the ground and rebuilt, piece by piece, utilizing concepts that had evolved considerably since the first Navigator browser was created. The new engine cleaved closely to the W3C CSS and DOM specifications, though there are some minor distinctions in some of the XML technology that reflect the Microsoft model (including the inclusion of the XMLHttpRequest object, one of the most significant additions to the browser in a long while and one becoming pretty much standard in other browsers as well to the extent that the W3C will likely change the W3C DOM 3.0 specification to reflect this. The rendering model is fast, solid, and modular enough to handle any likely changes to the Recommendations.
More recently, the development from Gecko has split into two forks - the Mozilla 1.7 browser retains much of the characteristics of older Mozilla browsers, and it contains expanded developer functionality -- it is essentially a developer's toolkit. Firefox, on the other hand, is the future of Gecko - lighter-weight, fast, built for XML and for a wide consumer audience. It is in fact the browser that I chose to use for developing the content management system.
Efforts to support SVG are underway, and IBM and Novell have announced that they plan to roll their comprehensive XForms engine technology into the Mozilla code base. This would make Mozilla the first stand-alone browser to support the W3C XForms 1.0 Recommendation, although there are numerous XForms instances of varying degrees of conformance available, including Mozquito DENG, x-port Forms Player, Orbeon Open XML Framework, and the Mobiform SVGView Plus (thanks to Micah Dubinko and his summary page of XForm viewers for this information)..
In many ways, Mozilla 1.7 in particular can be thought of as the antithesis of Internet Explorer in that it attempts to conform as closely as possible to open standards. In addition to the high degree of W3C DOM 2.0 (and 3.0) support and CSS support, it also utilizes the most recent versions of ECMAScript/Javascript through the SpiderMonkey implementation. This in turn means that Mozilla developers can utilize many of the more significant Javascript capabilities, including the Setter/Getter functionality. For instance, you can now do something like this:
Listing 1. The use of Setter/Getter in Javascript (Figure 1)
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script language="Javascript">//<![CDATA[
Object.prototype.data getter = function(){
return parseInt(this.innerHTML);
}
Object.prototype.data setter = function(n) {
if (n >0 && n <= 100){
// empty the element of any previous data.
while (this.childNodes.length){
this.removeChild(this.firstChild);
}
// create a text node with the new value
var newNode=document.createTextNode(String(Math.round(n)));
// and insert it into the reference element:
this.appendChild(newNode);
// return the value as well as a matter of course:
return n;
}
else {
// this throws an exception which an exception handler can catch
throw "Error: Number out of range";
}
}
function increment(value){
if (value == null){value=1;}
var numberHolder=document.getElementById('numberHolder');
// This shows the power of getters and setters
numberHolder.data = numberHolder.data + value;
// This is equivalent:
// numberHolder.data += value;
}
//]]></script>
</head>
<body>
<h1>Setter/Getter</h1>
<p>Click on the plus button to increment by one, the minus button to decrement by one</p>
<div id="numberHolder" style="font-weight:bold;font-size:18pt;background-color:lightBlue;border:inset 3px lightBlue;width:30pt;">95</div>
<input type="button" onclick="increment()" value="+"/>
<input type="button" onclick="increment(-1)" value="-"/>
</body>
</html>
Figure 1. The use of Setter/Getter in Javascript
The setter/getter functionality makes it possible to add "property" interfaces to HTML and Javascript objects so that you interactive with the objects (such as the numberHolder <div> element in Listing 1) by setting or reading those properties. Thus, adding 4 to the numberHolder object becomes as simple as saying:
numberHolder = numberHolder + 4;or even
numberHolder += 4;This also makes possible exception handling - if an attempt is made to set the value of the numberHolder
beyond 99, an exception will be raised.
As someone who has worked extensively with Microsoft Behaviors and the sometimes byzantine XML necessary to make them work, the simplicity of getters/setters, combined with prototyping comes as something of a relief.
Ich Spreche XML
What is a browser? Five years ago, you could reasonably say that a browser was a device to view HTML. However, in mid 2004, XML has been out for nearly seven years, and XHTML has been a standard for five of those. Yet for all of that Internet Explorer is notoriously unfriendly toward XHTML - recognizing neither the XHTML namespace nor even an XHTML prefix. It does recognize the XML stylesheet processing instructions, though PIs in general are being pushed out in favor of namespaces as the preferred way of identifying the functionality of objects. And Internet Explorer has this incredibly annoying tendency of rendering HTML output as non-XML compliant HTML, making it notoriously difficult to process without a huge amount of DOM manipulation work.Mozilla and Firefox are realistically the first true XML-centric browsers. You can view XML as structured (and collapsible) XML trees, though it will also recognize XHTML namespaces, and PI assigned CSS and XSLT stylesheets work fine with XML content.. Work on SVG is proceeding, though it has not yet been folded into the main development fork, and as mentioned previously, XForms support, much more comprehensive XLink and XPointer support exist as well.
>From an application development standpoint, however, it is the other natively supported XML objects that offer such a tantalizing glimpse into the bounds of an XML oriented browser. These are given in Table 1:
Object name
| Description
|
XMLDocument
| Supports the standard W3C DOM Document implementation, and can be extracted from the web page document object.
|
XMLSerializer
| Used for converting XML DOM Documents into either a string or streamed binary serial output.
|
DOMParser
| Converts a stream, file or stream representation of an XML document into an internal DOM Document
|
XSLTProcessor
| Creates an XSLT object that can be used for building transformations
|
XPath Parser
| Performs XPath queries on XML documents.
|
Web Services
| Handles SOAP and WSDL Services
|
XUL/XBL
| These components are useful for adding functionality into the browser itself, and are XML based.
|
Unlike with Microsoft Internet Explorer, these objects are native within the brower, rather than being invoked as ActiveXObjects, so they participate much more fully in the security model of the browser itself. Moreover, they work across Windows, Linux, Unix and the Macintosh, whereas most of the ActiveX-based components are largely confined to Windows. This flexibility makes developing cross platform browser applications much easier.
The XMLDocument object isn't invoked directly, but comes from the document.implementation interface. While this marks a little bit of difference from the IE implementation, it is also something that can effectively be masked with some decent Javascript functions. For instance, the Internet Explorer XML DOM functions xml(), which serializes output to string, and loadXML(), which loads a string representation of an XML file into the dom, can be loaded into such an object (as shown in Listing 2)
Listing 2. DOMExtensionUtils.xml
// Defines XmlDocument.xml as the serialization mechanism
Document.prototype.__defineGetter__("xml",function(){
return (new XMLSerializer()).serializeToString(this);
}
)
// Loads an XML document from a text string
Document.prototype.loadXML = function(s){
var doc2 = (new DOMParser()).parseFromString(s,"text/xml");
while (this.hasChildNodes()){
this.removeChild(this.lastChild);
}
for (var i=0;i != doc2.childNodes.length;i++){
this.appendChild(this.importNode(doc2.childNodes[i],true));
}
}
You can then use the same functions with IE and Mozilla. Assume that you have a <div> element entitled "message", then you could actually load a message into XML and from there generate content:
var xmlDoc = document.implementation.createDocument("","",null);
xmlDoc.loadXML("<h1>A Message</h1><p>This is a message!</p>");
messageDisplay.innerHTML = xmlDoc.xml;
That example is trivial, of course, but illustrates how you could create effective XML services. A more comprehensive situation, though, would be a scenario where you had an XML document on a server containing various messages given by identifying key. As an example of this, consider the errorMessages.xml file (listing 3)::
Listing 3. errorMessage.xml
<messages>
<message code="1000">No information is currently known about this transaction.</message>
<message code="1001">Package appears to be corrupt.</message>
<message code="1002">Package manifest has bad pointer.</message>
<message code="1003">Package date exceeds limit.</message>
</messages>
When a given error condition occurs (here contained in the code attribute), then the appropriate message should be displayed in an error display box on the web page, as shown in Listing 4.
Listing 4. errorMessageXMLText.htm
<html>
<head>
<title>Example II - Error Messages</title>
<script type="text/Javascript">
var messageDisplay=null;
var messageData = document.implementation.createDocument("","",null);
function init(){
// Create a request pipeline to the server
messageDisplay = document.getElementById("messageDisplay");
var pipe=new XMLHttpRequest();
// Retrieve the messagesDocument via a synchronous (false) GET query
pipe.open("GET","errorMessages.xml",false);
pipe.send(null);
// Load the resultant text into the messageData XML "Data Island"
messageData.loadXML(pipe.responseText);
}
function displayMessage(id){
xpath = "messages/message[string(@code) = '"+id+"']/text()";
var res = messageData.evaluate(xpath, messageData, null, 0,null);
node = res.iterateNext();
if (node !=null){
messageDisplay.text = node.nodeValue;
}
}
// Defines XmlDocument.xml as the serialization mechanism
Document.prototype.__defineGetter__("xml",function(){
return (new XMLSerializer()).serializeToString(this);
}
)
// Loads an XML document from a text string
Document.prototype.loadXML = function(s){
var doc2 = (new DOMParser()).parseFromString(s,"text/xml");
while (this.hasChildNodes()){
this.removeChild(this.lastChild);
}
for (var i=0;i != doc2.childNodes.length;i++){
this.appendChild(this.importNode(doc2.childNodes[i],true));
}
}
Object.prototype.text setter = function(str){
while(this.firstChild){
this.removeChild(this.firstChild);
}
var textNode=document.createTextNode(str);
this.appendChild(textNode);
}
Object.prototype.text getter = function(){
return this.firstChild.nodeValue;
}
</script>
</head>
<body onload="init()">
<h1>XML Based Error Messages</h1>
<p>Select an error code to see its corresponding error message</p>
<select id="errorCodeSelector" onchange="displayMessage(this.value)">
<optgroup label="Choose an Error Code">
<option value="1000">Error Code 1000</option>
<option value="1001">Error Code 1001</option>
<option value="1002">Error Code 1002</option>
<option value="1003">Error Code 1003</option>
</optgroup>
</select>
<div><b>Error: </b><span id="messageDisplay"/></div>
</body>
</html>
Listing 4 provides a look at most of the XML based functions (with the exception of XSL Transformations) . Note that there are alternative approaches to many of these functions (such as the use of the load() method instead of the XMLHttpRequest object, but this at least illustrates the general usage of most of the basics.
The code fragment
var pipe=new XMLHttpRequest();
// Retrieve the messagesDocument via a synchronous (false) GET query
pipe.open("GET","errorMessages.xml",false);
pipe.send(null);
// Load the resultant text into the messageData XML "Data Island"
messageData.loadXML(pipe.responseText);
demonstrates the use of the XMLHttpRequest() component, which mirrors most of the same functionality as the Internet Explorer component of the same name. A connection is created with the server address given, using http GET, POST, PUT or similar http commands. By specifying whether you want the connection to be asynchronous (true) or synchronous (false) you can determine how you want to handle the incoming stream of information. The data once retrieved is contained in the responseText property, whichi in this case is reparsed into XML in the messageData variable. This is particularly useful for creating the equivalent of remote data islands within Mozilla or Firefox (creating local data islands will be covered in a subsequent blog).
The evaluate() function serves the same purpose as the selectNodes() and selectNode() function in Internet Explorer - a way to run an XPath expression on an XML document and retrieve the results. This function specifically implements the W3C DOM 3 XPath Interfaces, interfaces which can be confusing without some kind of reference. The evaluate() function itself takes five arguments:
xpath = "messages/message[string(@code) = '"+id+"']/text()";
var res = messageData.evaluate(xpath, messageData, null, 0,null);
with the first containing the XPath expression as a string, the second containing the context node where the XPath expression is evaluated (here the root node of the document), the third a namespace resolver for processing namespaces beyond the default (this will usually be null). The fourth parameter is a constant that can be used to indicate what kind of results should come from the expression, and again should usually be 0 (I'll be covering this more in subsequent blogs). The last parameter contains the variable that should receive the result - if set to null, then the output will be sent to the resulting value from the function. This last is typically used for internal processing with C++, not with Javascript, and consequently should almost invariably be sent to null.
The results of such an XPath expression will usually be an unorderd node set, accessed via the iterateNext() function, where each successive call will return an XML Node:
node = res.iterateNext();
if (node !=null){
messageDisplay.text = node.nodeValue;
}
If multiple nodes had been returned from the query, this could have been replaced with:
while(node = res.iterateNext()!=null)
messageDisplay.text = node.nodeValue;
}
which would have walked through each node in turn.
The Power of the Fox
By making this functionality easily accessible from the DOM, both Mozilla and Firefox open up a number of possibilities for multiplatform web development that was once the exclusive domain of IE on Windows. At the very minimum an interface can be set up that will let you emulate the functionality of IE (though this is also something of a downstep at this stage). If you are working with an intranet, the possibilities that Mozilla and Firefox offer for application development improve dramatically, because you don't have to spend as much time working on backword-compatible code. Given the speed and performance of both of these browsers, I suspect the Fox is likely to give Redmond a serious run for it's money.
I'll be coming back to this topic periodically, in part to discuss the XSLT side of things in greater detail and in part to look at other aspects of the "XML browser" such as intrinsic web services support. As per usually, feel free to use any code that is contained within these blogs, though I would mailto:kurt@kurtcagle.net to let me know how you're using it. Until the next blog, enjoy and keep coding.
69 comments:
IE HAS LEFT THE BUILDING ... SHOULD MOZILLA FOLLOW?Hi Kurt,
Firstly, good to see that not even writers' block can hold a good writer down for long!
On standards/IE/Mozilla and all that stuff - I think it's great to see all of this being discussed.
It's certainly the case that many of the ideas that people in and around the Mozilla project have been talking about for a long time are starting to be discussed more broadly. They devised XBL, and now the SVG community is looking to produce a scaled-down version of it for incorporation into SVG 1.2. In addition, the Mozilla community have strong notions of skinning custom controls, great ideas about using the core technology as an application framework, and underpinning all of this, a healthy commitment to standards. All things that are being discussed in may forums today, and put the Mozilla guys ahead of their time!
But unfortunately things move on. All of these ideas together would have made for a state-of-the-art browser a few years ago, but today they need to be our starting-point, not the goal. In reality, Mozilla's new lease of life is less about new software, and more about 'IE has left the building'. Microsoft achieved what they wanted in the 'browser war', and now they see no reason to continue IE's development.
But that doesn't mean we need to find another monolithic browser to take its place - in fact we need almost the exact opposite!
One of your main points was that having features like DOM 3 XPath built into the browser was better than having them outside. And this is where I would disagree; for formsPlayer we have implemented DOM 3 XPath, DOM 2 Events, the DOM 3 Implementation Registry, XBL, and of course XForms, but all as modules that could be used in any application. We use them from IE, but we could just as easily use them in Mozilla, an accounts application, chat and email clients, Atom editors, and so on.
We focused our attention on these components so that that we could easily extend what formsPlayer can do, but the same logic should apply to Internet Applications more generally.
For example, there is much talk at the moment about Mozilla supporting SVG and XForms. But commendable though this is, when (if?) the work is completed, will we then get support for SSML [1]? And even if we did get that, what would come next? New standards are appearing far quicker than they are being implemented. (In fact, forget implementation! It's three years since XForms in Mozilla was first raised [2] and it's only now underway after a bit of charity from IBM and Novell!)
So the biggest problem is that it just takes too long to implement these things. The Open Source model gives us a poweful organisational approach for adding new standards - developers can work on whatever standards they are interested in, and add their expertise to the core - but it doesn't make up for a weak architecture. And that, I feel, is what is holding us back.
One way to look at this is that contrary to the current consensus, I'd say that the browser is not the foundation of all Internet Applications, but instead is just one IA amongst many. And to build a new generation of IAs, we need a much more nimble architecture than we have.
This debate is surely going to run and run - which is, I feel, a good thing for the progress of software development. So it's good to see you back in action, stimulating debate!
Mark
[1] Speech Synthesis Markup Language (SSML) Version 1.0[2] Bug 97806 - Implement W3C XForms in browser and composerMark Birbeck
http://www.formsPlayer.com/
Mark,
I think your comments are spot on, but it has also been my experience that the most people do not tend to accept new paradigms out of the box - they have to have some form of reference upon which to place a context. Realistically, if you look at future trends - Macromedia's Flex, Microsoft's XAML, SVG/XForms/XBL, even to a lesser extent technologies like Glade, the future of programming is clearly moving toward a (largely) declarative model built around XML as the substrate. One of the challenges in that model is to determine the ratio of declarative vs. imperative programming that provides the most optimal model for application development, and I see this particular debate as being the dominant one in programming circles in the next couple of years.
The concept of the browser itself is an intriguing one, and one that I hardly see as being dead. The distinction is that a "browser" (or user client) is a distinct process that provides a mechanism for the interaction of one or more presentation namespaces. I think this is where Microsoft may have (repeatedly) missed the boat. They assumed that the browser would blend into the operating system and eventually become inextricable from it; however, a browser effectively provides a context that defines a specific "environment". Right now we think of those environments as being web pages, but in point of fact what is a web page but a localized operating system with its own dominant GUI, focus, context, and interconnection. In that respect, if you have multiple browser instances open, you are not that far from having four distinct "operating systems" that each function in some unique way, with only just enough of a framework to shift that context. This will become even more dominant once you do see an XBL model at work. Microsoft made the mistake of assuming that the browser would become less relevant over time (perhaps even to the extent that the shrink-wrapped application client would once again become more dominant than web applications) whereas I see it far more likely that in ten years, the operating system itself will only serve as a very thin shell for hosting multiple browser instances, and the role of the OS, far from becoming more monolithic (which I see in something like WinFS), will instead become atrophied.
When you look at XForms and the associating binding architecture of XBL, XML Events, SVG, etc., these are the predicates necessary to build a "windows manager". The problem with each is that the MVC architecture upon which all this rests is not in fact as easy to comprehend (or implement) as the shallower OOP implementations that exist. XML tends to naturally decompose into an MVC model, while procedural architectures often tend to be too coupled to cleanly break into this model. As a consequence, many, many programmers out there find MVC to be somewhat foreign, and the MVC underpinnings of XForms and XBL to be somewhat arcane as a consequence.
The other problem with XForms is of course the fact that it represents a significant threat to the status quo - XAML would not have even been conceived of if the threat that XForms/XBL/SVG represents had not been perceived early on. The binding model is powerful (I've build several XML binding implementations over the last few years, and for development, maintenance and security such models beat more traditional ones hands down) and if you look at the style/binding models intrinsic to Avalon in particular, there's a lot there that echoes back to XForms, though of course this would never be explicitly admitted.
I have suspected for some time that there are two or three potential states that code architectures can fall into, and by the constraints that exist from those assumptions these states have relatively little in the way of cross-over. XAML will likely prove to be too monolithic in the long run, though there are some very intriguing concepts that play into it, while the ultimate destiny of the W3C model will move toward greater process standardization. The W3C model IS slow, but to be honesty, I think much of this is because many of us are sold upon the idea that new standards should emerge every couple of years because of our exposures with the commercial shrink-wrap software industry. Yet while a lot of Microsoft's technologies are ground-breaking, very few of them have stability to them precisely because they have been designed with the notion that in two or three years a new product with a different logo and marketing fluff will come along to replace the coolest stuff today. I liken it to the notion of buying a cheap off the rack suit manufactured quickly vs. bespoke tailoring- the rack suit will long since be rags by the time the bespoke suit begins to show a minor amount of looseness around a seam. If you view standards not as technological innovation so much as political accomodation, then the speed at which the W3C moves doesn't appear quite so odd.
SVG is at a cusp point now, becoming sufficiently common that it becomes a fairly expected bullet point item on graphical promotional literature. It's also four years old, and even after four years there are only recently a large enough number of different implementations to say that it has become a standard. XForms and XBL won't become integral to the web until 2010 at the earliest, but to believe that the effort is not worth it right now is to miss the whole point - the foundation work NEEDS to happen now, because while I think that open standards almost invariably trump closed ones they generally do not have the huge marketing clout behind them that a Microsoft or Sun can use to promote the technology. To put this into perspective, consider that most of the W3C standards have not been actively promoted; indeed, the rule has almost invariably been that companies will promote every "standard" but the open ones in the hope of locking in a market, yet technologies like XSLT, XPath, SVG, and so forth are inexorably appearing in application because there is the necessity of open (non-proprietary) standards existing in that regard, if only to handle those cases where people don't have the often exhorbitant fees necessary to license a proprietary standard. Free as in beer can be an awfully persuasive selling point, IF the standards themselves are adequate to the task.
Anyway, I agree with you - this is a debate that is far from closed, and I welcome people to continue it. In the end, I think we'll likely significantly re-shape the art of programming in the process.
-- Kurt Cagle
Hey, you have a great blog here!
I have a increase line site traffic web site. It pretty much covers ##Website Promotion## related stuff.
Come and check it out if you get time.
Thought I would try posting to a blog. I have never done this.
Hope I'm doing this right? If I have done anything wrong please let me know.
The only time we have a test before the lesson is in LIFE.
nice site about stripped screw
i been interested in stripped screw for ages now and when i was searching for stuff to do with stripped screw
i came across here your ranked high for stripped screw
Check my site :) stripped screw
I enjoyed reading your blog. There is a lot of useful information about uk search engine in it. We offer Turnkey Websites and Reliable Hosting. We also provide a blogging service that will help your site get indexed fast and keep the search engines visiting your site. Click here for more information about uk search engine.
Thank you
TWP Admin
Hey i got here searching for affiliate program uk
Your sites not too bad!
You got good rankings for them keywords affiliate program uk
I would personally like to ask you to join my site its a forum about making money online , affiliate programs etc... your a good writer , hope to see you there maybe you can learn too how to make extra cash.
Thanks
affiliate program uk
"A friend of mine told me about your blog concerning info on **keyword** and I wanted to post here telling you how impressed I was with the information you have. I also have a web site & blog about **keyword** ,but will specialize in the impact of A/V on sites! Keep up the great work, you are providing a great resource on the Internet here!"business honest honest internet level marketing mlm multi searchwarp.com swa16120.htmbusiness honest honest internet level marketing mlm multi searchwarp.com swa16120.htm
Hey, what a really good free download of mcafee virus protection blog you got here!. I too have a free download of mcafee virus protection related site that I think would be of interest to your readers. Would love your feedback
Hi Kurt,
The Contender was a good read. I've been searching for autosurf click program blogs and came across yours. Even though it was not exact I am always open to new ideas about autosurf click program in any way I can think of. Have a great day :-)
Hey Kurt,
I've been out searching for best autosurf blogs for hours and it was nice to have found yours. Just thought I would check out the post The Contender and come up with ideas for best autosurf. Have a nice day :-)
I look forward to Your visit!
Hi Kurt,
I always like an interesting blog. The Contender caught my attention even if I was looking for get paid online surf blogs. Kind of gets my thoughts moving coming from a different angle about get paid online surf. Hope to check back every now and then. Have a nice day :-)
Hey this blog is not about ftp web hosting. Silly internet bringing me here :-) Funny I have been doing hours of research on ftp web hosting and it brought me to your blog on The Contender. The web plays funny games sometimes. Anyways, I was reading your blog Kurt and I think it is really cool. Keep up the great work.
If you do not mind I will snag your blog and put it in my favorites. I read a ton of stuff on here that interested me. Keep blogging away :-)
adult dating free online personals
adult dating free online personals
Find a date at adult dating free online personals
I love your blog Kurt. How long has it been on-line? Reason I ask is I am doing a ton of work in the area of web hosting company for small business and will probably end up starting a blog of my own. Funny how the internet brought me here when I was doing searches on web hosting company for small business. Oh well, I am glad it did. Keep up the great blogging and I am sure I will visit The Contender again!!
So you need a loan calculator uk
Get a loan calculator uk at Easy Loans UK
All I can say is WOW Kurt. The other half and I just got back from our friends house (well her friends house) and I needed a huge break. I am working on a project right now that is based on web space hosting. I have literally been on-line for 2-3 hours doing research. Even though The Contender really isn’t on the same page as web space hosting I am certainly glad I came across your blog. There are a ton of great view points on this blog. Well I think I can here the kids screaming in the background. I put you in my internet favorites and I will certainly come back and visit. If you want to take a peek at my site you can find me here at web space hosting. I update my site very frequently. Again, great job blogging and I will be back again soon!
What up Kurt! I just finished up a ten hour work day and decided to kick back and do some surfing. So I grabbed myself a drink and stumbled across your blog while doing some research on web hosting shopping cart for a upcoming project I am doing. Well even though The Contender isn’t what I was looking for I really enjoyed reading your blog. Your doing a great job and please keep up the good work. Lots of people do not keep their blogs up to date :0) There are some very interesting view points stated here. Anyways I am going to grab the bull by the horns and continue to plug away at web hosting shopping cart. I have already bookmarked your blog. You many want to visit me at web hosting shopping cart. You never know you might see something you like! Again great job.
I have been on-line searching for hours for information regarding web hosting company for small business and stumbled across your blog during my journey :-) Kurt your blog is really amazing! Keep up the great work. Obviously my search on web hosting company for small business was way off when compared to The Contender and find it funny how it landed me here. The internet is a funny thing. Anyways, great job on your blogging and keep up the good work! I been searching for web hosting company for small business for over 2 hours and needed a break from it. I started reading your blog and really started getting into it.
P.S I will add you to my favorites so I can come back and visit later
P.S.S If you want to bookmark my site I am at web hosting company for small business. You never know you may find some good deals!
I love your blog Kurt. How long has it been on-line? Reason I ask is I am doing a ton of work in the area of web hosting company for small business and will probably end up starting a blog of my own. Funny how the internet brought me here when I was doing searches on web hosting company for small business. Oh well, I am glad it did. Keep up the great blogging and I am sure I will visit The Contender again!!
I love your blog Kurt. How long has it been on-line? Reason I ask is I am doing a ton of work in the area of ftp web hosting and will probably end up starting a blog of my own. Funny how the internet brought me here when I was doing searches on ftp web hosting. Oh well, I am glad it did. Keep up the great blogging and I am sure I will visit The Contender again!!
I love your blog Kurt. How long has it been on-line? Reason I ask is I am doing a ton of work in the area of best web hosting company and will probably end up starting a blog of my own. Funny how the internet brought me here when I was doing searches on best web hosting company. Oh well, I am glad it did. Keep up the great blogging and I am sure I will visit The Contender again!!
Hi Kurt,
Looking for autosurf exchange traffic blogs when I came across yours. Glad I did get a chance to read it. The Contender got me to thinking and came up with a new idea about autosurf exchange traffic. Again I'm glad to have stiopped by. Have a great day :-)
The ultimate internet marketing website is www.TheOnlinePromoters.com
Zijn niet het gemakkelijkste ding om te spreken over, maar zijn waarde het.Best Wishes, Andrea california debt consolidation loan
�Me pregunto qu� informaci�n del blind pimple symptom necesito saber?Good Wishes, Margit blind pimple symptom
Your blog is perfect and nice, we are offering male ejaculation to learn more visit male ejaculation or The Contender http://www.manifestingpower.com/premature-ejaculation.html
male ejaculation http://www.manifestingpower.com/premature-ejaculation.html
Many reputable debt management companies can help you deal with your debt problems. You can work with a credit counsellor to create your own plan to pay off bills.
If your site is of similar interest contact me and link sites.
Debt Resources Services.
Your blog is perfect and nice, we are offering retrogade ejaculation to learn more visit retrogade ejaculation or The Contender http://www.manifestingpower.com/premature-ejaculation.html
retrogade ejaculation http://www.manifestingpower.com/premature-ejaculation.html
Your blog is perfect and nice, we are offering retrogade ejaculation to learn more visit retrogade ejaculation or The Contender http://www.manifestingpower.com/premature-ejaculation.html
retrogade ejaculation http://www.manifestingpower.com/premature-ejaculation.html
Debt elimination services can help consumers who have more debt than they can manage look into options of reducing or negating that debt. When searching for debt elimination, consumers should seek an agency that offers debt counselling and guidance based on an individual's unique circumstance.
If your site is of similar interest contact me and link sites.
Debt Resources Services.
Your blog is perfect and nice, we are offering ejaculation to learn more visit ejaculation or The Contender http://www.manifestingpower.com/premature-ejaculation.html
ejaculation http://www.manifestingpower.com/premature-ejaculation.html
Bloggs are such a wonderful way to plublish ones thoughts. Thanks for letting me visit and leave a comment. Love the theme of your blog Come by my site some time. It's got info penis enlargement related stuff.
This is a excellent blog. Keep it going. I found you while searching for additional penis enlargement. I have a site on additional penis enlargement located here, additional penis enlargement Maybe you can stop by sometime.
Your blog is perfect and nice, we are offering sex problem to learn more visit sex problem or The Contender http://www.manifestingpower.com/premature-ejaculation.html
sex problem http://www.manifestingpower.com/premature-ejaculation.html
I loved your blog.
web site design
While searching for gift basket los angeles I just have not had the best search results. Maybe I need to create my own blog and let others post so I can get better info on gift basket los angeles.
Your blog is perfect and nice, we are offering male ejaculation to learn more visit male ejaculation or The Contender http://www.manifestingpower.com/premature-ejaculation.html
male ejaculation http://www.manifestingpower.com/premature-ejaculation.html
Are you a new jersey web design enthusiast? If so here is a fantastic resource for everything related to things about new jersey web design with information, products, articles and more..Check it out here...http://www.cobbwebdesign.com
Down the rabbit hole of the ever confusing Internet. Blind surfing is how I find most of my favorite sites, including yours. Searching for professional web site development one day, and I found out how to build a tent with thistle... at night! Weird. Thanks and goodnight.
Your blog is perfect and nice, we are offering premature ejaculation help to learn more visit premature ejaculation help or The Contender http://www.manifestingpower.com/premature-ejaculation.html
premature ejaculation help http://www.manifestingpower.com/premature-ejaculation.html
Can't find a site on professional web site development. Always in a rush and I don't know why. The last site I was on was about professional web site development which was okay to read. Your's was better.
Looking for more information on colorado web design ..If so here is a fantastic resource for everything related to colorado web design with information, products, articles and more..Check it out here...http://www.cobbwebdesign.com
Your blog is perfect and nice, we are offering pre ejaculation to learn more visit pre ejaculation or The Contender http://www.manifestingpower.com/premature-ejaculation.html
pre ejaculation http://www.manifestingpower.com/premature-ejaculation.html
Your blog is perfect and nice, we are offering prevent premature ejaculation to learn more visit prevent premature ejaculation or The Contender http://www.manifestingpower.com/premature-ejaculation.html
prevent premature ejaculation http://www.manifestingpower.com/premature-ejaculation.html
The ultimate internet marketing website is www.TheOnlinePromoters.com
Your blog is perfect and nice, we are offering premature ejaculation to learn more visit premature ejaculation or The Contender http://www.manifestingpower.com/premature-ejaculation.html
premature ejaculation http://www.manifestingpower.com/premature-ejaculation.html
I love people. They are so unpredictable, you really never know what you are gonna get the next day or what kind of responses you will receive. Yeah, people can be as unpredictable as Free virtual domain hosting when you least expect it. But you can always predict one thing. Your own reaction. Your own reaction. And that is all I can say about that. Perhaps that is something Forrest Gump might have said.
Free virtual domain hosting
So where do we go from here, my girlfriend says. And you know what I told her? I said to her, I do not know about you, but I am going to search for something about Online mortgage quotes uk and for God sakes, I am going to find it. Then maybe later we can resume this supposed important topic. Sounds like I am real determined, huh? Well, I found it, that site, the one on that thing I was searching days and days before. Yeah, it was perfect. Go peak at it even if the topic sparks your interest at the slightest.
Online mortgage quotes uk
This is a great opportunity. Just push a button 4 times per day and make $1,000's per month within one year.
How many more times can OJ Simpson be in the news for beating up woman or something to do with the female species? I mean, c'mon! I may be a little sarcastic saying this, but why can he not just go try and endorse something like Host multiple domain even if it has nothing to do with rental car agencies or football. That guy just annoys me. He needs to at least get in trouble for something else. Make it interesting man.
Host multiple domain
You ever just looked at someone's smile, whether it was on a picture or just someone in front of you, and it just literally took your mind off whatever you were thinking? The same thing happened to me just today when I got this popup from some site about Islamic mortgage uk. I clicked on it, followed it to the site and went wow, how interesting. Has that ever happened to you?
Islamic mortgage uk
Your blog is perfect and nice, we are offering female ejaculation to learn more visit female ejaculation or The Contender http://www.manifestingpower.com/premature-ejaculation.html
female ejaculation http://www.manifestingpower.com/premature-ejaculation.html
You ever just looked at someone's smile, whether it was on a picture or just someone in front of you, and it just literally took your mind off whatever you were thinking? The same thing happened to me just today when I got this popup from some site about Uk mortgage quotes. I clicked on it, followed it to the site and went wow, how interesting. Has that ever happened to you?
Uk mortgage quotes
Acne or pimples are caused by hormonal changes, wrong food habits and improper skin care. Some Acne remedies are based on herbs and natural ingredients that treat your Acne like magic and help improve the skin disorders.
Link to this site: acne adult care
http://www.acne-faq.info/
Your blog is great,, Here's a subject that may interest you; home loan rate visit http://thehomemortgageguide.com Start planning for the future home loan rate
Thank you for presenting this information, it was entertaining as well as thought provoking and stimulating.
Thank You,
best work from home jobs
Hello,
Had to write to let you know that I found your site very useful to me. Could you please tell me how I could find out more? I�d love it if I could get an RSS feed from your site to mine. Is this possible?
Thanks,
fast make money online
Hello,
I am writing to inform you that your site is very informative. I will continue to visit this site regularly.
Regards,
fast online make money
What are these blogs all about anyway? I was surfing looking for chase mortgage when I ended up here. Back to the relentless searching for chase mortgage.
Santa was looking for mens dating when he realised it was February. I must have too much Vodka over Russia..oh well on with my search for mens dating
take me there mens dating
It's hard to find anything purple for a large dog so guess I'll keep looking.
Thanks, and have a great day!
fast dog recipes
Nicely said!
DR - http://www.surveyearn.biz/PaidSurveys/Work_at_home.html - work at home careers
Best games to play, best strategies to win. User ratings & reviews of top online casinos & pokers with largest bonuses & highest payouts.
I am here because of search results for blogs with a related topic to mine.
Please,accept my congratulations for your excellent work!
I have a bad credit loan personal loan site.
Come and check it out if you get time :-)
Best regards!
Hi
Sorry to intrude but I saw your blog, noticed you have anonymous posting enabled and thought you might be interested in this great search engine optimization tool for your blog and website (if you have one) that a techi mate recommended to me. Apparently it's all the rage in the IT arena.
I am involved in affiliate hosting and I've found the best way of promoting my blogs and websites is The amazing link referral program. Don't worry it is absolutely free to join and you can generate visitors to your site by visiting others. It is really quick and easy to set up and the traffic you generate will help your website increase in google ranking. Give it a go now!!
I have generated amazing traffic from this program - increasing my affiliate sales and cannot recommend this enough. Believe me, if you have tried all the other programs on the market that you have had to pay for then you realise this one is the best - and it's free!!!
Best of luck with the blog!! I hope you get as much out of this program as I have ;-)
What a really great ** adult friend finder** blog! I am bookmarking it right now so I can come back.
I too have a **adult** and **entertainment** blog. It gives people the chance to ** meet** other**adult**s for **free** See great **webcams**, **videos** and **blogs**. Listen to **music** while you meet **adult** **friends**. I hope you'll take a look at it. Thanks!
.
Hi matey
I'm sure it was this blog I was reading a while back where someone was looking for an SEO tool for driving more traffic and get more hits for their website.
Anyway, I was speaking to a techi guy at work who gets to know all the latest stuff and he uses the free Link Referral Program at http://marketingexperts.wordpress.com.
His website on free internet advertising amongst other stuff has seen traffic explode since he started using the Link Referral Program - consequently his affiliate sales commissions and business sales went through the roof PLUS his website increased in google ranking which was an added bonus!!
If anyone else has any good ideas for driving more traffic to blogs/websites then please share with your online business blog buddies. Ta ;-)
home based business
home based business opportunity
internet home based business
home based web business
best home based business
home based business idea
home internet based business opportunity
start home based business
best home based business opportunity
online home based business
income opportunity home based business
legitimate home based business
home based business lead
mlm home based business
starting a home based business
top home based business
christian home based business
home based small business
home based internet marketing business
free home based business
work at home based business opportunity
computer home based business
home based mlm business opportunity
make money home based business
home based business work
home based travel business
easy home based business
serious home based business opportunity
small home based business opportunity
online home based business opportunity
home based business for woman
business opportunity home based work from
work from home based business
new home based business opportunity
start a home based business on the internet
based business business home opportunity
legitimate home based business opportunity
home based sales business
home based jewelry business
best rated home based business
home based franchise opportunity business
successful home based business
home based business opportunity idea
profitable home based business
internet home based business idea
home based business work at home
best home based business idea
home based business opportunity work at home
free home based internet business
home based business tax deduction
top home based business opportunity
home based computer business opportunity
unique home based business opportunity
home based affiliate business
home based business opportunity uk
income opportunity home based business idea
based business home incredible opportunity
based best business home small
starting home based internet business
christian home based business opportunity
home based business merchant account
best home based internet business
based business home network opportunity
home based business marketing
based business home idea latest
home based business review
home based business directory
based business career home opportunity
work at home based internet business
based business home job opportunity
home based business trade secret
best home based business
home based business magazine
home based computer business idea
home based business startup idea
home based business for sale
home based business cash opportunity
home based business web site
most successful home based business
.
Hi all, I found this video and I thougth its funny, enjoy! and remember, Don't worry Be Happy!
http://www.metacafe.com/watch/816706/anti_virus_protection/
Cheers!
Post a Comment